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 FinSpace Public API SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2020-07-13@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-finspace-data)
+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.FinSpaceData](http://hackage.haskell.org/package/amazonka-finspace-data/docs/Amazonka-FinSpaceData.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-finspace-data` 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-finspace-data.cabal b/amazonka-finspace-data.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-finspace-data.cabal
@@ -0,0 +1,147 @@
+cabal-version:      2.2
+name:               amazonka-finspace-data
+version:            2.0
+synopsis:           Amazon FinSpace Public API SDK.
+homepage:           https://github.com/brendanhay/amazonka
+bug-reports:        https://github.com/brendanhay/amazonka/issues
+license:            MPL-2.0
+license-file:       LICENSE
+author:             Brendan Hay
+maintainer:
+  Brendan Hay <brendan.g.hay+amazonka@gmail.com>, Jack Kelly <jack@jackkelly.name>
+
+copyright:          Copyright (c) 2013-2023 Brendan Hay
+category:           AWS
+build-type:         Simple
+extra-source-files:
+  fixture/*.proto
+  fixture/*.yaml
+  README.md
+  src/.gitkeep
+
+description:
+  Derived from API version @2020-07-13@ 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.FinSpaceData.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.FinSpaceData" 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-finspace-data
+
+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.FinSpaceData
+    Amazonka.FinSpaceData.AssociateUserToPermissionGroup
+    Amazonka.FinSpaceData.CreateChangeset
+    Amazonka.FinSpaceData.CreateDataset
+    Amazonka.FinSpaceData.CreateDataView
+    Amazonka.FinSpaceData.CreatePermissionGroup
+    Amazonka.FinSpaceData.CreateUser
+    Amazonka.FinSpaceData.DeleteDataset
+    Amazonka.FinSpaceData.DeletePermissionGroup
+    Amazonka.FinSpaceData.DisableUser
+    Amazonka.FinSpaceData.DisassociateUserFromPermissionGroup
+    Amazonka.FinSpaceData.EnableUser
+    Amazonka.FinSpaceData.GetChangeset
+    Amazonka.FinSpaceData.GetDataset
+    Amazonka.FinSpaceData.GetDataView
+    Amazonka.FinSpaceData.GetExternalDataViewAccessDetails
+    Amazonka.FinSpaceData.GetPermissionGroup
+    Amazonka.FinSpaceData.GetProgrammaticAccessCredentials
+    Amazonka.FinSpaceData.GetUser
+    Amazonka.FinSpaceData.GetWorkingLocation
+    Amazonka.FinSpaceData.Lens
+    Amazonka.FinSpaceData.ListChangesets
+    Amazonka.FinSpaceData.ListDatasets
+    Amazonka.FinSpaceData.ListDataViews
+    Amazonka.FinSpaceData.ListPermissionGroups
+    Amazonka.FinSpaceData.ListPermissionGroupsByUser
+    Amazonka.FinSpaceData.ListUsers
+    Amazonka.FinSpaceData.ListUsersByPermissionGroup
+    Amazonka.FinSpaceData.ResetUserPassword
+    Amazonka.FinSpaceData.Types
+    Amazonka.FinSpaceData.Types.ApiAccess
+    Amazonka.FinSpaceData.Types.ApplicationPermission
+    Amazonka.FinSpaceData.Types.AwsCredentials
+    Amazonka.FinSpaceData.Types.ChangesetErrorInfo
+    Amazonka.FinSpaceData.Types.ChangesetSummary
+    Amazonka.FinSpaceData.Types.ChangeType
+    Amazonka.FinSpaceData.Types.ColumnDataType
+    Amazonka.FinSpaceData.Types.ColumnDefinition
+    Amazonka.FinSpaceData.Types.Credentials
+    Amazonka.FinSpaceData.Types.Dataset
+    Amazonka.FinSpaceData.Types.DatasetKind
+    Amazonka.FinSpaceData.Types.DatasetOwnerInfo
+    Amazonka.FinSpaceData.Types.DatasetStatus
+    Amazonka.FinSpaceData.Types.DataViewDestinationTypeParams
+    Amazonka.FinSpaceData.Types.DataViewErrorInfo
+    Amazonka.FinSpaceData.Types.DataViewStatus
+    Amazonka.FinSpaceData.Types.DataViewSummary
+    Amazonka.FinSpaceData.Types.ErrorCategory
+    Amazonka.FinSpaceData.Types.ExportFileFormat
+    Amazonka.FinSpaceData.Types.IngestionStatus
+    Amazonka.FinSpaceData.Types.LocationType
+    Amazonka.FinSpaceData.Types.PermissionGroup
+    Amazonka.FinSpaceData.Types.PermissionGroupByUser
+    Amazonka.FinSpaceData.Types.PermissionGroupMembershipStatus
+    Amazonka.FinSpaceData.Types.PermissionGroupParams
+    Amazonka.FinSpaceData.Types.ResourcePermission
+    Amazonka.FinSpaceData.Types.S3Location
+    Amazonka.FinSpaceData.Types.SchemaDefinition
+    Amazonka.FinSpaceData.Types.SchemaUnion
+    Amazonka.FinSpaceData.Types.User
+    Amazonka.FinSpaceData.Types.UserByPermissionGroup
+    Amazonka.FinSpaceData.Types.UserStatus
+    Amazonka.FinSpaceData.Types.UserType
+    Amazonka.FinSpaceData.UpdateChangeset
+    Amazonka.FinSpaceData.UpdateDataset
+    Amazonka.FinSpaceData.UpdatePermissionGroup
+    Amazonka.FinSpaceData.UpdateUser
+    Amazonka.FinSpaceData.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-finspace-data-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.FinSpaceData
+    Test.Amazonka.FinSpaceData.Internal
+    Test.Amazonka.Gen.FinSpaceData
+
+  build-depends:
+    , amazonka-core           >=2.0 && <2.1
+    , amazonka-finspace-data
+    , amazonka-test           >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/AssociateUserToPermissionGroup.yaml b/fixture/AssociateUserToPermissionGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/AssociateUserToPermissionGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/AssociateUserToPermissionGroupResponse.proto b/fixture/AssociateUserToPermissionGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/AssociateUserToPermissionGroupResponse.proto
diff --git a/fixture/CreateChangeset.yaml b/fixture/CreateChangeset.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateChangeset.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/CreateChangesetResponse.proto b/fixture/CreateChangesetResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateChangesetResponse.proto
diff --git a/fixture/CreateDataView.yaml b/fixture/CreateDataView.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDataView.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/CreateDataViewResponse.proto b/fixture/CreateDataViewResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDataViewResponse.proto
diff --git a/fixture/CreateDataset.yaml b/fixture/CreateDataset.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDataset.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/CreateDatasetResponse.proto b/fixture/CreateDatasetResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDatasetResponse.proto
diff --git a/fixture/CreatePermissionGroup.yaml b/fixture/CreatePermissionGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreatePermissionGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/CreatePermissionGroupResponse.proto b/fixture/CreatePermissionGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreatePermissionGroupResponse.proto
diff --git a/fixture/CreateUser.yaml b/fixture/CreateUser.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateUser.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/CreateUserResponse.proto b/fixture/CreateUserResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateUserResponse.proto
diff --git a/fixture/DeleteDataset.yaml b/fixture/DeleteDataset.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDataset.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/DeleteDatasetResponse.proto b/fixture/DeleteDatasetResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDatasetResponse.proto
diff --git a/fixture/DeletePermissionGroup.yaml b/fixture/DeletePermissionGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeletePermissionGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/DeletePermissionGroupResponse.proto b/fixture/DeletePermissionGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeletePermissionGroupResponse.proto
diff --git a/fixture/DisableUser.yaml b/fixture/DisableUser.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DisableUser.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/DisableUserResponse.proto b/fixture/DisableUserResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DisableUserResponse.proto
diff --git a/fixture/DisassociateUserFromPermissionGroup.yaml b/fixture/DisassociateUserFromPermissionGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DisassociateUserFromPermissionGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/DisassociateUserFromPermissionGroupResponse.proto b/fixture/DisassociateUserFromPermissionGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DisassociateUserFromPermissionGroupResponse.proto
diff --git a/fixture/EnableUser.yaml b/fixture/EnableUser.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/EnableUser.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/EnableUserResponse.proto b/fixture/EnableUserResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/EnableUserResponse.proto
diff --git a/fixture/GetChangeset.yaml b/fixture/GetChangeset.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetChangeset.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/GetChangesetResponse.proto b/fixture/GetChangesetResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetChangesetResponse.proto
diff --git a/fixture/GetDataView.yaml b/fixture/GetDataView.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetDataView.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/GetDataViewResponse.proto b/fixture/GetDataViewResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetDataViewResponse.proto
diff --git a/fixture/GetDataset.yaml b/fixture/GetDataset.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetDataset.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/GetDatasetResponse.proto b/fixture/GetDatasetResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetDatasetResponse.proto
diff --git a/fixture/GetExternalDataViewAccessDetails.yaml b/fixture/GetExternalDataViewAccessDetails.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetExternalDataViewAccessDetails.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/GetExternalDataViewAccessDetailsResponse.proto b/fixture/GetExternalDataViewAccessDetailsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetExternalDataViewAccessDetailsResponse.proto
diff --git a/fixture/GetPermissionGroup.yaml b/fixture/GetPermissionGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetPermissionGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/GetPermissionGroupResponse.proto b/fixture/GetPermissionGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetPermissionGroupResponse.proto
diff --git a/fixture/GetProgrammaticAccessCredentials.yaml b/fixture/GetProgrammaticAccessCredentials.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetProgrammaticAccessCredentials.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/GetProgrammaticAccessCredentialsResponse.proto b/fixture/GetProgrammaticAccessCredentialsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetProgrammaticAccessCredentialsResponse.proto
diff --git a/fixture/GetUser.yaml b/fixture/GetUser.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetUser.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/GetUserResponse.proto b/fixture/GetUserResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetUserResponse.proto
diff --git a/fixture/GetWorkingLocation.yaml b/fixture/GetWorkingLocation.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetWorkingLocation.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/GetWorkingLocationResponse.proto b/fixture/GetWorkingLocationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetWorkingLocationResponse.proto
diff --git a/fixture/ListChangesets.yaml b/fixture/ListChangesets.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListChangesets.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/ListChangesetsResponse.proto b/fixture/ListChangesetsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListChangesetsResponse.proto
diff --git a/fixture/ListDataViews.yaml b/fixture/ListDataViews.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListDataViews.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/ListDataViewsResponse.proto b/fixture/ListDataViewsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListDataViewsResponse.proto
diff --git a/fixture/ListDatasets.yaml b/fixture/ListDatasets.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListDatasets.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/ListDatasetsResponse.proto b/fixture/ListDatasetsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListDatasetsResponse.proto
diff --git a/fixture/ListPermissionGroups.yaml b/fixture/ListPermissionGroups.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListPermissionGroups.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/ListPermissionGroupsByUser.yaml b/fixture/ListPermissionGroupsByUser.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListPermissionGroupsByUser.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/ListPermissionGroupsByUserResponse.proto b/fixture/ListPermissionGroupsByUserResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListPermissionGroupsByUserResponse.proto
diff --git a/fixture/ListPermissionGroupsResponse.proto b/fixture/ListPermissionGroupsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListPermissionGroupsResponse.proto
diff --git a/fixture/ListUsers.yaml b/fixture/ListUsers.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListUsers.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/ListUsersByPermissionGroup.yaml b/fixture/ListUsersByPermissionGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListUsersByPermissionGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/ListUsersByPermissionGroupResponse.proto b/fixture/ListUsersByPermissionGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListUsersByPermissionGroupResponse.proto
diff --git a/fixture/ListUsersResponse.proto b/fixture/ListUsersResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListUsersResponse.proto
diff --git a/fixture/ResetUserPassword.yaml b/fixture/ResetUserPassword.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ResetUserPassword.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/ResetUserPasswordResponse.proto b/fixture/ResetUserPasswordResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ResetUserPasswordResponse.proto
diff --git a/fixture/UpdateChangeset.yaml b/fixture/UpdateChangeset.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateChangeset.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/UpdateChangesetResponse.proto b/fixture/UpdateChangesetResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateChangesetResponse.proto
diff --git a/fixture/UpdateDataset.yaml b/fixture/UpdateDataset.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateDataset.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/UpdateDatasetResponse.proto b/fixture/UpdateDatasetResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateDatasetResponse.proto
diff --git a/fixture/UpdatePermissionGroup.yaml b/fixture/UpdatePermissionGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdatePermissionGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/UpdatePermissionGroupResponse.proto b/fixture/UpdatePermissionGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdatePermissionGroupResponse.proto
diff --git a/fixture/UpdateUser.yaml b/fixture/UpdateUser.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateUser.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace-api.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/UpdateUserResponse.proto b/fixture/UpdateUserResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateUserResponse.proto
diff --git a/gen/Amazonka/FinSpaceData.hs b/gen/Amazonka/FinSpaceData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData.hs
@@ -0,0 +1,417 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.FinSpaceData
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from API version @2020-07-13@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- The FinSpace APIs let you take actions inside the FinSpace.
+module Amazonka.FinSpaceData
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** AccessDeniedException
+    _AccessDeniedException,
+
+    -- ** ConflictException
+    _ConflictException,
+
+    -- ** InternalServerException
+    _InternalServerException,
+
+    -- ** LimitExceededException
+    _LimitExceededException,
+
+    -- ** ResourceNotFoundException
+    _ResourceNotFoundException,
+
+    -- ** ThrottlingException
+    _ThrottlingException,
+
+    -- ** ValidationException
+    _ValidationException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** AssociateUserToPermissionGroup
+    AssociateUserToPermissionGroup (AssociateUserToPermissionGroup'),
+    newAssociateUserToPermissionGroup,
+    AssociateUserToPermissionGroupResponse (AssociateUserToPermissionGroupResponse'),
+    newAssociateUserToPermissionGroupResponse,
+
+    -- ** CreateChangeset
+    CreateChangeset (CreateChangeset'),
+    newCreateChangeset,
+    CreateChangesetResponse (CreateChangesetResponse'),
+    newCreateChangesetResponse,
+
+    -- ** CreateDataView
+    CreateDataView (CreateDataView'),
+    newCreateDataView,
+    CreateDataViewResponse (CreateDataViewResponse'),
+    newCreateDataViewResponse,
+
+    -- ** CreateDataset
+    CreateDataset (CreateDataset'),
+    newCreateDataset,
+    CreateDatasetResponse (CreateDatasetResponse'),
+    newCreateDatasetResponse,
+
+    -- ** CreatePermissionGroup
+    CreatePermissionGroup (CreatePermissionGroup'),
+    newCreatePermissionGroup,
+    CreatePermissionGroupResponse (CreatePermissionGroupResponse'),
+    newCreatePermissionGroupResponse,
+
+    -- ** CreateUser
+    CreateUser (CreateUser'),
+    newCreateUser,
+    CreateUserResponse (CreateUserResponse'),
+    newCreateUserResponse,
+
+    -- ** DeleteDataset
+    DeleteDataset (DeleteDataset'),
+    newDeleteDataset,
+    DeleteDatasetResponse (DeleteDatasetResponse'),
+    newDeleteDatasetResponse,
+
+    -- ** DeletePermissionGroup
+    DeletePermissionGroup (DeletePermissionGroup'),
+    newDeletePermissionGroup,
+    DeletePermissionGroupResponse (DeletePermissionGroupResponse'),
+    newDeletePermissionGroupResponse,
+
+    -- ** DisableUser
+    DisableUser (DisableUser'),
+    newDisableUser,
+    DisableUserResponse (DisableUserResponse'),
+    newDisableUserResponse,
+
+    -- ** DisassociateUserFromPermissionGroup
+    DisassociateUserFromPermissionGroup (DisassociateUserFromPermissionGroup'),
+    newDisassociateUserFromPermissionGroup,
+    DisassociateUserFromPermissionGroupResponse (DisassociateUserFromPermissionGroupResponse'),
+    newDisassociateUserFromPermissionGroupResponse,
+
+    -- ** EnableUser
+    EnableUser (EnableUser'),
+    newEnableUser,
+    EnableUserResponse (EnableUserResponse'),
+    newEnableUserResponse,
+
+    -- ** GetChangeset
+    GetChangeset (GetChangeset'),
+    newGetChangeset,
+    GetChangesetResponse (GetChangesetResponse'),
+    newGetChangesetResponse,
+
+    -- ** GetDataView
+    GetDataView (GetDataView'),
+    newGetDataView,
+    GetDataViewResponse (GetDataViewResponse'),
+    newGetDataViewResponse,
+
+    -- ** GetDataset
+    GetDataset (GetDataset'),
+    newGetDataset,
+    GetDatasetResponse (GetDatasetResponse'),
+    newGetDatasetResponse,
+
+    -- ** GetExternalDataViewAccessDetails
+    GetExternalDataViewAccessDetails (GetExternalDataViewAccessDetails'),
+    newGetExternalDataViewAccessDetails,
+    GetExternalDataViewAccessDetailsResponse (GetExternalDataViewAccessDetailsResponse'),
+    newGetExternalDataViewAccessDetailsResponse,
+
+    -- ** GetPermissionGroup
+    GetPermissionGroup (GetPermissionGroup'),
+    newGetPermissionGroup,
+    GetPermissionGroupResponse (GetPermissionGroupResponse'),
+    newGetPermissionGroupResponse,
+
+    -- ** GetProgrammaticAccessCredentials
+    GetProgrammaticAccessCredentials (GetProgrammaticAccessCredentials'),
+    newGetProgrammaticAccessCredentials,
+    GetProgrammaticAccessCredentialsResponse (GetProgrammaticAccessCredentialsResponse'),
+    newGetProgrammaticAccessCredentialsResponse,
+
+    -- ** GetUser
+    GetUser (GetUser'),
+    newGetUser,
+    GetUserResponse (GetUserResponse'),
+    newGetUserResponse,
+
+    -- ** GetWorkingLocation
+    GetWorkingLocation (GetWorkingLocation'),
+    newGetWorkingLocation,
+    GetWorkingLocationResponse (GetWorkingLocationResponse'),
+    newGetWorkingLocationResponse,
+
+    -- ** ListChangesets (Paginated)
+    ListChangesets (ListChangesets'),
+    newListChangesets,
+    ListChangesetsResponse (ListChangesetsResponse'),
+    newListChangesetsResponse,
+
+    -- ** ListDataViews (Paginated)
+    ListDataViews (ListDataViews'),
+    newListDataViews,
+    ListDataViewsResponse (ListDataViewsResponse'),
+    newListDataViewsResponse,
+
+    -- ** ListDatasets (Paginated)
+    ListDatasets (ListDatasets'),
+    newListDatasets,
+    ListDatasetsResponse (ListDatasetsResponse'),
+    newListDatasetsResponse,
+
+    -- ** ListPermissionGroups (Paginated)
+    ListPermissionGroups (ListPermissionGroups'),
+    newListPermissionGroups,
+    ListPermissionGroupsResponse (ListPermissionGroupsResponse'),
+    newListPermissionGroupsResponse,
+
+    -- ** ListPermissionGroupsByUser
+    ListPermissionGroupsByUser (ListPermissionGroupsByUser'),
+    newListPermissionGroupsByUser,
+    ListPermissionGroupsByUserResponse (ListPermissionGroupsByUserResponse'),
+    newListPermissionGroupsByUserResponse,
+
+    -- ** ListUsers (Paginated)
+    ListUsers (ListUsers'),
+    newListUsers,
+    ListUsersResponse (ListUsersResponse'),
+    newListUsersResponse,
+
+    -- ** ListUsersByPermissionGroup
+    ListUsersByPermissionGroup (ListUsersByPermissionGroup'),
+    newListUsersByPermissionGroup,
+    ListUsersByPermissionGroupResponse (ListUsersByPermissionGroupResponse'),
+    newListUsersByPermissionGroupResponse,
+
+    -- ** ResetUserPassword
+    ResetUserPassword (ResetUserPassword'),
+    newResetUserPassword,
+    ResetUserPasswordResponse (ResetUserPasswordResponse'),
+    newResetUserPasswordResponse,
+
+    -- ** UpdateChangeset
+    UpdateChangeset (UpdateChangeset'),
+    newUpdateChangeset,
+    UpdateChangesetResponse (UpdateChangesetResponse'),
+    newUpdateChangesetResponse,
+
+    -- ** UpdateDataset
+    UpdateDataset (UpdateDataset'),
+    newUpdateDataset,
+    UpdateDatasetResponse (UpdateDatasetResponse'),
+    newUpdateDatasetResponse,
+
+    -- ** UpdatePermissionGroup
+    UpdatePermissionGroup (UpdatePermissionGroup'),
+    newUpdatePermissionGroup,
+    UpdatePermissionGroupResponse (UpdatePermissionGroupResponse'),
+    newUpdatePermissionGroupResponse,
+
+    -- ** UpdateUser
+    UpdateUser (UpdateUser'),
+    newUpdateUser,
+    UpdateUserResponse (UpdateUserResponse'),
+    newUpdateUserResponse,
+
+    -- * Types
+
+    -- ** ApiAccess
+    ApiAccess (..),
+
+    -- ** ApplicationPermission
+    ApplicationPermission (..),
+
+    -- ** ChangeType
+    ChangeType (..),
+
+    -- ** ColumnDataType
+    ColumnDataType (..),
+
+    -- ** DataViewStatus
+    DataViewStatus (..),
+
+    -- ** DatasetKind
+    DatasetKind (..),
+
+    -- ** DatasetStatus
+    DatasetStatus (..),
+
+    -- ** ErrorCategory
+    ErrorCategory (..),
+
+    -- ** ExportFileFormat
+    ExportFileFormat (..),
+
+    -- ** IngestionStatus
+    IngestionStatus (..),
+
+    -- ** LocationType
+    LocationType (..),
+
+    -- ** PermissionGroupMembershipStatus
+    PermissionGroupMembershipStatus (..),
+
+    -- ** UserStatus
+    UserStatus (..),
+
+    -- ** UserType
+    UserType (..),
+
+    -- ** AwsCredentials
+    AwsCredentials (AwsCredentials'),
+    newAwsCredentials,
+
+    -- ** ChangesetErrorInfo
+    ChangesetErrorInfo (ChangesetErrorInfo'),
+    newChangesetErrorInfo,
+
+    -- ** ChangesetSummary
+    ChangesetSummary (ChangesetSummary'),
+    newChangesetSummary,
+
+    -- ** ColumnDefinition
+    ColumnDefinition (ColumnDefinition'),
+    newColumnDefinition,
+
+    -- ** Credentials
+    Credentials (Credentials'),
+    newCredentials,
+
+    -- ** DataViewDestinationTypeParams
+    DataViewDestinationTypeParams (DataViewDestinationTypeParams'),
+    newDataViewDestinationTypeParams,
+
+    -- ** DataViewErrorInfo
+    DataViewErrorInfo (DataViewErrorInfo'),
+    newDataViewErrorInfo,
+
+    -- ** DataViewSummary
+    DataViewSummary (DataViewSummary'),
+    newDataViewSummary,
+
+    -- ** Dataset
+    Dataset (Dataset'),
+    newDataset,
+
+    -- ** DatasetOwnerInfo
+    DatasetOwnerInfo (DatasetOwnerInfo'),
+    newDatasetOwnerInfo,
+
+    -- ** PermissionGroup
+    PermissionGroup (PermissionGroup'),
+    newPermissionGroup,
+
+    -- ** PermissionGroupByUser
+    PermissionGroupByUser (PermissionGroupByUser'),
+    newPermissionGroupByUser,
+
+    -- ** PermissionGroupParams
+    PermissionGroupParams (PermissionGroupParams'),
+    newPermissionGroupParams,
+
+    -- ** ResourcePermission
+    ResourcePermission (ResourcePermission'),
+    newResourcePermission,
+
+    -- ** S3Location
+    S3Location (S3Location'),
+    newS3Location,
+
+    -- ** SchemaDefinition
+    SchemaDefinition (SchemaDefinition'),
+    newSchemaDefinition,
+
+    -- ** SchemaUnion
+    SchemaUnion (SchemaUnion'),
+    newSchemaUnion,
+
+    -- ** User
+    User (User'),
+    newUser,
+
+    -- ** UserByPermissionGroup
+    UserByPermissionGroup (UserByPermissionGroup'),
+    newUserByPermissionGroup,
+  )
+where
+
+import Amazonka.FinSpaceData.AssociateUserToPermissionGroup
+import Amazonka.FinSpaceData.CreateChangeset
+import Amazonka.FinSpaceData.CreateDataView
+import Amazonka.FinSpaceData.CreateDataset
+import Amazonka.FinSpaceData.CreatePermissionGroup
+import Amazonka.FinSpaceData.CreateUser
+import Amazonka.FinSpaceData.DeleteDataset
+import Amazonka.FinSpaceData.DeletePermissionGroup
+import Amazonka.FinSpaceData.DisableUser
+import Amazonka.FinSpaceData.DisassociateUserFromPermissionGroup
+import Amazonka.FinSpaceData.EnableUser
+import Amazonka.FinSpaceData.GetChangeset
+import Amazonka.FinSpaceData.GetDataView
+import Amazonka.FinSpaceData.GetDataset
+import Amazonka.FinSpaceData.GetExternalDataViewAccessDetails
+import Amazonka.FinSpaceData.GetPermissionGroup
+import Amazonka.FinSpaceData.GetProgrammaticAccessCredentials
+import Amazonka.FinSpaceData.GetUser
+import Amazonka.FinSpaceData.GetWorkingLocation
+import Amazonka.FinSpaceData.Lens
+import Amazonka.FinSpaceData.ListChangesets
+import Amazonka.FinSpaceData.ListDataViews
+import Amazonka.FinSpaceData.ListDatasets
+import Amazonka.FinSpaceData.ListPermissionGroups
+import Amazonka.FinSpaceData.ListPermissionGroupsByUser
+import Amazonka.FinSpaceData.ListUsers
+import Amazonka.FinSpaceData.ListUsersByPermissionGroup
+import Amazonka.FinSpaceData.ResetUserPassword
+import Amazonka.FinSpaceData.Types
+import Amazonka.FinSpaceData.UpdateChangeset
+import Amazonka.FinSpaceData.UpdateDataset
+import Amazonka.FinSpaceData.UpdatePermissionGroup
+import Amazonka.FinSpaceData.UpdateUser
+import Amazonka.FinSpaceData.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 'FinSpaceData'.
+
+-- $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/FinSpaceData/AssociateUserToPermissionGroup.hs b/gen/Amazonka/FinSpaceData/AssociateUserToPermissionGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/AssociateUserToPermissionGroup.hs
@@ -0,0 +1,210 @@
+{-# 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.FinSpaceData.AssociateUserToPermissionGroup
+-- 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 user account to a permission group to grant permissions for
+-- actions a user can perform in FinSpace.
+module Amazonka.FinSpaceData.AssociateUserToPermissionGroup
+  ( -- * Creating a Request
+    AssociateUserToPermissionGroup (..),
+    newAssociateUserToPermissionGroup,
+
+    -- * Request Lenses
+    associateUserToPermissionGroup_clientToken,
+    associateUserToPermissionGroup_permissionGroupId,
+    associateUserToPermissionGroup_userId,
+
+    -- * Destructuring the Response
+    AssociateUserToPermissionGroupResponse (..),
+    newAssociateUserToPermissionGroupResponse,
+
+    -- * Response Lenses
+    associateUserToPermissionGroupResponse_statusCode,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newAssociateUserToPermissionGroup' smart constructor.
+data AssociateUserToPermissionGroup = AssociateUserToPermissionGroup'
+  { -- | A token that ensures idempotency. This token expires in 10 minutes.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier for the permission group.
+    permissionGroupId :: Prelude.Text,
+    -- | The unique identifier for the user.
+    userId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssociateUserToPermissionGroup' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'associateUserToPermissionGroup_clientToken' - A token that ensures idempotency. This token expires in 10 minutes.
+--
+-- 'permissionGroupId', 'associateUserToPermissionGroup_permissionGroupId' - The unique identifier for the permission group.
+--
+-- 'userId', 'associateUserToPermissionGroup_userId' - The unique identifier for the user.
+newAssociateUserToPermissionGroup ::
+  -- | 'permissionGroupId'
+  Prelude.Text ->
+  -- | 'userId'
+  Prelude.Text ->
+  AssociateUserToPermissionGroup
+newAssociateUserToPermissionGroup
+  pPermissionGroupId_
+  pUserId_ =
+    AssociateUserToPermissionGroup'
+      { clientToken =
+          Prelude.Nothing,
+        permissionGroupId = pPermissionGroupId_,
+        userId = pUserId_
+      }
+
+-- | A token that ensures idempotency. This token expires in 10 minutes.
+associateUserToPermissionGroup_clientToken :: Lens.Lens' AssociateUserToPermissionGroup (Prelude.Maybe Prelude.Text)
+associateUserToPermissionGroup_clientToken = Lens.lens (\AssociateUserToPermissionGroup' {clientToken} -> clientToken) (\s@AssociateUserToPermissionGroup' {} a -> s {clientToken = a} :: AssociateUserToPermissionGroup)
+
+-- | The unique identifier for the permission group.
+associateUserToPermissionGroup_permissionGroupId :: Lens.Lens' AssociateUserToPermissionGroup Prelude.Text
+associateUserToPermissionGroup_permissionGroupId = Lens.lens (\AssociateUserToPermissionGroup' {permissionGroupId} -> permissionGroupId) (\s@AssociateUserToPermissionGroup' {} a -> s {permissionGroupId = a} :: AssociateUserToPermissionGroup)
+
+-- | The unique identifier for the user.
+associateUserToPermissionGroup_userId :: Lens.Lens' AssociateUserToPermissionGroup Prelude.Text
+associateUserToPermissionGroup_userId = Lens.lens (\AssociateUserToPermissionGroup' {userId} -> userId) (\s@AssociateUserToPermissionGroup' {} a -> s {userId = a} :: AssociateUserToPermissionGroup)
+
+instance
+  Core.AWSRequest
+    AssociateUserToPermissionGroup
+  where
+  type
+    AWSResponse AssociateUserToPermissionGroup =
+      AssociateUserToPermissionGroupResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          AssociateUserToPermissionGroupResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    AssociateUserToPermissionGroup
+  where
+  hashWithSalt
+    _salt
+    AssociateUserToPermissionGroup' {..} =
+      _salt
+        `Prelude.hashWithSalt` clientToken
+        `Prelude.hashWithSalt` permissionGroupId
+        `Prelude.hashWithSalt` userId
+
+instance
+  Prelude.NFData
+    AssociateUserToPermissionGroup
+  where
+  rnf AssociateUserToPermissionGroup' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf permissionGroupId
+      `Prelude.seq` Prelude.rnf userId
+
+instance
+  Data.ToHeaders
+    AssociateUserToPermissionGroup
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON AssociateUserToPermissionGroup where
+  toJSON AssociateUserToPermissionGroup' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("clientToken" Data..=) Prelude.<$> clientToken]
+      )
+
+instance Data.ToPath AssociateUserToPermissionGroup where
+  toPath AssociateUserToPermissionGroup' {..} =
+    Prelude.mconcat
+      [ "/permission-group/",
+        Data.toBS permissionGroupId,
+        "/users/",
+        Data.toBS userId
+      ]
+
+instance Data.ToQuery AssociateUserToPermissionGroup where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newAssociateUserToPermissionGroupResponse' smart constructor.
+data AssociateUserToPermissionGroupResponse = AssociateUserToPermissionGroupResponse'
+  { -- | The returned status code of the response.
+    statusCode :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssociateUserToPermissionGroupResponse' 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:
+--
+-- 'statusCode', 'associateUserToPermissionGroupResponse_statusCode' - The returned status code of the response.
+newAssociateUserToPermissionGroupResponse ::
+  -- | 'statusCode'
+  Prelude.Int ->
+  AssociateUserToPermissionGroupResponse
+newAssociateUserToPermissionGroupResponse
+  pStatusCode_ =
+    AssociateUserToPermissionGroupResponse'
+      { statusCode =
+          pStatusCode_
+      }
+
+-- | The returned status code of the response.
+associateUserToPermissionGroupResponse_statusCode :: Lens.Lens' AssociateUserToPermissionGroupResponse Prelude.Int
+associateUserToPermissionGroupResponse_statusCode = Lens.lens (\AssociateUserToPermissionGroupResponse' {statusCode} -> statusCode) (\s@AssociateUserToPermissionGroupResponse' {} a -> s {statusCode = a} :: AssociateUserToPermissionGroupResponse)
+
+instance
+  Prelude.NFData
+    AssociateUserToPermissionGroupResponse
+  where
+  rnf AssociateUserToPermissionGroupResponse' {..} =
+    Prelude.rnf statusCode
diff --git a/gen/Amazonka/FinSpaceData/CreateChangeset.hs b/gen/Amazonka/FinSpaceData/CreateChangeset.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/CreateChangeset.hs
@@ -0,0 +1,387 @@
+{-# 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.FinSpaceData.CreateChangeset
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a new Changeset in a FinSpace Dataset.
+module Amazonka.FinSpaceData.CreateChangeset
+  ( -- * Creating a Request
+    CreateChangeset (..),
+    newCreateChangeset,
+
+    -- * Request Lenses
+    createChangeset_clientToken,
+    createChangeset_datasetId,
+    createChangeset_changeType,
+    createChangeset_sourceParams,
+    createChangeset_formatParams,
+
+    -- * Destructuring the Response
+    CreateChangesetResponse (..),
+    newCreateChangesetResponse,
+
+    -- * Response Lenses
+    createChangesetResponse_changesetId,
+    createChangesetResponse_datasetId,
+    createChangesetResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The request for a CreateChangeset operation.
+--
+-- /See:/ 'newCreateChangeset' smart constructor.
+data CreateChangeset = CreateChangeset'
+  { -- | A token that ensures idempotency. This token expires in 10 minutes.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier for the FinSpace Dataset where the Changeset will
+    -- be created.
+    datasetId :: Prelude.Text,
+    -- | The option to indicate how a Changeset will be applied to a Dataset.
+    --
+    -- -   @REPLACE@ – Changeset will be considered as a replacement to all
+    --     prior loaded Changesets.
+    --
+    -- -   @APPEND@ – Changeset will be considered as an addition to the end of
+    --     all prior loaded Changesets.
+    --
+    -- -   @MODIFY@ – Changeset is considered as a replacement to a specific
+    --     prior ingested Changeset.
+    changeType :: ChangeType,
+    -- | Options that define the location of the data being ingested
+    -- (@s3SourcePath@) and the source of the changeset (@sourceType@).
+    --
+    -- Both @s3SourcePath@ and @sourceType@ are required attributes.
+    --
+    -- Here is an example of how you could specify the @sourceParams@:
+    --
+    -- @ \"sourceParams\": { \"s3SourcePath\": \"s3:\/\/finspace-landing-us-east-2-bk7gcfvitndqa6ebnvys4d\/scratch\/wr5hh8pwkpqqkxa4sxrmcw\/ingestion\/equity.csv\", \"sourceType\": \"S3\" } @
+    --
+    -- The S3 path that you specify must allow the FinSpace role access. To do
+    -- that, you first need to configure the IAM policy on S3 bucket. For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/finspace/latest/data-api/fs-using-the-finspace-api.html#access-s3-buckets Loading data from an Amazon S3 Bucket using the FinSpace API>
+    -- section.
+    sourceParams :: Prelude.HashMap Prelude.Text Prelude.Text,
+    -- | Options that define the structure of the source file(s) including the
+    -- format type (@formatType@), header row (@withHeader@), data separation
+    -- character (@separator@) and the type of compression (@compression@).
+    --
+    -- @formatType@ is a required attribute and can have the following values:
+    --
+    -- -   @PARQUET@ – Parquet source file format.
+    --
+    -- -   @CSV@ – CSV source file format.
+    --
+    -- -   @JSON@ – JSON source file format.
+    --
+    -- -   @XML@ – XML source file format.
+    --
+    -- Here is an example of how you could specify the @formatParams@:
+    --
+    -- @ \"formatParams\": { \"formatType\": \"CSV\", \"withHeader\": \"true\", \"separator\": \",\", \"compression\":\"None\" } @
+    --
+    -- Note that if you only provide @formatType@ as @CSV@, the rest of the
+    -- attributes will automatically default to CSV values as following:
+    --
+    -- @ { \"withHeader\": \"true\", \"separator\": \",\" } @
+    --
+    -- For more information about supported file formats, see
+    -- <https://docs.aws.amazon.com/finspace/latest/userguide/supported-data-types.html Supported Data Types and File Formats>
+    -- in the FinSpace User Guide.
+    formatParams :: Prelude.HashMap Prelude.Text Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateChangeset' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'createChangeset_clientToken' - A token that ensures idempotency. This token expires in 10 minutes.
+--
+-- 'datasetId', 'createChangeset_datasetId' - The unique identifier for the FinSpace Dataset where the Changeset will
+-- be created.
+--
+-- 'changeType', 'createChangeset_changeType' - The option to indicate how a Changeset will be applied to a Dataset.
+--
+-- -   @REPLACE@ – Changeset will be considered as a replacement to all
+--     prior loaded Changesets.
+--
+-- -   @APPEND@ – Changeset will be considered as an addition to the end of
+--     all prior loaded Changesets.
+--
+-- -   @MODIFY@ – Changeset is considered as a replacement to a specific
+--     prior ingested Changeset.
+--
+-- 'sourceParams', 'createChangeset_sourceParams' - Options that define the location of the data being ingested
+-- (@s3SourcePath@) and the source of the changeset (@sourceType@).
+--
+-- Both @s3SourcePath@ and @sourceType@ are required attributes.
+--
+-- Here is an example of how you could specify the @sourceParams@:
+--
+-- @ \"sourceParams\": { \"s3SourcePath\": \"s3:\/\/finspace-landing-us-east-2-bk7gcfvitndqa6ebnvys4d\/scratch\/wr5hh8pwkpqqkxa4sxrmcw\/ingestion\/equity.csv\", \"sourceType\": \"S3\" } @
+--
+-- The S3 path that you specify must allow the FinSpace role access. To do
+-- that, you first need to configure the IAM policy on S3 bucket. For more
+-- information, see
+-- <https://docs.aws.amazon.com/finspace/latest/data-api/fs-using-the-finspace-api.html#access-s3-buckets Loading data from an Amazon S3 Bucket using the FinSpace API>
+-- section.
+--
+-- 'formatParams', 'createChangeset_formatParams' - Options that define the structure of the source file(s) including the
+-- format type (@formatType@), header row (@withHeader@), data separation
+-- character (@separator@) and the type of compression (@compression@).
+--
+-- @formatType@ is a required attribute and can have the following values:
+--
+-- -   @PARQUET@ – Parquet source file format.
+--
+-- -   @CSV@ – CSV source file format.
+--
+-- -   @JSON@ – JSON source file format.
+--
+-- -   @XML@ – XML source file format.
+--
+-- Here is an example of how you could specify the @formatParams@:
+--
+-- @ \"formatParams\": { \"formatType\": \"CSV\", \"withHeader\": \"true\", \"separator\": \",\", \"compression\":\"None\" } @
+--
+-- Note that if you only provide @formatType@ as @CSV@, the rest of the
+-- attributes will automatically default to CSV values as following:
+--
+-- @ { \"withHeader\": \"true\", \"separator\": \",\" } @
+--
+-- For more information about supported file formats, see
+-- <https://docs.aws.amazon.com/finspace/latest/userguide/supported-data-types.html Supported Data Types and File Formats>
+-- in the FinSpace User Guide.
+newCreateChangeset ::
+  -- | 'datasetId'
+  Prelude.Text ->
+  -- | 'changeType'
+  ChangeType ->
+  CreateChangeset
+newCreateChangeset pDatasetId_ pChangeType_ =
+  CreateChangeset'
+    { clientToken = Prelude.Nothing,
+      datasetId = pDatasetId_,
+      changeType = pChangeType_,
+      sourceParams = Prelude.mempty,
+      formatParams = Prelude.mempty
+    }
+
+-- | A token that ensures idempotency. This token expires in 10 minutes.
+createChangeset_clientToken :: Lens.Lens' CreateChangeset (Prelude.Maybe Prelude.Text)
+createChangeset_clientToken = Lens.lens (\CreateChangeset' {clientToken} -> clientToken) (\s@CreateChangeset' {} a -> s {clientToken = a} :: CreateChangeset)
+
+-- | The unique identifier for the FinSpace Dataset where the Changeset will
+-- be created.
+createChangeset_datasetId :: Lens.Lens' CreateChangeset Prelude.Text
+createChangeset_datasetId = Lens.lens (\CreateChangeset' {datasetId} -> datasetId) (\s@CreateChangeset' {} a -> s {datasetId = a} :: CreateChangeset)
+
+-- | The option to indicate how a Changeset will be applied to a Dataset.
+--
+-- -   @REPLACE@ – Changeset will be considered as a replacement to all
+--     prior loaded Changesets.
+--
+-- -   @APPEND@ – Changeset will be considered as an addition to the end of
+--     all prior loaded Changesets.
+--
+-- -   @MODIFY@ – Changeset is considered as a replacement to a specific
+--     prior ingested Changeset.
+createChangeset_changeType :: Lens.Lens' CreateChangeset ChangeType
+createChangeset_changeType = Lens.lens (\CreateChangeset' {changeType} -> changeType) (\s@CreateChangeset' {} a -> s {changeType = a} :: CreateChangeset)
+
+-- | Options that define the location of the data being ingested
+-- (@s3SourcePath@) and the source of the changeset (@sourceType@).
+--
+-- Both @s3SourcePath@ and @sourceType@ are required attributes.
+--
+-- Here is an example of how you could specify the @sourceParams@:
+--
+-- @ \"sourceParams\": { \"s3SourcePath\": \"s3:\/\/finspace-landing-us-east-2-bk7gcfvitndqa6ebnvys4d\/scratch\/wr5hh8pwkpqqkxa4sxrmcw\/ingestion\/equity.csv\", \"sourceType\": \"S3\" } @
+--
+-- The S3 path that you specify must allow the FinSpace role access. To do
+-- that, you first need to configure the IAM policy on S3 bucket. For more
+-- information, see
+-- <https://docs.aws.amazon.com/finspace/latest/data-api/fs-using-the-finspace-api.html#access-s3-buckets Loading data from an Amazon S3 Bucket using the FinSpace API>
+-- section.
+createChangeset_sourceParams :: Lens.Lens' CreateChangeset (Prelude.HashMap Prelude.Text Prelude.Text)
+createChangeset_sourceParams = Lens.lens (\CreateChangeset' {sourceParams} -> sourceParams) (\s@CreateChangeset' {} a -> s {sourceParams = a} :: CreateChangeset) Prelude.. Lens.coerced
+
+-- | Options that define the structure of the source file(s) including the
+-- format type (@formatType@), header row (@withHeader@), data separation
+-- character (@separator@) and the type of compression (@compression@).
+--
+-- @formatType@ is a required attribute and can have the following values:
+--
+-- -   @PARQUET@ – Parquet source file format.
+--
+-- -   @CSV@ – CSV source file format.
+--
+-- -   @JSON@ – JSON source file format.
+--
+-- -   @XML@ – XML source file format.
+--
+-- Here is an example of how you could specify the @formatParams@:
+--
+-- @ \"formatParams\": { \"formatType\": \"CSV\", \"withHeader\": \"true\", \"separator\": \",\", \"compression\":\"None\" } @
+--
+-- Note that if you only provide @formatType@ as @CSV@, the rest of the
+-- attributes will automatically default to CSV values as following:
+--
+-- @ { \"withHeader\": \"true\", \"separator\": \",\" } @
+--
+-- For more information about supported file formats, see
+-- <https://docs.aws.amazon.com/finspace/latest/userguide/supported-data-types.html Supported Data Types and File Formats>
+-- in the FinSpace User Guide.
+createChangeset_formatParams :: Lens.Lens' CreateChangeset (Prelude.HashMap Prelude.Text Prelude.Text)
+createChangeset_formatParams = Lens.lens (\CreateChangeset' {formatParams} -> formatParams) (\s@CreateChangeset' {} a -> s {formatParams = a} :: CreateChangeset) Prelude.. Lens.coerced
+
+instance Core.AWSRequest CreateChangeset where
+  type
+    AWSResponse CreateChangeset =
+      CreateChangesetResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateChangesetResponse'
+            Prelude.<$> (x Data..?> "changesetId")
+            Prelude.<*> (x Data..?> "datasetId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateChangeset where
+  hashWithSalt _salt CreateChangeset' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` datasetId
+      `Prelude.hashWithSalt` changeType
+      `Prelude.hashWithSalt` sourceParams
+      `Prelude.hashWithSalt` formatParams
+
+instance Prelude.NFData CreateChangeset where
+  rnf CreateChangeset' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf datasetId
+      `Prelude.seq` Prelude.rnf changeType
+      `Prelude.seq` Prelude.rnf sourceParams
+      `Prelude.seq` Prelude.rnf formatParams
+
+instance Data.ToHeaders CreateChangeset where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateChangeset where
+  toJSON CreateChangeset' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            Prelude.Just ("changeType" Data..= changeType),
+            Prelude.Just ("sourceParams" Data..= sourceParams),
+            Prelude.Just ("formatParams" Data..= formatParams)
+          ]
+      )
+
+instance Data.ToPath CreateChangeset where
+  toPath CreateChangeset' {..} =
+    Prelude.mconcat
+      ["/datasets/", Data.toBS datasetId, "/changesetsv2"]
+
+instance Data.ToQuery CreateChangeset where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | The response from a CreateChangeset operation.
+--
+-- /See:/ 'newCreateChangesetResponse' smart constructor.
+data CreateChangesetResponse = CreateChangesetResponse'
+  { -- | The unique identifier of the Changeset that is created.
+    changesetId :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier for the FinSpace Dataset where the Changeset is
+    -- created.
+    datasetId :: 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 'CreateChangesetResponse' 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:
+--
+-- 'changesetId', 'createChangesetResponse_changesetId' - The unique identifier of the Changeset that is created.
+--
+-- 'datasetId', 'createChangesetResponse_datasetId' - The unique identifier for the FinSpace Dataset where the Changeset is
+-- created.
+--
+-- 'httpStatus', 'createChangesetResponse_httpStatus' - The response's http status code.
+newCreateChangesetResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateChangesetResponse
+newCreateChangesetResponse pHttpStatus_ =
+  CreateChangesetResponse'
+    { changesetId =
+        Prelude.Nothing,
+      datasetId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The unique identifier of the Changeset that is created.
+createChangesetResponse_changesetId :: Lens.Lens' CreateChangesetResponse (Prelude.Maybe Prelude.Text)
+createChangesetResponse_changesetId = Lens.lens (\CreateChangesetResponse' {changesetId} -> changesetId) (\s@CreateChangesetResponse' {} a -> s {changesetId = a} :: CreateChangesetResponse)
+
+-- | The unique identifier for the FinSpace Dataset where the Changeset is
+-- created.
+createChangesetResponse_datasetId :: Lens.Lens' CreateChangesetResponse (Prelude.Maybe Prelude.Text)
+createChangesetResponse_datasetId = Lens.lens (\CreateChangesetResponse' {datasetId} -> datasetId) (\s@CreateChangesetResponse' {} a -> s {datasetId = a} :: CreateChangesetResponse)
+
+-- | The response's http status code.
+createChangesetResponse_httpStatus :: Lens.Lens' CreateChangesetResponse Prelude.Int
+createChangesetResponse_httpStatus = Lens.lens (\CreateChangesetResponse' {httpStatus} -> httpStatus) (\s@CreateChangesetResponse' {} a -> s {httpStatus = a} :: CreateChangesetResponse)
+
+instance Prelude.NFData CreateChangesetResponse where
+  rnf CreateChangesetResponse' {..} =
+    Prelude.rnf changesetId
+      `Prelude.seq` Prelude.rnf datasetId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/CreateDataView.hs b/gen/Amazonka/FinSpaceData/CreateDataView.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/CreateDataView.hs
@@ -0,0 +1,276 @@
+{-# 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.FinSpaceData.CreateDataView
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a Dataview for a Dataset.
+module Amazonka.FinSpaceData.CreateDataView
+  ( -- * Creating a Request
+    CreateDataView (..),
+    newCreateDataView,
+
+    -- * Request Lenses
+    createDataView_asOfTimestamp,
+    createDataView_autoUpdate,
+    createDataView_clientToken,
+    createDataView_partitionColumns,
+    createDataView_sortColumns,
+    createDataView_datasetId,
+    createDataView_destinationTypeParams,
+
+    -- * Destructuring the Response
+    CreateDataViewResponse (..),
+    newCreateDataViewResponse,
+
+    -- * Response Lenses
+    createDataViewResponse_dataViewId,
+    createDataViewResponse_datasetId,
+    createDataViewResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Request for creating a data view.
+--
+-- /See:/ 'newCreateDataView' smart constructor.
+data CreateDataView = CreateDataView'
+  { -- | Beginning time to use for the Dataview. The value is determined as epoch
+    -- time in milliseconds. For example, the value for Monday, November 1,
+    -- 2021 12:00:00 PM UTC is specified as 1635768000000.
+    asOfTimestamp :: Prelude.Maybe Prelude.Integer,
+    -- | Flag to indicate Dataview should be updated automatically.
+    autoUpdate :: Prelude.Maybe Prelude.Bool,
+    -- | A token that ensures idempotency. This token expires in 10 minutes.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | Ordered set of column names used to partition data.
+    partitionColumns :: Prelude.Maybe [Prelude.Text],
+    -- | Columns to be used for sorting the data.
+    sortColumns :: Prelude.Maybe [Prelude.Text],
+    -- | The unique Dataset identifier that is used to create a Dataview.
+    datasetId :: Prelude.Text,
+    -- | Options that define the destination type for the Dataview.
+    destinationTypeParams :: DataViewDestinationTypeParams
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateDataView' 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:
+--
+-- 'asOfTimestamp', 'createDataView_asOfTimestamp' - Beginning time to use for the Dataview. The value is determined as epoch
+-- time in milliseconds. For example, the value for Monday, November 1,
+-- 2021 12:00:00 PM UTC is specified as 1635768000000.
+--
+-- 'autoUpdate', 'createDataView_autoUpdate' - Flag to indicate Dataview should be updated automatically.
+--
+-- 'clientToken', 'createDataView_clientToken' - A token that ensures idempotency. This token expires in 10 minutes.
+--
+-- 'partitionColumns', 'createDataView_partitionColumns' - Ordered set of column names used to partition data.
+--
+-- 'sortColumns', 'createDataView_sortColumns' - Columns to be used for sorting the data.
+--
+-- 'datasetId', 'createDataView_datasetId' - The unique Dataset identifier that is used to create a Dataview.
+--
+-- 'destinationTypeParams', 'createDataView_destinationTypeParams' - Options that define the destination type for the Dataview.
+newCreateDataView ::
+  -- | 'datasetId'
+  Prelude.Text ->
+  -- | 'destinationTypeParams'
+  DataViewDestinationTypeParams ->
+  CreateDataView
+newCreateDataView pDatasetId_ pDestinationTypeParams_ =
+  CreateDataView'
+    { asOfTimestamp = Prelude.Nothing,
+      autoUpdate = Prelude.Nothing,
+      clientToken = Prelude.Nothing,
+      partitionColumns = Prelude.Nothing,
+      sortColumns = Prelude.Nothing,
+      datasetId = pDatasetId_,
+      destinationTypeParams = pDestinationTypeParams_
+    }
+
+-- | Beginning time to use for the Dataview. The value is determined as epoch
+-- time in milliseconds. For example, the value for Monday, November 1,
+-- 2021 12:00:00 PM UTC is specified as 1635768000000.
+createDataView_asOfTimestamp :: Lens.Lens' CreateDataView (Prelude.Maybe Prelude.Integer)
+createDataView_asOfTimestamp = Lens.lens (\CreateDataView' {asOfTimestamp} -> asOfTimestamp) (\s@CreateDataView' {} a -> s {asOfTimestamp = a} :: CreateDataView)
+
+-- | Flag to indicate Dataview should be updated automatically.
+createDataView_autoUpdate :: Lens.Lens' CreateDataView (Prelude.Maybe Prelude.Bool)
+createDataView_autoUpdate = Lens.lens (\CreateDataView' {autoUpdate} -> autoUpdate) (\s@CreateDataView' {} a -> s {autoUpdate = a} :: CreateDataView)
+
+-- | A token that ensures idempotency. This token expires in 10 minutes.
+createDataView_clientToken :: Lens.Lens' CreateDataView (Prelude.Maybe Prelude.Text)
+createDataView_clientToken = Lens.lens (\CreateDataView' {clientToken} -> clientToken) (\s@CreateDataView' {} a -> s {clientToken = a} :: CreateDataView)
+
+-- | Ordered set of column names used to partition data.
+createDataView_partitionColumns :: Lens.Lens' CreateDataView (Prelude.Maybe [Prelude.Text])
+createDataView_partitionColumns = Lens.lens (\CreateDataView' {partitionColumns} -> partitionColumns) (\s@CreateDataView' {} a -> s {partitionColumns = a} :: CreateDataView) Prelude.. Lens.mapping Lens.coerced
+
+-- | Columns to be used for sorting the data.
+createDataView_sortColumns :: Lens.Lens' CreateDataView (Prelude.Maybe [Prelude.Text])
+createDataView_sortColumns = Lens.lens (\CreateDataView' {sortColumns} -> sortColumns) (\s@CreateDataView' {} a -> s {sortColumns = a} :: CreateDataView) Prelude.. Lens.mapping Lens.coerced
+
+-- | The unique Dataset identifier that is used to create a Dataview.
+createDataView_datasetId :: Lens.Lens' CreateDataView Prelude.Text
+createDataView_datasetId = Lens.lens (\CreateDataView' {datasetId} -> datasetId) (\s@CreateDataView' {} a -> s {datasetId = a} :: CreateDataView)
+
+-- | Options that define the destination type for the Dataview.
+createDataView_destinationTypeParams :: Lens.Lens' CreateDataView DataViewDestinationTypeParams
+createDataView_destinationTypeParams = Lens.lens (\CreateDataView' {destinationTypeParams} -> destinationTypeParams) (\s@CreateDataView' {} a -> s {destinationTypeParams = a} :: CreateDataView)
+
+instance Core.AWSRequest CreateDataView where
+  type
+    AWSResponse CreateDataView =
+      CreateDataViewResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateDataViewResponse'
+            Prelude.<$> (x Data..?> "dataViewId")
+            Prelude.<*> (x Data..?> "datasetId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateDataView where
+  hashWithSalt _salt CreateDataView' {..} =
+    _salt
+      `Prelude.hashWithSalt` asOfTimestamp
+      `Prelude.hashWithSalt` autoUpdate
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` partitionColumns
+      `Prelude.hashWithSalt` sortColumns
+      `Prelude.hashWithSalt` datasetId
+      `Prelude.hashWithSalt` destinationTypeParams
+
+instance Prelude.NFData CreateDataView where
+  rnf CreateDataView' {..} =
+    Prelude.rnf asOfTimestamp
+      `Prelude.seq` Prelude.rnf autoUpdate
+      `Prelude.seq` Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf partitionColumns
+      `Prelude.seq` Prelude.rnf sortColumns
+      `Prelude.seq` Prelude.rnf datasetId
+      `Prelude.seq` Prelude.rnf destinationTypeParams
+
+instance Data.ToHeaders CreateDataView where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateDataView where
+  toJSON CreateDataView' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("asOfTimestamp" Data..=) Prelude.<$> asOfTimestamp,
+            ("autoUpdate" Data..=) Prelude.<$> autoUpdate,
+            ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("partitionColumns" Data..=)
+              Prelude.<$> partitionColumns,
+            ("sortColumns" Data..=) Prelude.<$> sortColumns,
+            Prelude.Just
+              ( "destinationTypeParams"
+                  Data..= destinationTypeParams
+              )
+          ]
+      )
+
+instance Data.ToPath CreateDataView where
+  toPath CreateDataView' {..} =
+    Prelude.mconcat
+      ["/datasets/", Data.toBS datasetId, "/dataviewsv2"]
+
+instance Data.ToQuery CreateDataView where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | Response for creating a data view.
+--
+-- /See:/ 'newCreateDataViewResponse' smart constructor.
+data CreateDataViewResponse = CreateDataViewResponse'
+  { -- | The unique identifier for the created Dataview.
+    dataViewId :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier of the Dataset used for the Dataview.
+    datasetId :: 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 'CreateDataViewResponse' 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:
+--
+-- 'dataViewId', 'createDataViewResponse_dataViewId' - The unique identifier for the created Dataview.
+--
+-- 'datasetId', 'createDataViewResponse_datasetId' - The unique identifier of the Dataset used for the Dataview.
+--
+-- 'httpStatus', 'createDataViewResponse_httpStatus' - The response's http status code.
+newCreateDataViewResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateDataViewResponse
+newCreateDataViewResponse pHttpStatus_ =
+  CreateDataViewResponse'
+    { dataViewId =
+        Prelude.Nothing,
+      datasetId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The unique identifier for the created Dataview.
+createDataViewResponse_dataViewId :: Lens.Lens' CreateDataViewResponse (Prelude.Maybe Prelude.Text)
+createDataViewResponse_dataViewId = Lens.lens (\CreateDataViewResponse' {dataViewId} -> dataViewId) (\s@CreateDataViewResponse' {} a -> s {dataViewId = a} :: CreateDataViewResponse)
+
+-- | The unique identifier of the Dataset used for the Dataview.
+createDataViewResponse_datasetId :: Lens.Lens' CreateDataViewResponse (Prelude.Maybe Prelude.Text)
+createDataViewResponse_datasetId = Lens.lens (\CreateDataViewResponse' {datasetId} -> datasetId) (\s@CreateDataViewResponse' {} a -> s {datasetId = a} :: CreateDataViewResponse)
+
+-- | The response's http status code.
+createDataViewResponse_httpStatus :: Lens.Lens' CreateDataViewResponse Prelude.Int
+createDataViewResponse_httpStatus = Lens.lens (\CreateDataViewResponse' {httpStatus} -> httpStatus) (\s@CreateDataViewResponse' {} a -> s {httpStatus = a} :: CreateDataViewResponse)
+
+instance Prelude.NFData CreateDataViewResponse where
+  rnf CreateDataViewResponse' {..} =
+    Prelude.rnf dataViewId
+      `Prelude.seq` Prelude.rnf datasetId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/CreateDataset.hs b/gen/Amazonka/FinSpaceData/CreateDataset.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/CreateDataset.hs
@@ -0,0 +1,287 @@
+{-# 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.FinSpaceData.CreateDataset
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a new FinSpace Dataset.
+module Amazonka.FinSpaceData.CreateDataset
+  ( -- * Creating a Request
+    CreateDataset (..),
+    newCreateDataset,
+
+    -- * Request Lenses
+    createDataset_alias,
+    createDataset_clientToken,
+    createDataset_datasetDescription,
+    createDataset_ownerInfo,
+    createDataset_schemaDefinition,
+    createDataset_datasetTitle,
+    createDataset_kind,
+    createDataset_permissionGroupParams,
+
+    -- * Destructuring the Response
+    CreateDatasetResponse (..),
+    newCreateDatasetResponse,
+
+    -- * Response Lenses
+    createDatasetResponse_datasetId,
+    createDatasetResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The request for a CreateDataset operation
+--
+-- /See:/ 'newCreateDataset' smart constructor.
+data CreateDataset = CreateDataset'
+  { -- | The unique resource identifier for a Dataset.
+    alias :: Prelude.Maybe Prelude.Text,
+    -- | A token that ensures idempotency. This token expires in 10 minutes.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | Description of a Dataset.
+    datasetDescription :: Prelude.Maybe Prelude.Text,
+    -- | Contact information for a Dataset owner.
+    ownerInfo :: Prelude.Maybe DatasetOwnerInfo,
+    -- | Definition for a schema on a tabular Dataset.
+    schemaDefinition :: Prelude.Maybe SchemaUnion,
+    -- | Display title for a FinSpace Dataset.
+    datasetTitle :: Prelude.Text,
+    -- | The format in which Dataset data is structured.
+    --
+    -- -   @TABULAR@ – Data is structured in a tabular format.
+    --
+    -- -   @NON_TABULAR@ – Data is structured in a non-tabular format.
+    kind :: DatasetKind,
+    -- | Permission group parameters for Dataset permissions.
+    permissionGroupParams :: PermissionGroupParams
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateDataset' 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:
+--
+-- 'alias', 'createDataset_alias' - The unique resource identifier for a Dataset.
+--
+-- 'clientToken', 'createDataset_clientToken' - A token that ensures idempotency. This token expires in 10 minutes.
+--
+-- 'datasetDescription', 'createDataset_datasetDescription' - Description of a Dataset.
+--
+-- 'ownerInfo', 'createDataset_ownerInfo' - Contact information for a Dataset owner.
+--
+-- 'schemaDefinition', 'createDataset_schemaDefinition' - Definition for a schema on a tabular Dataset.
+--
+-- 'datasetTitle', 'createDataset_datasetTitle' - Display title for a FinSpace Dataset.
+--
+-- 'kind', 'createDataset_kind' - The format in which Dataset data is structured.
+--
+-- -   @TABULAR@ – Data is structured in a tabular format.
+--
+-- -   @NON_TABULAR@ – Data is structured in a non-tabular format.
+--
+-- 'permissionGroupParams', 'createDataset_permissionGroupParams' - Permission group parameters for Dataset permissions.
+newCreateDataset ::
+  -- | 'datasetTitle'
+  Prelude.Text ->
+  -- | 'kind'
+  DatasetKind ->
+  -- | 'permissionGroupParams'
+  PermissionGroupParams ->
+  CreateDataset
+newCreateDataset
+  pDatasetTitle_
+  pKind_
+  pPermissionGroupParams_ =
+    CreateDataset'
+      { alias = Prelude.Nothing,
+        clientToken = Prelude.Nothing,
+        datasetDescription = Prelude.Nothing,
+        ownerInfo = Prelude.Nothing,
+        schemaDefinition = Prelude.Nothing,
+        datasetTitle = pDatasetTitle_,
+        kind = pKind_,
+        permissionGroupParams = pPermissionGroupParams_
+      }
+
+-- | The unique resource identifier for a Dataset.
+createDataset_alias :: Lens.Lens' CreateDataset (Prelude.Maybe Prelude.Text)
+createDataset_alias = Lens.lens (\CreateDataset' {alias} -> alias) (\s@CreateDataset' {} a -> s {alias = a} :: CreateDataset)
+
+-- | A token that ensures idempotency. This token expires in 10 minutes.
+createDataset_clientToken :: Lens.Lens' CreateDataset (Prelude.Maybe Prelude.Text)
+createDataset_clientToken = Lens.lens (\CreateDataset' {clientToken} -> clientToken) (\s@CreateDataset' {} a -> s {clientToken = a} :: CreateDataset)
+
+-- | Description of a Dataset.
+createDataset_datasetDescription :: Lens.Lens' CreateDataset (Prelude.Maybe Prelude.Text)
+createDataset_datasetDescription = Lens.lens (\CreateDataset' {datasetDescription} -> datasetDescription) (\s@CreateDataset' {} a -> s {datasetDescription = a} :: CreateDataset)
+
+-- | Contact information for a Dataset owner.
+createDataset_ownerInfo :: Lens.Lens' CreateDataset (Prelude.Maybe DatasetOwnerInfo)
+createDataset_ownerInfo = Lens.lens (\CreateDataset' {ownerInfo} -> ownerInfo) (\s@CreateDataset' {} a -> s {ownerInfo = a} :: CreateDataset)
+
+-- | Definition for a schema on a tabular Dataset.
+createDataset_schemaDefinition :: Lens.Lens' CreateDataset (Prelude.Maybe SchemaUnion)
+createDataset_schemaDefinition = Lens.lens (\CreateDataset' {schemaDefinition} -> schemaDefinition) (\s@CreateDataset' {} a -> s {schemaDefinition = a} :: CreateDataset)
+
+-- | Display title for a FinSpace Dataset.
+createDataset_datasetTitle :: Lens.Lens' CreateDataset Prelude.Text
+createDataset_datasetTitle = Lens.lens (\CreateDataset' {datasetTitle} -> datasetTitle) (\s@CreateDataset' {} a -> s {datasetTitle = a} :: CreateDataset)
+
+-- | The format in which Dataset data is structured.
+--
+-- -   @TABULAR@ – Data is structured in a tabular format.
+--
+-- -   @NON_TABULAR@ – Data is structured in a non-tabular format.
+createDataset_kind :: Lens.Lens' CreateDataset DatasetKind
+createDataset_kind = Lens.lens (\CreateDataset' {kind} -> kind) (\s@CreateDataset' {} a -> s {kind = a} :: CreateDataset)
+
+-- | Permission group parameters for Dataset permissions.
+createDataset_permissionGroupParams :: Lens.Lens' CreateDataset PermissionGroupParams
+createDataset_permissionGroupParams = Lens.lens (\CreateDataset' {permissionGroupParams} -> permissionGroupParams) (\s@CreateDataset' {} a -> s {permissionGroupParams = a} :: CreateDataset)
+
+instance Core.AWSRequest CreateDataset where
+  type
+    AWSResponse CreateDataset =
+      CreateDatasetResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateDatasetResponse'
+            Prelude.<$> (x Data..?> "datasetId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateDataset where
+  hashWithSalt _salt CreateDataset' {..} =
+    _salt
+      `Prelude.hashWithSalt` alias
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` datasetDescription
+      `Prelude.hashWithSalt` ownerInfo
+      `Prelude.hashWithSalt` schemaDefinition
+      `Prelude.hashWithSalt` datasetTitle
+      `Prelude.hashWithSalt` kind
+      `Prelude.hashWithSalt` permissionGroupParams
+
+instance Prelude.NFData CreateDataset where
+  rnf CreateDataset' {..} =
+    Prelude.rnf alias
+      `Prelude.seq` Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf datasetDescription
+      `Prelude.seq` Prelude.rnf ownerInfo
+      `Prelude.seq` Prelude.rnf schemaDefinition
+      `Prelude.seq` Prelude.rnf datasetTitle
+      `Prelude.seq` Prelude.rnf kind
+      `Prelude.seq` Prelude.rnf permissionGroupParams
+
+instance Data.ToHeaders CreateDataset where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateDataset where
+  toJSON CreateDataset' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("alias" Data..=) Prelude.<$> alias,
+            ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("datasetDescription" Data..=)
+              Prelude.<$> datasetDescription,
+            ("ownerInfo" Data..=) Prelude.<$> ownerInfo,
+            ("schemaDefinition" Data..=)
+              Prelude.<$> schemaDefinition,
+            Prelude.Just ("datasetTitle" Data..= datasetTitle),
+            Prelude.Just ("kind" Data..= kind),
+            Prelude.Just
+              ( "permissionGroupParams"
+                  Data..= permissionGroupParams
+              )
+          ]
+      )
+
+instance Data.ToPath CreateDataset where
+  toPath = Prelude.const "/datasetsv2"
+
+instance Data.ToQuery CreateDataset where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | The response from a CreateDataset operation
+--
+-- /See:/ 'newCreateDatasetResponse' smart constructor.
+data CreateDatasetResponse = CreateDatasetResponse'
+  { -- | The unique identifier for the created Dataset.
+    datasetId :: 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 'CreateDatasetResponse' 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:
+--
+-- 'datasetId', 'createDatasetResponse_datasetId' - The unique identifier for the created Dataset.
+--
+-- 'httpStatus', 'createDatasetResponse_httpStatus' - The response's http status code.
+newCreateDatasetResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateDatasetResponse
+newCreateDatasetResponse pHttpStatus_ =
+  CreateDatasetResponse'
+    { datasetId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The unique identifier for the created Dataset.
+createDatasetResponse_datasetId :: Lens.Lens' CreateDatasetResponse (Prelude.Maybe Prelude.Text)
+createDatasetResponse_datasetId = Lens.lens (\CreateDatasetResponse' {datasetId} -> datasetId) (\s@CreateDatasetResponse' {} a -> s {datasetId = a} :: CreateDatasetResponse)
+
+-- | The response's http status code.
+createDatasetResponse_httpStatus :: Lens.Lens' CreateDatasetResponse Prelude.Int
+createDatasetResponse_httpStatus = Lens.lens (\CreateDatasetResponse' {httpStatus} -> httpStatus) (\s@CreateDatasetResponse' {} a -> s {httpStatus = a} :: CreateDatasetResponse)
+
+instance Prelude.NFData CreateDatasetResponse where
+  rnf CreateDatasetResponse' {..} =
+    Prelude.rnf datasetId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/CreatePermissionGroup.hs b/gen/Amazonka/FinSpaceData/CreatePermissionGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/CreatePermissionGroup.hs
@@ -0,0 +1,291 @@
+{-# 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.FinSpaceData.CreatePermissionGroup
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a group of permissions for various actions that a user can
+-- perform in FinSpace.
+module Amazonka.FinSpaceData.CreatePermissionGroup
+  ( -- * Creating a Request
+    CreatePermissionGroup (..),
+    newCreatePermissionGroup,
+
+    -- * Request Lenses
+    createPermissionGroup_clientToken,
+    createPermissionGroup_description,
+    createPermissionGroup_name,
+    createPermissionGroup_applicationPermissions,
+
+    -- * Destructuring the Response
+    CreatePermissionGroupResponse (..),
+    newCreatePermissionGroupResponse,
+
+    -- * Response Lenses
+    createPermissionGroupResponse_permissionGroupId,
+    createPermissionGroupResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreatePermissionGroup' smart constructor.
+data CreatePermissionGroup = CreatePermissionGroup'
+  { -- | A token that ensures idempotency. This token expires in 10 minutes.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | A brief description for the permission group.
+    description :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The name of the permission group.
+    name :: Data.Sensitive Prelude.Text,
+    -- | The option to indicate FinSpace application permissions that are granted
+    -- to a specific group.
+    --
+    -- When assigning application permissions, be aware that the permission
+    -- @ManageUsersAndGroups@ allows users to grant themselves or others access
+    -- to any functionality in their FinSpace environment\'s application. It
+    -- should only be granted to trusted users.
+    --
+    -- -   @CreateDataset@ – Group members can create new datasets.
+    --
+    -- -   @ManageClusters@ – Group members can manage Apache Spark clusters
+    --     from FinSpace notebooks.
+    --
+    -- -   @ManageUsersAndGroups@ – Group members can manage users and
+    --     permission groups. This is a privileged permission that allows users
+    --     to grant themselves or others access to any functionality in the
+    --     application. It should only be granted to trusted users.
+    --
+    -- -   @ManageAttributeSets@ – Group members can manage attribute sets.
+    --
+    -- -   @ViewAuditData@ – Group members can view audit data.
+    --
+    -- -   @AccessNotebooks@ – Group members will have access to FinSpace
+    --     notebooks.
+    --
+    -- -   @GetTemporaryCredentials@ – Group members can get temporary API
+    --     credentials.
+    applicationPermissions :: [ApplicationPermission]
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreatePermissionGroup' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'createPermissionGroup_clientToken' - A token that ensures idempotency. This token expires in 10 minutes.
+--
+-- 'description', 'createPermissionGroup_description' - A brief description for the permission group.
+--
+-- 'name', 'createPermissionGroup_name' - The name of the permission group.
+--
+-- 'applicationPermissions', 'createPermissionGroup_applicationPermissions' - The option to indicate FinSpace application permissions that are granted
+-- to a specific group.
+--
+-- When assigning application permissions, be aware that the permission
+-- @ManageUsersAndGroups@ allows users to grant themselves or others access
+-- to any functionality in their FinSpace environment\'s application. It
+-- should only be granted to trusted users.
+--
+-- -   @CreateDataset@ – Group members can create new datasets.
+--
+-- -   @ManageClusters@ – Group members can manage Apache Spark clusters
+--     from FinSpace notebooks.
+--
+-- -   @ManageUsersAndGroups@ – Group members can manage users and
+--     permission groups. This is a privileged permission that allows users
+--     to grant themselves or others access to any functionality in the
+--     application. It should only be granted to trusted users.
+--
+-- -   @ManageAttributeSets@ – Group members can manage attribute sets.
+--
+-- -   @ViewAuditData@ – Group members can view audit data.
+--
+-- -   @AccessNotebooks@ – Group members will have access to FinSpace
+--     notebooks.
+--
+-- -   @GetTemporaryCredentials@ – Group members can get temporary API
+--     credentials.
+newCreatePermissionGroup ::
+  -- | 'name'
+  Prelude.Text ->
+  CreatePermissionGroup
+newCreatePermissionGroup pName_ =
+  CreatePermissionGroup'
+    { clientToken =
+        Prelude.Nothing,
+      description = Prelude.Nothing,
+      name = Data._Sensitive Lens.# pName_,
+      applicationPermissions = Prelude.mempty
+    }
+
+-- | A token that ensures idempotency. This token expires in 10 minutes.
+createPermissionGroup_clientToken :: Lens.Lens' CreatePermissionGroup (Prelude.Maybe Prelude.Text)
+createPermissionGroup_clientToken = Lens.lens (\CreatePermissionGroup' {clientToken} -> clientToken) (\s@CreatePermissionGroup' {} a -> s {clientToken = a} :: CreatePermissionGroup)
+
+-- | A brief description for the permission group.
+createPermissionGroup_description :: Lens.Lens' CreatePermissionGroup (Prelude.Maybe Prelude.Text)
+createPermissionGroup_description = Lens.lens (\CreatePermissionGroup' {description} -> description) (\s@CreatePermissionGroup' {} a -> s {description = a} :: CreatePermissionGroup) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The name of the permission group.
+createPermissionGroup_name :: Lens.Lens' CreatePermissionGroup Prelude.Text
+createPermissionGroup_name = Lens.lens (\CreatePermissionGroup' {name} -> name) (\s@CreatePermissionGroup' {} a -> s {name = a} :: CreatePermissionGroup) Prelude.. Data._Sensitive
+
+-- | The option to indicate FinSpace application permissions that are granted
+-- to a specific group.
+--
+-- When assigning application permissions, be aware that the permission
+-- @ManageUsersAndGroups@ allows users to grant themselves or others access
+-- to any functionality in their FinSpace environment\'s application. It
+-- should only be granted to trusted users.
+--
+-- -   @CreateDataset@ – Group members can create new datasets.
+--
+-- -   @ManageClusters@ – Group members can manage Apache Spark clusters
+--     from FinSpace notebooks.
+--
+-- -   @ManageUsersAndGroups@ – Group members can manage users and
+--     permission groups. This is a privileged permission that allows users
+--     to grant themselves or others access to any functionality in the
+--     application. It should only be granted to trusted users.
+--
+-- -   @ManageAttributeSets@ – Group members can manage attribute sets.
+--
+-- -   @ViewAuditData@ – Group members can view audit data.
+--
+-- -   @AccessNotebooks@ – Group members will have access to FinSpace
+--     notebooks.
+--
+-- -   @GetTemporaryCredentials@ – Group members can get temporary API
+--     credentials.
+createPermissionGroup_applicationPermissions :: Lens.Lens' CreatePermissionGroup [ApplicationPermission]
+createPermissionGroup_applicationPermissions = Lens.lens (\CreatePermissionGroup' {applicationPermissions} -> applicationPermissions) (\s@CreatePermissionGroup' {} a -> s {applicationPermissions = a} :: CreatePermissionGroup) Prelude.. Lens.coerced
+
+instance Core.AWSRequest CreatePermissionGroup where
+  type
+    AWSResponse CreatePermissionGroup =
+      CreatePermissionGroupResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreatePermissionGroupResponse'
+            Prelude.<$> (x Data..?> "permissionGroupId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreatePermissionGroup where
+  hashWithSalt _salt CreatePermissionGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` applicationPermissions
+
+instance Prelude.NFData CreatePermissionGroup where
+  rnf CreatePermissionGroup' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf applicationPermissions
+
+instance Data.ToHeaders CreatePermissionGroup where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreatePermissionGroup where
+  toJSON CreatePermissionGroup' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("description" Data..=) Prelude.<$> description,
+            Prelude.Just ("name" Data..= name),
+            Prelude.Just
+              ( "applicationPermissions"
+                  Data..= applicationPermissions
+              )
+          ]
+      )
+
+instance Data.ToPath CreatePermissionGroup where
+  toPath = Prelude.const "/permission-group"
+
+instance Data.ToQuery CreatePermissionGroup where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreatePermissionGroupResponse' smart constructor.
+data CreatePermissionGroupResponse = CreatePermissionGroupResponse'
+  { -- | The unique identifier for the permission group.
+    permissionGroupId :: 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 'CreatePermissionGroupResponse' 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:
+--
+-- 'permissionGroupId', 'createPermissionGroupResponse_permissionGroupId' - The unique identifier for the permission group.
+--
+-- 'httpStatus', 'createPermissionGroupResponse_httpStatus' - The response's http status code.
+newCreatePermissionGroupResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreatePermissionGroupResponse
+newCreatePermissionGroupResponse pHttpStatus_ =
+  CreatePermissionGroupResponse'
+    { permissionGroupId =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The unique identifier for the permission group.
+createPermissionGroupResponse_permissionGroupId :: Lens.Lens' CreatePermissionGroupResponse (Prelude.Maybe Prelude.Text)
+createPermissionGroupResponse_permissionGroupId = Lens.lens (\CreatePermissionGroupResponse' {permissionGroupId} -> permissionGroupId) (\s@CreatePermissionGroupResponse' {} a -> s {permissionGroupId = a} :: CreatePermissionGroupResponse)
+
+-- | The response's http status code.
+createPermissionGroupResponse_httpStatus :: Lens.Lens' CreatePermissionGroupResponse Prelude.Int
+createPermissionGroupResponse_httpStatus = Lens.lens (\CreatePermissionGroupResponse' {httpStatus} -> httpStatus) (\s@CreatePermissionGroupResponse' {} a -> s {httpStatus = a} :: CreatePermissionGroupResponse)
+
+instance Prelude.NFData CreatePermissionGroupResponse where
+  rnf CreatePermissionGroupResponse' {..} =
+    Prelude.rnf permissionGroupId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/CreateUser.hs b/gen/Amazonka/FinSpaceData/CreateUser.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/CreateUser.hs
@@ -0,0 +1,301 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FinSpaceData.CreateUser
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a new user in FinSpace.
+module Amazonka.FinSpaceData.CreateUser
+  ( -- * Creating a Request
+    CreateUser (..),
+    newCreateUser,
+
+    -- * Request Lenses
+    createUser_apiAccess,
+    createUser_apiAccessPrincipalArn,
+    createUser_clientToken,
+    createUser_firstName,
+    createUser_lastName,
+    createUser_emailAddress,
+    createUser_type,
+
+    -- * Destructuring the Response
+    CreateUserResponse (..),
+    newCreateUserResponse,
+
+    -- * Response Lenses
+    createUserResponse_userId,
+    createUserResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateUser' smart constructor.
+data CreateUser = CreateUser'
+  { -- | The option to indicate whether the user can use the
+    -- @GetProgrammaticAccessCredentials@ API to obtain credentials that can
+    -- then be used to access other FinSpace Data API operations.
+    --
+    -- -   @ENABLED@ – The user has permissions to use the APIs.
+    --
+    -- -   @DISABLED@ – The user does not have permissions to use any APIs.
+    apiAccess :: Prelude.Maybe ApiAccess,
+    -- | The ARN identifier of an AWS user or role that is allowed to call the
+    -- @GetProgrammaticAccessCredentials@ API to obtain a credentials token for
+    -- a specific FinSpace user. This must be an IAM role within your FinSpace
+    -- account.
+    apiAccessPrincipalArn :: Prelude.Maybe Prelude.Text,
+    -- | A token that ensures idempotency. This token expires in 10 minutes.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The first name of the user that you want to register.
+    firstName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The last name of the user that you want to register.
+    lastName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The email address of the user that you want to register. The email
+    -- address serves as a uniquer identifier for each user and cannot be
+    -- changed after it\'s created.
+    emailAddress :: Data.Sensitive Prelude.Text,
+    -- | The option to indicate the type of user. Use one of the following
+    -- options to specify this parameter:
+    --
+    -- -   @SUPER_USER@ – A user with permission to all the functionality and
+    --     data in FinSpace.
+    --
+    -- -   @APP_USER@ – A user with specific permissions in FinSpace. The users
+    --     are assigned permissions by adding them to a permission group.
+    type' :: UserType
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateUser' 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:
+--
+-- 'apiAccess', 'createUser_apiAccess' - The option to indicate whether the user can use the
+-- @GetProgrammaticAccessCredentials@ API to obtain credentials that can
+-- then be used to access other FinSpace Data API operations.
+--
+-- -   @ENABLED@ – The user has permissions to use the APIs.
+--
+-- -   @DISABLED@ – The user does not have permissions to use any APIs.
+--
+-- 'apiAccessPrincipalArn', 'createUser_apiAccessPrincipalArn' - The ARN identifier of an AWS user or role that is allowed to call the
+-- @GetProgrammaticAccessCredentials@ API to obtain a credentials token for
+-- a specific FinSpace user. This must be an IAM role within your FinSpace
+-- account.
+--
+-- 'clientToken', 'createUser_clientToken' - A token that ensures idempotency. This token expires in 10 minutes.
+--
+-- 'firstName', 'createUser_firstName' - The first name of the user that you want to register.
+--
+-- 'lastName', 'createUser_lastName' - The last name of the user that you want to register.
+--
+-- 'emailAddress', 'createUser_emailAddress' - The email address of the user that you want to register. The email
+-- address serves as a uniquer identifier for each user and cannot be
+-- changed after it\'s created.
+--
+-- 'type'', 'createUser_type' - The option to indicate the type of user. Use one of the following
+-- options to specify this parameter:
+--
+-- -   @SUPER_USER@ – A user with permission to all the functionality and
+--     data in FinSpace.
+--
+-- -   @APP_USER@ – A user with specific permissions in FinSpace. The users
+--     are assigned permissions by adding them to a permission group.
+newCreateUser ::
+  -- | 'emailAddress'
+  Prelude.Text ->
+  -- | 'type''
+  UserType ->
+  CreateUser
+newCreateUser pEmailAddress_ pType_ =
+  CreateUser'
+    { apiAccess = Prelude.Nothing,
+      apiAccessPrincipalArn = Prelude.Nothing,
+      clientToken = Prelude.Nothing,
+      firstName = Prelude.Nothing,
+      lastName = Prelude.Nothing,
+      emailAddress = Data._Sensitive Lens.# pEmailAddress_,
+      type' = pType_
+    }
+
+-- | The option to indicate whether the user can use the
+-- @GetProgrammaticAccessCredentials@ API to obtain credentials that can
+-- then be used to access other FinSpace Data API operations.
+--
+-- -   @ENABLED@ – The user has permissions to use the APIs.
+--
+-- -   @DISABLED@ – The user does not have permissions to use any APIs.
+createUser_apiAccess :: Lens.Lens' CreateUser (Prelude.Maybe ApiAccess)
+createUser_apiAccess = Lens.lens (\CreateUser' {apiAccess} -> apiAccess) (\s@CreateUser' {} a -> s {apiAccess = a} :: CreateUser)
+
+-- | The ARN identifier of an AWS user or role that is allowed to call the
+-- @GetProgrammaticAccessCredentials@ API to obtain a credentials token for
+-- a specific FinSpace user. This must be an IAM role within your FinSpace
+-- account.
+createUser_apiAccessPrincipalArn :: Lens.Lens' CreateUser (Prelude.Maybe Prelude.Text)
+createUser_apiAccessPrincipalArn = Lens.lens (\CreateUser' {apiAccessPrincipalArn} -> apiAccessPrincipalArn) (\s@CreateUser' {} a -> s {apiAccessPrincipalArn = a} :: CreateUser)
+
+-- | A token that ensures idempotency. This token expires in 10 minutes.
+createUser_clientToken :: Lens.Lens' CreateUser (Prelude.Maybe Prelude.Text)
+createUser_clientToken = Lens.lens (\CreateUser' {clientToken} -> clientToken) (\s@CreateUser' {} a -> s {clientToken = a} :: CreateUser)
+
+-- | The first name of the user that you want to register.
+createUser_firstName :: Lens.Lens' CreateUser (Prelude.Maybe Prelude.Text)
+createUser_firstName = Lens.lens (\CreateUser' {firstName} -> firstName) (\s@CreateUser' {} a -> s {firstName = a} :: CreateUser) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The last name of the user that you want to register.
+createUser_lastName :: Lens.Lens' CreateUser (Prelude.Maybe Prelude.Text)
+createUser_lastName = Lens.lens (\CreateUser' {lastName} -> lastName) (\s@CreateUser' {} a -> s {lastName = a} :: CreateUser) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The email address of the user that you want to register. The email
+-- address serves as a uniquer identifier for each user and cannot be
+-- changed after it\'s created.
+createUser_emailAddress :: Lens.Lens' CreateUser Prelude.Text
+createUser_emailAddress = Lens.lens (\CreateUser' {emailAddress} -> emailAddress) (\s@CreateUser' {} a -> s {emailAddress = a} :: CreateUser) Prelude.. Data._Sensitive
+
+-- | The option to indicate the type of user. Use one of the following
+-- options to specify this parameter:
+--
+-- -   @SUPER_USER@ – A user with permission to all the functionality and
+--     data in FinSpace.
+--
+-- -   @APP_USER@ – A user with specific permissions in FinSpace. The users
+--     are assigned permissions by adding them to a permission group.
+createUser_type :: Lens.Lens' CreateUser UserType
+createUser_type = Lens.lens (\CreateUser' {type'} -> type') (\s@CreateUser' {} a -> s {type' = a} :: CreateUser)
+
+instance Core.AWSRequest CreateUser where
+  type AWSResponse CreateUser = CreateUserResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateUserResponse'
+            Prelude.<$> (x Data..?> "userId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateUser where
+  hashWithSalt _salt CreateUser' {..} =
+    _salt
+      `Prelude.hashWithSalt` apiAccess
+      `Prelude.hashWithSalt` apiAccessPrincipalArn
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` firstName
+      `Prelude.hashWithSalt` lastName
+      `Prelude.hashWithSalt` emailAddress
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData CreateUser where
+  rnf CreateUser' {..} =
+    Prelude.rnf apiAccess
+      `Prelude.seq` Prelude.rnf apiAccessPrincipalArn
+      `Prelude.seq` Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf firstName
+      `Prelude.seq` Prelude.rnf lastName
+      `Prelude.seq` Prelude.rnf emailAddress
+      `Prelude.seq` Prelude.rnf type'
+
+instance Data.ToHeaders CreateUser where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateUser where
+  toJSON CreateUser' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ApiAccess" Data..=) Prelude.<$> apiAccess,
+            ("apiAccessPrincipalArn" Data..=)
+              Prelude.<$> apiAccessPrincipalArn,
+            ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("firstName" Data..=) Prelude.<$> firstName,
+            ("lastName" Data..=) Prelude.<$> lastName,
+            Prelude.Just ("emailAddress" Data..= emailAddress),
+            Prelude.Just ("type" Data..= type')
+          ]
+      )
+
+instance Data.ToPath CreateUser where
+  toPath = Prelude.const "/user"
+
+instance Data.ToQuery CreateUser where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateUserResponse' smart constructor.
+data CreateUserResponse = CreateUserResponse'
+  { -- | The unique identifier for the user.
+    userId :: 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 'CreateUserResponse' 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:
+--
+-- 'userId', 'createUserResponse_userId' - The unique identifier for the user.
+--
+-- 'httpStatus', 'createUserResponse_httpStatus' - The response's http status code.
+newCreateUserResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateUserResponse
+newCreateUserResponse pHttpStatus_ =
+  CreateUserResponse'
+    { userId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The unique identifier for the user.
+createUserResponse_userId :: Lens.Lens' CreateUserResponse (Prelude.Maybe Prelude.Text)
+createUserResponse_userId = Lens.lens (\CreateUserResponse' {userId} -> userId) (\s@CreateUserResponse' {} a -> s {userId = a} :: CreateUserResponse)
+
+-- | The response's http status code.
+createUserResponse_httpStatus :: Lens.Lens' CreateUserResponse Prelude.Int
+createUserResponse_httpStatus = Lens.lens (\CreateUserResponse' {httpStatus} -> httpStatus) (\s@CreateUserResponse' {} a -> s {httpStatus = a} :: CreateUserResponse)
+
+instance Prelude.NFData CreateUserResponse where
+  rnf CreateUserResponse' {..} =
+    Prelude.rnf userId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/DeleteDataset.hs b/gen/Amazonka/FinSpaceData/DeleteDataset.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/DeleteDataset.hs
@@ -0,0 +1,179 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FinSpaceData.DeleteDataset
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a FinSpace Dataset.
+module Amazonka.FinSpaceData.DeleteDataset
+  ( -- * Creating a Request
+    DeleteDataset (..),
+    newDeleteDataset,
+
+    -- * Request Lenses
+    deleteDataset_clientToken,
+    deleteDataset_datasetId,
+
+    -- * Destructuring the Response
+    DeleteDatasetResponse (..),
+    newDeleteDatasetResponse,
+
+    -- * Response Lenses
+    deleteDatasetResponse_datasetId,
+    deleteDatasetResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The request for a DeleteDataset operation.
+--
+-- /See:/ 'newDeleteDataset' smart constructor.
+data DeleteDataset = DeleteDataset'
+  { -- | A token that ensures idempotency. This token expires in 10 minutes.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier of the Dataset to be deleted.
+    datasetId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteDataset' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'deleteDataset_clientToken' - A token that ensures idempotency. This token expires in 10 minutes.
+--
+-- 'datasetId', 'deleteDataset_datasetId' - The unique identifier of the Dataset to be deleted.
+newDeleteDataset ::
+  -- | 'datasetId'
+  Prelude.Text ->
+  DeleteDataset
+newDeleteDataset pDatasetId_ =
+  DeleteDataset'
+    { clientToken = Prelude.Nothing,
+      datasetId = pDatasetId_
+    }
+
+-- | A token that ensures idempotency. This token expires in 10 minutes.
+deleteDataset_clientToken :: Lens.Lens' DeleteDataset (Prelude.Maybe Prelude.Text)
+deleteDataset_clientToken = Lens.lens (\DeleteDataset' {clientToken} -> clientToken) (\s@DeleteDataset' {} a -> s {clientToken = a} :: DeleteDataset)
+
+-- | The unique identifier of the Dataset to be deleted.
+deleteDataset_datasetId :: Lens.Lens' DeleteDataset Prelude.Text
+deleteDataset_datasetId = Lens.lens (\DeleteDataset' {datasetId} -> datasetId) (\s@DeleteDataset' {} a -> s {datasetId = a} :: DeleteDataset)
+
+instance Core.AWSRequest DeleteDataset where
+  type
+    AWSResponse DeleteDataset =
+      DeleteDatasetResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteDatasetResponse'
+            Prelude.<$> (x Data..?> "datasetId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteDataset where
+  hashWithSalt _salt DeleteDataset' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` datasetId
+
+instance Prelude.NFData DeleteDataset where
+  rnf DeleteDataset' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf datasetId
+
+instance Data.ToHeaders DeleteDataset where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteDataset where
+  toPath DeleteDataset' {..} =
+    Prelude.mconcat
+      ["/datasetsv2/", Data.toBS datasetId]
+
+instance Data.ToQuery DeleteDataset where
+  toQuery DeleteDataset' {..} =
+    Prelude.mconcat ["clientToken" Data.=: clientToken]
+
+-- | The response from an DeleteDataset operation
+--
+-- /See:/ 'newDeleteDatasetResponse' smart constructor.
+data DeleteDatasetResponse = DeleteDatasetResponse'
+  { -- | The unique identifier for the deleted Dataset.
+    datasetId :: 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 'DeleteDatasetResponse' 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:
+--
+-- 'datasetId', 'deleteDatasetResponse_datasetId' - The unique identifier for the deleted Dataset.
+--
+-- 'httpStatus', 'deleteDatasetResponse_httpStatus' - The response's http status code.
+newDeleteDatasetResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteDatasetResponse
+newDeleteDatasetResponse pHttpStatus_ =
+  DeleteDatasetResponse'
+    { datasetId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The unique identifier for the deleted Dataset.
+deleteDatasetResponse_datasetId :: Lens.Lens' DeleteDatasetResponse (Prelude.Maybe Prelude.Text)
+deleteDatasetResponse_datasetId = Lens.lens (\DeleteDatasetResponse' {datasetId} -> datasetId) (\s@DeleteDatasetResponse' {} a -> s {datasetId = a} :: DeleteDatasetResponse)
+
+-- | The response's http status code.
+deleteDatasetResponse_httpStatus :: Lens.Lens' DeleteDatasetResponse Prelude.Int
+deleteDatasetResponse_httpStatus = Lens.lens (\DeleteDatasetResponse' {httpStatus} -> httpStatus) (\s@DeleteDatasetResponse' {} a -> s {httpStatus = a} :: DeleteDatasetResponse)
+
+instance Prelude.NFData DeleteDatasetResponse where
+  rnf DeleteDatasetResponse' {..} =
+    Prelude.rnf datasetId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/DeletePermissionGroup.hs b/gen/Amazonka/FinSpaceData/DeletePermissionGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/DeletePermissionGroup.hs
@@ -0,0 +1,177 @@
+{-# 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.FinSpaceData.DeletePermissionGroup
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a permission group. This action is irreversible.
+module Amazonka.FinSpaceData.DeletePermissionGroup
+  ( -- * Creating a Request
+    DeletePermissionGroup (..),
+    newDeletePermissionGroup,
+
+    -- * Request Lenses
+    deletePermissionGroup_clientToken,
+    deletePermissionGroup_permissionGroupId,
+
+    -- * Destructuring the Response
+    DeletePermissionGroupResponse (..),
+    newDeletePermissionGroupResponse,
+
+    -- * Response Lenses
+    deletePermissionGroupResponse_permissionGroupId,
+    deletePermissionGroupResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeletePermissionGroup' smart constructor.
+data DeletePermissionGroup = DeletePermissionGroup'
+  { -- | A token that ensures idempotency. This token expires in 10 minutes.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier for the permission group that you want to delete.
+    permissionGroupId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeletePermissionGroup' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'deletePermissionGroup_clientToken' - A token that ensures idempotency. This token expires in 10 minutes.
+--
+-- 'permissionGroupId', 'deletePermissionGroup_permissionGroupId' - The unique identifier for the permission group that you want to delete.
+newDeletePermissionGroup ::
+  -- | 'permissionGroupId'
+  Prelude.Text ->
+  DeletePermissionGroup
+newDeletePermissionGroup pPermissionGroupId_ =
+  DeletePermissionGroup'
+    { clientToken =
+        Prelude.Nothing,
+      permissionGroupId = pPermissionGroupId_
+    }
+
+-- | A token that ensures idempotency. This token expires in 10 minutes.
+deletePermissionGroup_clientToken :: Lens.Lens' DeletePermissionGroup (Prelude.Maybe Prelude.Text)
+deletePermissionGroup_clientToken = Lens.lens (\DeletePermissionGroup' {clientToken} -> clientToken) (\s@DeletePermissionGroup' {} a -> s {clientToken = a} :: DeletePermissionGroup)
+
+-- | The unique identifier for the permission group that you want to delete.
+deletePermissionGroup_permissionGroupId :: Lens.Lens' DeletePermissionGroup Prelude.Text
+deletePermissionGroup_permissionGroupId = Lens.lens (\DeletePermissionGroup' {permissionGroupId} -> permissionGroupId) (\s@DeletePermissionGroup' {} a -> s {permissionGroupId = a} :: DeletePermissionGroup)
+
+instance Core.AWSRequest DeletePermissionGroup where
+  type
+    AWSResponse DeletePermissionGroup =
+      DeletePermissionGroupResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeletePermissionGroupResponse'
+            Prelude.<$> (x Data..?> "permissionGroupId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeletePermissionGroup where
+  hashWithSalt _salt DeletePermissionGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` permissionGroupId
+
+instance Prelude.NFData DeletePermissionGroup where
+  rnf DeletePermissionGroup' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf permissionGroupId
+
+instance Data.ToHeaders DeletePermissionGroup where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeletePermissionGroup where
+  toPath DeletePermissionGroup' {..} =
+    Prelude.mconcat
+      ["/permission-group/", Data.toBS permissionGroupId]
+
+instance Data.ToQuery DeletePermissionGroup where
+  toQuery DeletePermissionGroup' {..} =
+    Prelude.mconcat ["clientToken" Data.=: clientToken]
+
+-- | /See:/ 'newDeletePermissionGroupResponse' smart constructor.
+data DeletePermissionGroupResponse = DeletePermissionGroupResponse'
+  { -- | The unique identifier for the deleted permission group.
+    permissionGroupId :: 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 'DeletePermissionGroupResponse' 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:
+--
+-- 'permissionGroupId', 'deletePermissionGroupResponse_permissionGroupId' - The unique identifier for the deleted permission group.
+--
+-- 'httpStatus', 'deletePermissionGroupResponse_httpStatus' - The response's http status code.
+newDeletePermissionGroupResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeletePermissionGroupResponse
+newDeletePermissionGroupResponse pHttpStatus_ =
+  DeletePermissionGroupResponse'
+    { permissionGroupId =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The unique identifier for the deleted permission group.
+deletePermissionGroupResponse_permissionGroupId :: Lens.Lens' DeletePermissionGroupResponse (Prelude.Maybe Prelude.Text)
+deletePermissionGroupResponse_permissionGroupId = Lens.lens (\DeletePermissionGroupResponse' {permissionGroupId} -> permissionGroupId) (\s@DeletePermissionGroupResponse' {} a -> s {permissionGroupId = a} :: DeletePermissionGroupResponse)
+
+-- | The response's http status code.
+deletePermissionGroupResponse_httpStatus :: Lens.Lens' DeletePermissionGroupResponse Prelude.Int
+deletePermissionGroupResponse_httpStatus = Lens.lens (\DeletePermissionGroupResponse' {httpStatus} -> httpStatus) (\s@DeletePermissionGroupResponse' {} a -> s {httpStatus = a} :: DeletePermissionGroupResponse)
+
+instance Prelude.NFData DeletePermissionGroupResponse where
+  rnf DeletePermissionGroupResponse' {..} =
+    Prelude.rnf permissionGroupId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/DisableUser.hs b/gen/Amazonka/FinSpaceData/DisableUser.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/DisableUser.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.FinSpaceData.DisableUser
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Denies access to the FinSpace web application and API for the specified
+-- user.
+module Amazonka.FinSpaceData.DisableUser
+  ( -- * Creating a Request
+    DisableUser (..),
+    newDisableUser,
+
+    -- * Request Lenses
+    disableUser_clientToken,
+    disableUser_userId,
+
+    -- * Destructuring the Response
+    DisableUserResponse (..),
+    newDisableUserResponse,
+
+    -- * Response Lenses
+    disableUserResponse_userId,
+    disableUserResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDisableUser' smart constructor.
+data DisableUser = DisableUser'
+  { -- | A token that ensures idempotency. This token expires in 10 minutes.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier for the user account that you want to disable.
+    userId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DisableUser' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'disableUser_clientToken' - A token that ensures idempotency. This token expires in 10 minutes.
+--
+-- 'userId', 'disableUser_userId' - The unique identifier for the user account that you want to disable.
+newDisableUser ::
+  -- | 'userId'
+  Prelude.Text ->
+  DisableUser
+newDisableUser pUserId_ =
+  DisableUser'
+    { clientToken = Prelude.Nothing,
+      userId = pUserId_
+    }
+
+-- | A token that ensures idempotency. This token expires in 10 minutes.
+disableUser_clientToken :: Lens.Lens' DisableUser (Prelude.Maybe Prelude.Text)
+disableUser_clientToken = Lens.lens (\DisableUser' {clientToken} -> clientToken) (\s@DisableUser' {} a -> s {clientToken = a} :: DisableUser)
+
+-- | The unique identifier for the user account that you want to disable.
+disableUser_userId :: Lens.Lens' DisableUser Prelude.Text
+disableUser_userId = Lens.lens (\DisableUser' {userId} -> userId) (\s@DisableUser' {} a -> s {userId = a} :: DisableUser)
+
+instance Core.AWSRequest DisableUser where
+  type AWSResponse DisableUser = DisableUserResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DisableUserResponse'
+            Prelude.<$> (x Data..?> "userId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DisableUser where
+  hashWithSalt _salt DisableUser' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` userId
+
+instance Prelude.NFData DisableUser where
+  rnf DisableUser' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf userId
+
+instance Data.ToHeaders DisableUser where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DisableUser where
+  toJSON DisableUser' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("clientToken" Data..=) Prelude.<$> clientToken]
+      )
+
+instance Data.ToPath DisableUser where
+  toPath DisableUser' {..} =
+    Prelude.mconcat
+      ["/user/", Data.toBS userId, "/disable"]
+
+instance Data.ToQuery DisableUser where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDisableUserResponse' smart constructor.
+data DisableUserResponse = DisableUserResponse'
+  { -- | The unique identifier for the disabled user account.
+    userId :: 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 'DisableUserResponse' 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:
+--
+-- 'userId', 'disableUserResponse_userId' - The unique identifier for the disabled user account.
+--
+-- 'httpStatus', 'disableUserResponse_httpStatus' - The response's http status code.
+newDisableUserResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DisableUserResponse
+newDisableUserResponse pHttpStatus_ =
+  DisableUserResponse'
+    { userId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The unique identifier for the disabled user account.
+disableUserResponse_userId :: Lens.Lens' DisableUserResponse (Prelude.Maybe Prelude.Text)
+disableUserResponse_userId = Lens.lens (\DisableUserResponse' {userId} -> userId) (\s@DisableUserResponse' {} a -> s {userId = a} :: DisableUserResponse)
+
+-- | The response's http status code.
+disableUserResponse_httpStatus :: Lens.Lens' DisableUserResponse Prelude.Int
+disableUserResponse_httpStatus = Lens.lens (\DisableUserResponse' {httpStatus} -> httpStatus) (\s@DisableUserResponse' {} a -> s {httpStatus = a} :: DisableUserResponse)
+
+instance Prelude.NFData DisableUserResponse where
+  rnf DisableUserResponse' {..} =
+    Prelude.rnf userId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/DisassociateUserFromPermissionGroup.hs b/gen/Amazonka/FinSpaceData/DisassociateUserFromPermissionGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/DisassociateUserFromPermissionGroup.hs
@@ -0,0 +1,210 @@
+{-# 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.FinSpaceData.DisassociateUserFromPermissionGroup
+-- 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 a user account from a permission group.
+module Amazonka.FinSpaceData.DisassociateUserFromPermissionGroup
+  ( -- * Creating a Request
+    DisassociateUserFromPermissionGroup (..),
+    newDisassociateUserFromPermissionGroup,
+
+    -- * Request Lenses
+    disassociateUserFromPermissionGroup_clientToken,
+    disassociateUserFromPermissionGroup_permissionGroupId,
+    disassociateUserFromPermissionGroup_userId,
+
+    -- * Destructuring the Response
+    DisassociateUserFromPermissionGroupResponse (..),
+    newDisassociateUserFromPermissionGroupResponse,
+
+    -- * Response Lenses
+    disassociateUserFromPermissionGroupResponse_statusCode,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDisassociateUserFromPermissionGroup' smart constructor.
+data DisassociateUserFromPermissionGroup = DisassociateUserFromPermissionGroup'
+  { -- | A token that ensures idempotency. This token expires in 10 minutes.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier for the permission group.
+    permissionGroupId :: Prelude.Text,
+    -- | The unique identifier for the user.
+    userId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DisassociateUserFromPermissionGroup' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'disassociateUserFromPermissionGroup_clientToken' - A token that ensures idempotency. This token expires in 10 minutes.
+--
+-- 'permissionGroupId', 'disassociateUserFromPermissionGroup_permissionGroupId' - The unique identifier for the permission group.
+--
+-- 'userId', 'disassociateUserFromPermissionGroup_userId' - The unique identifier for the user.
+newDisassociateUserFromPermissionGroup ::
+  -- | 'permissionGroupId'
+  Prelude.Text ->
+  -- | 'userId'
+  Prelude.Text ->
+  DisassociateUserFromPermissionGroup
+newDisassociateUserFromPermissionGroup
+  pPermissionGroupId_
+  pUserId_ =
+    DisassociateUserFromPermissionGroup'
+      { clientToken =
+          Prelude.Nothing,
+        permissionGroupId =
+          pPermissionGroupId_,
+        userId = pUserId_
+      }
+
+-- | A token that ensures idempotency. This token expires in 10 minutes.
+disassociateUserFromPermissionGroup_clientToken :: Lens.Lens' DisassociateUserFromPermissionGroup (Prelude.Maybe Prelude.Text)
+disassociateUserFromPermissionGroup_clientToken = Lens.lens (\DisassociateUserFromPermissionGroup' {clientToken} -> clientToken) (\s@DisassociateUserFromPermissionGroup' {} a -> s {clientToken = a} :: DisassociateUserFromPermissionGroup)
+
+-- | The unique identifier for the permission group.
+disassociateUserFromPermissionGroup_permissionGroupId :: Lens.Lens' DisassociateUserFromPermissionGroup Prelude.Text
+disassociateUserFromPermissionGroup_permissionGroupId = Lens.lens (\DisassociateUserFromPermissionGroup' {permissionGroupId} -> permissionGroupId) (\s@DisassociateUserFromPermissionGroup' {} a -> s {permissionGroupId = a} :: DisassociateUserFromPermissionGroup)
+
+-- | The unique identifier for the user.
+disassociateUserFromPermissionGroup_userId :: Lens.Lens' DisassociateUserFromPermissionGroup Prelude.Text
+disassociateUserFromPermissionGroup_userId = Lens.lens (\DisassociateUserFromPermissionGroup' {userId} -> userId) (\s@DisassociateUserFromPermissionGroup' {} a -> s {userId = a} :: DisassociateUserFromPermissionGroup)
+
+instance
+  Core.AWSRequest
+    DisassociateUserFromPermissionGroup
+  where
+  type
+    AWSResponse DisassociateUserFromPermissionGroup =
+      DisassociateUserFromPermissionGroupResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DisassociateUserFromPermissionGroupResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    DisassociateUserFromPermissionGroup
+  where
+  hashWithSalt
+    _salt
+    DisassociateUserFromPermissionGroup' {..} =
+      _salt
+        `Prelude.hashWithSalt` clientToken
+        `Prelude.hashWithSalt` permissionGroupId
+        `Prelude.hashWithSalt` userId
+
+instance
+  Prelude.NFData
+    DisassociateUserFromPermissionGroup
+  where
+  rnf DisassociateUserFromPermissionGroup' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf permissionGroupId
+      `Prelude.seq` Prelude.rnf userId
+
+instance
+  Data.ToHeaders
+    DisassociateUserFromPermissionGroup
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance
+  Data.ToPath
+    DisassociateUserFromPermissionGroup
+  where
+  toPath DisassociateUserFromPermissionGroup' {..} =
+    Prelude.mconcat
+      [ "/permission-group/",
+        Data.toBS permissionGroupId,
+        "/users/",
+        Data.toBS userId
+      ]
+
+instance
+  Data.ToQuery
+    DisassociateUserFromPermissionGroup
+  where
+  toQuery DisassociateUserFromPermissionGroup' {..} =
+    Prelude.mconcat ["clientToken" Data.=: clientToken]
+
+-- | /See:/ 'newDisassociateUserFromPermissionGroupResponse' smart constructor.
+data DisassociateUserFromPermissionGroupResponse = DisassociateUserFromPermissionGroupResponse'
+  { -- | The returned status code of the response.
+    statusCode :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DisassociateUserFromPermissionGroupResponse' 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:
+--
+-- 'statusCode', 'disassociateUserFromPermissionGroupResponse_statusCode' - The returned status code of the response.
+newDisassociateUserFromPermissionGroupResponse ::
+  -- | 'statusCode'
+  Prelude.Int ->
+  DisassociateUserFromPermissionGroupResponse
+newDisassociateUserFromPermissionGroupResponse
+  pStatusCode_ =
+    DisassociateUserFromPermissionGroupResponse'
+      { statusCode =
+          pStatusCode_
+      }
+
+-- | The returned status code of the response.
+disassociateUserFromPermissionGroupResponse_statusCode :: Lens.Lens' DisassociateUserFromPermissionGroupResponse Prelude.Int
+disassociateUserFromPermissionGroupResponse_statusCode = Lens.lens (\DisassociateUserFromPermissionGroupResponse' {statusCode} -> statusCode) (\s@DisassociateUserFromPermissionGroupResponse' {} a -> s {statusCode = a} :: DisassociateUserFromPermissionGroupResponse)
+
+instance
+  Prelude.NFData
+    DisassociateUserFromPermissionGroupResponse
+  where
+  rnf DisassociateUserFromPermissionGroupResponse' {..} =
+    Prelude.rnf statusCode
diff --git a/gen/Amazonka/FinSpaceData/EnableUser.hs b/gen/Amazonka/FinSpaceData/EnableUser.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/EnableUser.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.FinSpaceData.EnableUser
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Allows the specified user to access the FinSpace web application and
+-- API.
+module Amazonka.FinSpaceData.EnableUser
+  ( -- * Creating a Request
+    EnableUser (..),
+    newEnableUser,
+
+    -- * Request Lenses
+    enableUser_clientToken,
+    enableUser_userId,
+
+    -- * Destructuring the Response
+    EnableUserResponse (..),
+    newEnableUserResponse,
+
+    -- * Response Lenses
+    enableUserResponse_userId,
+    enableUserResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newEnableUser' smart constructor.
+data EnableUser = EnableUser'
+  { -- | A token that ensures idempotency. This token expires in 10 minutes.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier for the user account that you want to enable.
+    userId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EnableUser' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'enableUser_clientToken' - A token that ensures idempotency. This token expires in 10 minutes.
+--
+-- 'userId', 'enableUser_userId' - The unique identifier for the user account that you want to enable.
+newEnableUser ::
+  -- | 'userId'
+  Prelude.Text ->
+  EnableUser
+newEnableUser pUserId_ =
+  EnableUser'
+    { clientToken = Prelude.Nothing,
+      userId = pUserId_
+    }
+
+-- | A token that ensures idempotency. This token expires in 10 minutes.
+enableUser_clientToken :: Lens.Lens' EnableUser (Prelude.Maybe Prelude.Text)
+enableUser_clientToken = Lens.lens (\EnableUser' {clientToken} -> clientToken) (\s@EnableUser' {} a -> s {clientToken = a} :: EnableUser)
+
+-- | The unique identifier for the user account that you want to enable.
+enableUser_userId :: Lens.Lens' EnableUser Prelude.Text
+enableUser_userId = Lens.lens (\EnableUser' {userId} -> userId) (\s@EnableUser' {} a -> s {userId = a} :: EnableUser)
+
+instance Core.AWSRequest EnableUser where
+  type AWSResponse EnableUser = EnableUserResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          EnableUserResponse'
+            Prelude.<$> (x Data..?> "userId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable EnableUser where
+  hashWithSalt _salt EnableUser' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` userId
+
+instance Prelude.NFData EnableUser where
+  rnf EnableUser' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf userId
+
+instance Data.ToHeaders EnableUser where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON EnableUser where
+  toJSON EnableUser' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("clientToken" Data..=) Prelude.<$> clientToken]
+      )
+
+instance Data.ToPath EnableUser where
+  toPath EnableUser' {..} =
+    Prelude.mconcat
+      ["/user/", Data.toBS userId, "/enable"]
+
+instance Data.ToQuery EnableUser where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newEnableUserResponse' smart constructor.
+data EnableUserResponse = EnableUserResponse'
+  { -- | The unique identifier for the enabled user account.
+    userId :: 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 'EnableUserResponse' 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:
+--
+-- 'userId', 'enableUserResponse_userId' - The unique identifier for the enabled user account.
+--
+-- 'httpStatus', 'enableUserResponse_httpStatus' - The response's http status code.
+newEnableUserResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  EnableUserResponse
+newEnableUserResponse pHttpStatus_ =
+  EnableUserResponse'
+    { userId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The unique identifier for the enabled user account.
+enableUserResponse_userId :: Lens.Lens' EnableUserResponse (Prelude.Maybe Prelude.Text)
+enableUserResponse_userId = Lens.lens (\EnableUserResponse' {userId} -> userId) (\s@EnableUserResponse' {} a -> s {userId = a} :: EnableUserResponse)
+
+-- | The response's http status code.
+enableUserResponse_httpStatus :: Lens.Lens' EnableUserResponse Prelude.Int
+enableUserResponse_httpStatus = Lens.lens (\EnableUserResponse' {httpStatus} -> httpStatus) (\s@EnableUserResponse' {} a -> s {httpStatus = a} :: EnableUserResponse)
+
+instance Prelude.NFData EnableUserResponse where
+  rnf EnableUserResponse' {..} =
+    Prelude.rnf userId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/GetChangeset.hs b/gen/Amazonka/FinSpaceData/GetChangeset.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/GetChangeset.hs
@@ -0,0 +1,378 @@
+{-# 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.FinSpaceData.GetChangeset
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Get information about a Changeset.
+module Amazonka.FinSpaceData.GetChangeset
+  ( -- * Creating a Request
+    GetChangeset (..),
+    newGetChangeset,
+
+    -- * Request Lenses
+    getChangeset_datasetId,
+    getChangeset_changesetId,
+
+    -- * Destructuring the Response
+    GetChangesetResponse (..),
+    newGetChangesetResponse,
+
+    -- * Response Lenses
+    getChangesetResponse_activeFromTimestamp,
+    getChangesetResponse_activeUntilTimestamp,
+    getChangesetResponse_changeType,
+    getChangesetResponse_changesetArn,
+    getChangesetResponse_changesetId,
+    getChangesetResponse_createTime,
+    getChangesetResponse_datasetId,
+    getChangesetResponse_errorInfo,
+    getChangesetResponse_formatParams,
+    getChangesetResponse_sourceParams,
+    getChangesetResponse_status,
+    getChangesetResponse_updatedByChangesetId,
+    getChangesetResponse_updatesChangesetId,
+    getChangesetResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Request to describe a changeset.
+--
+-- /See:/ 'newGetChangeset' smart constructor.
+data GetChangeset = GetChangeset'
+  { -- | The unique identifier for the FinSpace Dataset where the Changeset is
+    -- created.
+    datasetId :: Prelude.Text,
+    -- | The unique identifier of the Changeset for which to get data.
+    changesetId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetChangeset' 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:
+--
+-- 'datasetId', 'getChangeset_datasetId' - The unique identifier for the FinSpace Dataset where the Changeset is
+-- created.
+--
+-- 'changesetId', 'getChangeset_changesetId' - The unique identifier of the Changeset for which to get data.
+newGetChangeset ::
+  -- | 'datasetId'
+  Prelude.Text ->
+  -- | 'changesetId'
+  Prelude.Text ->
+  GetChangeset
+newGetChangeset pDatasetId_ pChangesetId_ =
+  GetChangeset'
+    { datasetId = pDatasetId_,
+      changesetId = pChangesetId_
+    }
+
+-- | The unique identifier for the FinSpace Dataset where the Changeset is
+-- created.
+getChangeset_datasetId :: Lens.Lens' GetChangeset Prelude.Text
+getChangeset_datasetId = Lens.lens (\GetChangeset' {datasetId} -> datasetId) (\s@GetChangeset' {} a -> s {datasetId = a} :: GetChangeset)
+
+-- | The unique identifier of the Changeset for which to get data.
+getChangeset_changesetId :: Lens.Lens' GetChangeset Prelude.Text
+getChangeset_changesetId = Lens.lens (\GetChangeset' {changesetId} -> changesetId) (\s@GetChangeset' {} a -> s {changesetId = a} :: GetChangeset)
+
+instance Core.AWSRequest GetChangeset where
+  type AWSResponse GetChangeset = GetChangesetResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetChangesetResponse'
+            Prelude.<$> (x Data..?> "activeFromTimestamp")
+            Prelude.<*> (x Data..?> "activeUntilTimestamp")
+            Prelude.<*> (x Data..?> "changeType")
+            Prelude.<*> (x Data..?> "changesetArn")
+            Prelude.<*> (x Data..?> "changesetId")
+            Prelude.<*> (x Data..?> "createTime")
+            Prelude.<*> (x Data..?> "datasetId")
+            Prelude.<*> (x Data..?> "errorInfo")
+            Prelude.<*> (x Data..?> "formatParams" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "sourceParams" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "status")
+            Prelude.<*> (x Data..?> "updatedByChangesetId")
+            Prelude.<*> (x Data..?> "updatesChangesetId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetChangeset where
+  hashWithSalt _salt GetChangeset' {..} =
+    _salt
+      `Prelude.hashWithSalt` datasetId
+      `Prelude.hashWithSalt` changesetId
+
+instance Prelude.NFData GetChangeset where
+  rnf GetChangeset' {..} =
+    Prelude.rnf datasetId
+      `Prelude.seq` Prelude.rnf changesetId
+
+instance Data.ToHeaders GetChangeset where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetChangeset where
+  toPath GetChangeset' {..} =
+    Prelude.mconcat
+      [ "/datasets/",
+        Data.toBS datasetId,
+        "/changesetsv2/",
+        Data.toBS changesetId
+      ]
+
+instance Data.ToQuery GetChangeset where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | The response from a describe changeset operation
+--
+-- /See:/ 'newGetChangesetResponse' smart constructor.
+data GetChangesetResponse = GetChangesetResponse'
+  { -- | Beginning time from which the Changeset is active. The value is
+    -- determined as epoch time in milliseconds. For example, the value for
+    -- Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+    activeFromTimestamp :: Prelude.Maybe Prelude.Integer,
+    -- | Time until which the Changeset is active. The value is determined as
+    -- epoch time in milliseconds. For example, the value for Monday, November
+    -- 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+    activeUntilTimestamp :: Prelude.Maybe Prelude.Integer,
+    -- | Type that indicates how a Changeset is applied to a Dataset.
+    --
+    -- -   @REPLACE@ – Changeset is considered as a replacement to all prior
+    --     loaded Changesets.
+    --
+    -- -   @APPEND@ – Changeset is considered as an addition to the end of all
+    --     prior loaded Changesets.
+    --
+    -- -   @MODIFY@ – Changeset is considered as a replacement to a specific
+    --     prior ingested Changeset.
+    changeType :: Prelude.Maybe ChangeType,
+    -- | The ARN identifier of the Changeset.
+    changesetArn :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier for a Changeset.
+    changesetId :: Prelude.Maybe Prelude.Text,
+    -- | The timestamp at which the Changeset was created in FinSpace. The value
+    -- is determined as epoch time in milliseconds. For example, the value for
+    -- Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+    createTime :: Prelude.Maybe Prelude.Integer,
+    -- | The unique identifier for the FinSpace Dataset where the Changeset is
+    -- created.
+    datasetId :: Prelude.Maybe Prelude.Text,
+    -- | The structure with error messages.
+    errorInfo :: Prelude.Maybe ChangesetErrorInfo,
+    -- | Structure of the source file(s).
+    formatParams :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | Options that define the location of the data being ingested.
+    sourceParams :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The status of Changeset creation operation.
+    status :: Prelude.Maybe IngestionStatus,
+    -- | The unique identifier of the updated Changeset.
+    updatedByChangesetId :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier of the Changeset that is being updated.
+    updatesChangesetId :: 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 'GetChangesetResponse' 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:
+--
+-- 'activeFromTimestamp', 'getChangesetResponse_activeFromTimestamp' - Beginning time from which the Changeset is active. The value is
+-- determined as epoch time in milliseconds. For example, the value for
+-- Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+--
+-- 'activeUntilTimestamp', 'getChangesetResponse_activeUntilTimestamp' - Time until which the Changeset is active. The value is determined as
+-- epoch time in milliseconds. For example, the value for Monday, November
+-- 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+--
+-- 'changeType', 'getChangesetResponse_changeType' - Type that indicates how a Changeset is applied to a Dataset.
+--
+-- -   @REPLACE@ – Changeset is considered as a replacement to all prior
+--     loaded Changesets.
+--
+-- -   @APPEND@ – Changeset is considered as an addition to the end of all
+--     prior loaded Changesets.
+--
+-- -   @MODIFY@ – Changeset is considered as a replacement to a specific
+--     prior ingested Changeset.
+--
+-- 'changesetArn', 'getChangesetResponse_changesetArn' - The ARN identifier of the Changeset.
+--
+-- 'changesetId', 'getChangesetResponse_changesetId' - The unique identifier for a Changeset.
+--
+-- 'createTime', 'getChangesetResponse_createTime' - The timestamp at which the Changeset was created in FinSpace. The value
+-- is determined as epoch time in milliseconds. For example, the value for
+-- Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+--
+-- 'datasetId', 'getChangesetResponse_datasetId' - The unique identifier for the FinSpace Dataset where the Changeset is
+-- created.
+--
+-- 'errorInfo', 'getChangesetResponse_errorInfo' - The structure with error messages.
+--
+-- 'formatParams', 'getChangesetResponse_formatParams' - Structure of the source file(s).
+--
+-- 'sourceParams', 'getChangesetResponse_sourceParams' - Options that define the location of the data being ingested.
+--
+-- 'status', 'getChangesetResponse_status' - The status of Changeset creation operation.
+--
+-- 'updatedByChangesetId', 'getChangesetResponse_updatedByChangesetId' - The unique identifier of the updated Changeset.
+--
+-- 'updatesChangesetId', 'getChangesetResponse_updatesChangesetId' - The unique identifier of the Changeset that is being updated.
+--
+-- 'httpStatus', 'getChangesetResponse_httpStatus' - The response's http status code.
+newGetChangesetResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetChangesetResponse
+newGetChangesetResponse pHttpStatus_ =
+  GetChangesetResponse'
+    { activeFromTimestamp =
+        Prelude.Nothing,
+      activeUntilTimestamp = Prelude.Nothing,
+      changeType = Prelude.Nothing,
+      changesetArn = Prelude.Nothing,
+      changesetId = Prelude.Nothing,
+      createTime = Prelude.Nothing,
+      datasetId = Prelude.Nothing,
+      errorInfo = Prelude.Nothing,
+      formatParams = Prelude.Nothing,
+      sourceParams = Prelude.Nothing,
+      status = Prelude.Nothing,
+      updatedByChangesetId = Prelude.Nothing,
+      updatesChangesetId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Beginning time from which the Changeset is active. The value is
+-- determined as epoch time in milliseconds. For example, the value for
+-- Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+getChangesetResponse_activeFromTimestamp :: Lens.Lens' GetChangesetResponse (Prelude.Maybe Prelude.Integer)
+getChangesetResponse_activeFromTimestamp = Lens.lens (\GetChangesetResponse' {activeFromTimestamp} -> activeFromTimestamp) (\s@GetChangesetResponse' {} a -> s {activeFromTimestamp = a} :: GetChangesetResponse)
+
+-- | Time until which the Changeset is active. The value is determined as
+-- epoch time in milliseconds. For example, the value for Monday, November
+-- 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+getChangesetResponse_activeUntilTimestamp :: Lens.Lens' GetChangesetResponse (Prelude.Maybe Prelude.Integer)
+getChangesetResponse_activeUntilTimestamp = Lens.lens (\GetChangesetResponse' {activeUntilTimestamp} -> activeUntilTimestamp) (\s@GetChangesetResponse' {} a -> s {activeUntilTimestamp = a} :: GetChangesetResponse)
+
+-- | Type that indicates how a Changeset is applied to a Dataset.
+--
+-- -   @REPLACE@ – Changeset is considered as a replacement to all prior
+--     loaded Changesets.
+--
+-- -   @APPEND@ – Changeset is considered as an addition to the end of all
+--     prior loaded Changesets.
+--
+-- -   @MODIFY@ – Changeset is considered as a replacement to a specific
+--     prior ingested Changeset.
+getChangesetResponse_changeType :: Lens.Lens' GetChangesetResponse (Prelude.Maybe ChangeType)
+getChangesetResponse_changeType = Lens.lens (\GetChangesetResponse' {changeType} -> changeType) (\s@GetChangesetResponse' {} a -> s {changeType = a} :: GetChangesetResponse)
+
+-- | The ARN identifier of the Changeset.
+getChangesetResponse_changesetArn :: Lens.Lens' GetChangesetResponse (Prelude.Maybe Prelude.Text)
+getChangesetResponse_changesetArn = Lens.lens (\GetChangesetResponse' {changesetArn} -> changesetArn) (\s@GetChangesetResponse' {} a -> s {changesetArn = a} :: GetChangesetResponse)
+
+-- | The unique identifier for a Changeset.
+getChangesetResponse_changesetId :: Lens.Lens' GetChangesetResponse (Prelude.Maybe Prelude.Text)
+getChangesetResponse_changesetId = Lens.lens (\GetChangesetResponse' {changesetId} -> changesetId) (\s@GetChangesetResponse' {} a -> s {changesetId = a} :: GetChangesetResponse)
+
+-- | The timestamp at which the Changeset was created in FinSpace. The value
+-- is determined as epoch time in milliseconds. For example, the value for
+-- Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+getChangesetResponse_createTime :: Lens.Lens' GetChangesetResponse (Prelude.Maybe Prelude.Integer)
+getChangesetResponse_createTime = Lens.lens (\GetChangesetResponse' {createTime} -> createTime) (\s@GetChangesetResponse' {} a -> s {createTime = a} :: GetChangesetResponse)
+
+-- | The unique identifier for the FinSpace Dataset where the Changeset is
+-- created.
+getChangesetResponse_datasetId :: Lens.Lens' GetChangesetResponse (Prelude.Maybe Prelude.Text)
+getChangesetResponse_datasetId = Lens.lens (\GetChangesetResponse' {datasetId} -> datasetId) (\s@GetChangesetResponse' {} a -> s {datasetId = a} :: GetChangesetResponse)
+
+-- | The structure with error messages.
+getChangesetResponse_errorInfo :: Lens.Lens' GetChangesetResponse (Prelude.Maybe ChangesetErrorInfo)
+getChangesetResponse_errorInfo = Lens.lens (\GetChangesetResponse' {errorInfo} -> errorInfo) (\s@GetChangesetResponse' {} a -> s {errorInfo = a} :: GetChangesetResponse)
+
+-- | Structure of the source file(s).
+getChangesetResponse_formatParams :: Lens.Lens' GetChangesetResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+getChangesetResponse_formatParams = Lens.lens (\GetChangesetResponse' {formatParams} -> formatParams) (\s@GetChangesetResponse' {} a -> s {formatParams = a} :: GetChangesetResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | Options that define the location of the data being ingested.
+getChangesetResponse_sourceParams :: Lens.Lens' GetChangesetResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+getChangesetResponse_sourceParams = Lens.lens (\GetChangesetResponse' {sourceParams} -> sourceParams) (\s@GetChangesetResponse' {} a -> s {sourceParams = a} :: GetChangesetResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The status of Changeset creation operation.
+getChangesetResponse_status :: Lens.Lens' GetChangesetResponse (Prelude.Maybe IngestionStatus)
+getChangesetResponse_status = Lens.lens (\GetChangesetResponse' {status} -> status) (\s@GetChangesetResponse' {} a -> s {status = a} :: GetChangesetResponse)
+
+-- | The unique identifier of the updated Changeset.
+getChangesetResponse_updatedByChangesetId :: Lens.Lens' GetChangesetResponse (Prelude.Maybe Prelude.Text)
+getChangesetResponse_updatedByChangesetId = Lens.lens (\GetChangesetResponse' {updatedByChangesetId} -> updatedByChangesetId) (\s@GetChangesetResponse' {} a -> s {updatedByChangesetId = a} :: GetChangesetResponse)
+
+-- | The unique identifier of the Changeset that is being updated.
+getChangesetResponse_updatesChangesetId :: Lens.Lens' GetChangesetResponse (Prelude.Maybe Prelude.Text)
+getChangesetResponse_updatesChangesetId = Lens.lens (\GetChangesetResponse' {updatesChangesetId} -> updatesChangesetId) (\s@GetChangesetResponse' {} a -> s {updatesChangesetId = a} :: GetChangesetResponse)
+
+-- | The response's http status code.
+getChangesetResponse_httpStatus :: Lens.Lens' GetChangesetResponse Prelude.Int
+getChangesetResponse_httpStatus = Lens.lens (\GetChangesetResponse' {httpStatus} -> httpStatus) (\s@GetChangesetResponse' {} a -> s {httpStatus = a} :: GetChangesetResponse)
+
+instance Prelude.NFData GetChangesetResponse where
+  rnf GetChangesetResponse' {..} =
+    Prelude.rnf activeFromTimestamp
+      `Prelude.seq` Prelude.rnf activeUntilTimestamp
+      `Prelude.seq` Prelude.rnf changeType
+      `Prelude.seq` Prelude.rnf changesetArn
+      `Prelude.seq` Prelude.rnf changesetId
+      `Prelude.seq` Prelude.rnf createTime
+      `Prelude.seq` Prelude.rnf datasetId
+      `Prelude.seq` Prelude.rnf errorInfo
+      `Prelude.seq` Prelude.rnf formatParams
+      `Prelude.seq` Prelude.rnf sourceParams
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf updatedByChangesetId
+      `Prelude.seq` Prelude.rnf updatesChangesetId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/GetDataView.hs b/gen/Amazonka/FinSpaceData/GetDataView.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/GetDataView.hs
@@ -0,0 +1,389 @@
+{-# 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.FinSpaceData.GetDataView
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets information about a Dataview.
+module Amazonka.FinSpaceData.GetDataView
+  ( -- * Creating a Request
+    GetDataView (..),
+    newGetDataView,
+
+    -- * Request Lenses
+    getDataView_dataViewId,
+    getDataView_datasetId,
+
+    -- * Destructuring the Response
+    GetDataViewResponse (..),
+    newGetDataViewResponse,
+
+    -- * Response Lenses
+    getDataViewResponse_asOfTimestamp,
+    getDataViewResponse_autoUpdate,
+    getDataViewResponse_createTime,
+    getDataViewResponse_dataViewArn,
+    getDataViewResponse_dataViewId,
+    getDataViewResponse_datasetId,
+    getDataViewResponse_destinationTypeParams,
+    getDataViewResponse_errorInfo,
+    getDataViewResponse_lastModifiedTime,
+    getDataViewResponse_partitionColumns,
+    getDataViewResponse_sortColumns,
+    getDataViewResponse_status,
+    getDataViewResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Request for retrieving a data view detail. Grouped \/ accessible within
+-- a dataset by its dataset id.
+--
+-- /See:/ 'newGetDataView' smart constructor.
+data GetDataView = GetDataView'
+  { -- | The unique identifier for the Dataview.
+    dataViewId :: Prelude.Text,
+    -- | The unique identifier for the Dataset used in the Dataview.
+    datasetId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetDataView' 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:
+--
+-- 'dataViewId', 'getDataView_dataViewId' - The unique identifier for the Dataview.
+--
+-- 'datasetId', 'getDataView_datasetId' - The unique identifier for the Dataset used in the Dataview.
+newGetDataView ::
+  -- | 'dataViewId'
+  Prelude.Text ->
+  -- | 'datasetId'
+  Prelude.Text ->
+  GetDataView
+newGetDataView pDataViewId_ pDatasetId_ =
+  GetDataView'
+    { dataViewId = pDataViewId_,
+      datasetId = pDatasetId_
+    }
+
+-- | The unique identifier for the Dataview.
+getDataView_dataViewId :: Lens.Lens' GetDataView Prelude.Text
+getDataView_dataViewId = Lens.lens (\GetDataView' {dataViewId} -> dataViewId) (\s@GetDataView' {} a -> s {dataViewId = a} :: GetDataView)
+
+-- | The unique identifier for the Dataset used in the Dataview.
+getDataView_datasetId :: Lens.Lens' GetDataView Prelude.Text
+getDataView_datasetId = Lens.lens (\GetDataView' {datasetId} -> datasetId) (\s@GetDataView' {} a -> s {datasetId = a} :: GetDataView)
+
+instance Core.AWSRequest GetDataView where
+  type AWSResponse GetDataView = GetDataViewResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetDataViewResponse'
+            Prelude.<$> (x Data..?> "asOfTimestamp")
+            Prelude.<*> (x Data..?> "autoUpdate")
+            Prelude.<*> (x Data..?> "createTime")
+            Prelude.<*> (x Data..?> "dataViewArn")
+            Prelude.<*> (x Data..?> "dataViewId")
+            Prelude.<*> (x Data..?> "datasetId")
+            Prelude.<*> (x Data..?> "destinationTypeParams")
+            Prelude.<*> (x Data..?> "errorInfo")
+            Prelude.<*> (x Data..?> "lastModifiedTime")
+            Prelude.<*> ( x
+                            Data..?> "partitionColumns"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "sortColumns" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "status")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetDataView where
+  hashWithSalt _salt GetDataView' {..} =
+    _salt
+      `Prelude.hashWithSalt` dataViewId
+      `Prelude.hashWithSalt` datasetId
+
+instance Prelude.NFData GetDataView where
+  rnf GetDataView' {..} =
+    Prelude.rnf dataViewId
+      `Prelude.seq` Prelude.rnf datasetId
+
+instance Data.ToHeaders GetDataView where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetDataView where
+  toPath GetDataView' {..} =
+    Prelude.mconcat
+      [ "/datasets/",
+        Data.toBS datasetId,
+        "/dataviewsv2/",
+        Data.toBS dataViewId
+      ]
+
+instance Data.ToQuery GetDataView where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | Response from retrieving a dataview, which includes details on the
+-- target database and table name
+--
+-- /See:/ 'newGetDataViewResponse' smart constructor.
+data GetDataViewResponse = GetDataViewResponse'
+  { -- | Time range to use for the Dataview. The value is determined as epoch
+    -- time in milliseconds. For example, the value for Monday, November 1,
+    -- 2021 12:00:00 PM UTC is specified as 1635768000000.
+    asOfTimestamp :: Prelude.Maybe Prelude.Integer,
+    -- | Flag to indicate Dataview should be updated automatically.
+    autoUpdate :: Prelude.Maybe Prelude.Bool,
+    -- | The timestamp at which the Dataview was created in FinSpace. The value
+    -- is determined as epoch time in milliseconds. For example, the value for
+    -- Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+    createTime :: Prelude.Maybe Prelude.Integer,
+    -- | The ARN identifier of the Dataview.
+    dataViewArn :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier for the Dataview.
+    dataViewId :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier for the Dataset used in the Dataview.
+    datasetId :: Prelude.Maybe Prelude.Text,
+    -- | Options that define the destination type for the Dataview.
+    destinationTypeParams :: Prelude.Maybe DataViewDestinationTypeParams,
+    -- | Information about an error that occurred for the Dataview.
+    errorInfo :: Prelude.Maybe DataViewErrorInfo,
+    -- | The last time that a Dataview was modified. The value is determined as
+    -- epoch time in milliseconds. For example, the value for Monday, November
+    -- 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+    lastModifiedTime :: Prelude.Maybe Prelude.Integer,
+    -- | Ordered set of column names used to partition data.
+    partitionColumns :: Prelude.Maybe [Prelude.Text],
+    -- | Columns to be used for sorting the data.
+    sortColumns :: Prelude.Maybe [Prelude.Text],
+    -- | The status of a Dataview creation.
+    --
+    -- -   @RUNNING@ – Dataview creation is running.
+    --
+    -- -   @STARTING@ – Dataview creation is starting.
+    --
+    -- -   @FAILED@ – Dataview creation has failed.
+    --
+    -- -   @CANCELLED@ – Dataview creation has been cancelled.
+    --
+    -- -   @TIMEOUT@ – Dataview creation has timed out.
+    --
+    -- -   @SUCCESS@ – Dataview creation has succeeded.
+    --
+    -- -   @PENDING@ – Dataview creation is pending.
+    --
+    -- -   @FAILED_CLEANUP_FAILED@ – Dataview creation failed and resource
+    --     cleanup failed.
+    status :: Prelude.Maybe DataViewStatus,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetDataViewResponse' 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:
+--
+-- 'asOfTimestamp', 'getDataViewResponse_asOfTimestamp' - Time range to use for the Dataview. The value is determined as epoch
+-- time in milliseconds. For example, the value for Monday, November 1,
+-- 2021 12:00:00 PM UTC is specified as 1635768000000.
+--
+-- 'autoUpdate', 'getDataViewResponse_autoUpdate' - Flag to indicate Dataview should be updated automatically.
+--
+-- 'createTime', 'getDataViewResponse_createTime' - The timestamp at which the Dataview was created in FinSpace. The value
+-- is determined as epoch time in milliseconds. For example, the value for
+-- Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+--
+-- 'dataViewArn', 'getDataViewResponse_dataViewArn' - The ARN identifier of the Dataview.
+--
+-- 'dataViewId', 'getDataViewResponse_dataViewId' - The unique identifier for the Dataview.
+--
+-- 'datasetId', 'getDataViewResponse_datasetId' - The unique identifier for the Dataset used in the Dataview.
+--
+-- 'destinationTypeParams', 'getDataViewResponse_destinationTypeParams' - Options that define the destination type for the Dataview.
+--
+-- 'errorInfo', 'getDataViewResponse_errorInfo' - Information about an error that occurred for the Dataview.
+--
+-- 'lastModifiedTime', 'getDataViewResponse_lastModifiedTime' - The last time that a Dataview was modified. The value is determined as
+-- epoch time in milliseconds. For example, the value for Monday, November
+-- 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+--
+-- 'partitionColumns', 'getDataViewResponse_partitionColumns' - Ordered set of column names used to partition data.
+--
+-- 'sortColumns', 'getDataViewResponse_sortColumns' - Columns to be used for sorting the data.
+--
+-- 'status', 'getDataViewResponse_status' - The status of a Dataview creation.
+--
+-- -   @RUNNING@ – Dataview creation is running.
+--
+-- -   @STARTING@ – Dataview creation is starting.
+--
+-- -   @FAILED@ – Dataview creation has failed.
+--
+-- -   @CANCELLED@ – Dataview creation has been cancelled.
+--
+-- -   @TIMEOUT@ – Dataview creation has timed out.
+--
+-- -   @SUCCESS@ – Dataview creation has succeeded.
+--
+-- -   @PENDING@ – Dataview creation is pending.
+--
+-- -   @FAILED_CLEANUP_FAILED@ – Dataview creation failed and resource
+--     cleanup failed.
+--
+-- 'httpStatus', 'getDataViewResponse_httpStatus' - The response's http status code.
+newGetDataViewResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetDataViewResponse
+newGetDataViewResponse pHttpStatus_ =
+  GetDataViewResponse'
+    { asOfTimestamp =
+        Prelude.Nothing,
+      autoUpdate = Prelude.Nothing,
+      createTime = Prelude.Nothing,
+      dataViewArn = Prelude.Nothing,
+      dataViewId = Prelude.Nothing,
+      datasetId = Prelude.Nothing,
+      destinationTypeParams = Prelude.Nothing,
+      errorInfo = Prelude.Nothing,
+      lastModifiedTime = Prelude.Nothing,
+      partitionColumns = Prelude.Nothing,
+      sortColumns = Prelude.Nothing,
+      status = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Time range to use for the Dataview. The value is determined as epoch
+-- time in milliseconds. For example, the value for Monday, November 1,
+-- 2021 12:00:00 PM UTC is specified as 1635768000000.
+getDataViewResponse_asOfTimestamp :: Lens.Lens' GetDataViewResponse (Prelude.Maybe Prelude.Integer)
+getDataViewResponse_asOfTimestamp = Lens.lens (\GetDataViewResponse' {asOfTimestamp} -> asOfTimestamp) (\s@GetDataViewResponse' {} a -> s {asOfTimestamp = a} :: GetDataViewResponse)
+
+-- | Flag to indicate Dataview should be updated automatically.
+getDataViewResponse_autoUpdate :: Lens.Lens' GetDataViewResponse (Prelude.Maybe Prelude.Bool)
+getDataViewResponse_autoUpdate = Lens.lens (\GetDataViewResponse' {autoUpdate} -> autoUpdate) (\s@GetDataViewResponse' {} a -> s {autoUpdate = a} :: GetDataViewResponse)
+
+-- | The timestamp at which the Dataview was created in FinSpace. The value
+-- is determined as epoch time in milliseconds. For example, the value for
+-- Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+getDataViewResponse_createTime :: Lens.Lens' GetDataViewResponse (Prelude.Maybe Prelude.Integer)
+getDataViewResponse_createTime = Lens.lens (\GetDataViewResponse' {createTime} -> createTime) (\s@GetDataViewResponse' {} a -> s {createTime = a} :: GetDataViewResponse)
+
+-- | The ARN identifier of the Dataview.
+getDataViewResponse_dataViewArn :: Lens.Lens' GetDataViewResponse (Prelude.Maybe Prelude.Text)
+getDataViewResponse_dataViewArn = Lens.lens (\GetDataViewResponse' {dataViewArn} -> dataViewArn) (\s@GetDataViewResponse' {} a -> s {dataViewArn = a} :: GetDataViewResponse)
+
+-- | The unique identifier for the Dataview.
+getDataViewResponse_dataViewId :: Lens.Lens' GetDataViewResponse (Prelude.Maybe Prelude.Text)
+getDataViewResponse_dataViewId = Lens.lens (\GetDataViewResponse' {dataViewId} -> dataViewId) (\s@GetDataViewResponse' {} a -> s {dataViewId = a} :: GetDataViewResponse)
+
+-- | The unique identifier for the Dataset used in the Dataview.
+getDataViewResponse_datasetId :: Lens.Lens' GetDataViewResponse (Prelude.Maybe Prelude.Text)
+getDataViewResponse_datasetId = Lens.lens (\GetDataViewResponse' {datasetId} -> datasetId) (\s@GetDataViewResponse' {} a -> s {datasetId = a} :: GetDataViewResponse)
+
+-- | Options that define the destination type for the Dataview.
+getDataViewResponse_destinationTypeParams :: Lens.Lens' GetDataViewResponse (Prelude.Maybe DataViewDestinationTypeParams)
+getDataViewResponse_destinationTypeParams = Lens.lens (\GetDataViewResponse' {destinationTypeParams} -> destinationTypeParams) (\s@GetDataViewResponse' {} a -> s {destinationTypeParams = a} :: GetDataViewResponse)
+
+-- | Information about an error that occurred for the Dataview.
+getDataViewResponse_errorInfo :: Lens.Lens' GetDataViewResponse (Prelude.Maybe DataViewErrorInfo)
+getDataViewResponse_errorInfo = Lens.lens (\GetDataViewResponse' {errorInfo} -> errorInfo) (\s@GetDataViewResponse' {} a -> s {errorInfo = a} :: GetDataViewResponse)
+
+-- | The last time that a Dataview was modified. The value is determined as
+-- epoch time in milliseconds. For example, the value for Monday, November
+-- 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+getDataViewResponse_lastModifiedTime :: Lens.Lens' GetDataViewResponse (Prelude.Maybe Prelude.Integer)
+getDataViewResponse_lastModifiedTime = Lens.lens (\GetDataViewResponse' {lastModifiedTime} -> lastModifiedTime) (\s@GetDataViewResponse' {} a -> s {lastModifiedTime = a} :: GetDataViewResponse)
+
+-- | Ordered set of column names used to partition data.
+getDataViewResponse_partitionColumns :: Lens.Lens' GetDataViewResponse (Prelude.Maybe [Prelude.Text])
+getDataViewResponse_partitionColumns = Lens.lens (\GetDataViewResponse' {partitionColumns} -> partitionColumns) (\s@GetDataViewResponse' {} a -> s {partitionColumns = a} :: GetDataViewResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | Columns to be used for sorting the data.
+getDataViewResponse_sortColumns :: Lens.Lens' GetDataViewResponse (Prelude.Maybe [Prelude.Text])
+getDataViewResponse_sortColumns = Lens.lens (\GetDataViewResponse' {sortColumns} -> sortColumns) (\s@GetDataViewResponse' {} a -> s {sortColumns = a} :: GetDataViewResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The status of a Dataview creation.
+--
+-- -   @RUNNING@ – Dataview creation is running.
+--
+-- -   @STARTING@ – Dataview creation is starting.
+--
+-- -   @FAILED@ – Dataview creation has failed.
+--
+-- -   @CANCELLED@ – Dataview creation has been cancelled.
+--
+-- -   @TIMEOUT@ – Dataview creation has timed out.
+--
+-- -   @SUCCESS@ – Dataview creation has succeeded.
+--
+-- -   @PENDING@ – Dataview creation is pending.
+--
+-- -   @FAILED_CLEANUP_FAILED@ – Dataview creation failed and resource
+--     cleanup failed.
+getDataViewResponse_status :: Lens.Lens' GetDataViewResponse (Prelude.Maybe DataViewStatus)
+getDataViewResponse_status = Lens.lens (\GetDataViewResponse' {status} -> status) (\s@GetDataViewResponse' {} a -> s {status = a} :: GetDataViewResponse)
+
+-- | The response's http status code.
+getDataViewResponse_httpStatus :: Lens.Lens' GetDataViewResponse Prelude.Int
+getDataViewResponse_httpStatus = Lens.lens (\GetDataViewResponse' {httpStatus} -> httpStatus) (\s@GetDataViewResponse' {} a -> s {httpStatus = a} :: GetDataViewResponse)
+
+instance Prelude.NFData GetDataViewResponse where
+  rnf GetDataViewResponse' {..} =
+    Prelude.rnf asOfTimestamp
+      `Prelude.seq` Prelude.rnf autoUpdate
+      `Prelude.seq` Prelude.rnf createTime
+      `Prelude.seq` Prelude.rnf dataViewArn
+      `Prelude.seq` Prelude.rnf dataViewId
+      `Prelude.seq` Prelude.rnf datasetId
+      `Prelude.seq` Prelude.rnf destinationTypeParams
+      `Prelude.seq` Prelude.rnf errorInfo
+      `Prelude.seq` Prelude.rnf lastModifiedTime
+      `Prelude.seq` Prelude.rnf partitionColumns
+      `Prelude.seq` Prelude.rnf sortColumns
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/GetDataset.hs b/gen/Amazonka/FinSpaceData/GetDataset.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/GetDataset.hs
@@ -0,0 +1,316 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FinSpaceData.GetDataset
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns information about a Dataset.
+module Amazonka.FinSpaceData.GetDataset
+  ( -- * Creating a Request
+    GetDataset (..),
+    newGetDataset,
+
+    -- * Request Lenses
+    getDataset_datasetId,
+
+    -- * Destructuring the Response
+    GetDatasetResponse (..),
+    newGetDatasetResponse,
+
+    -- * Response Lenses
+    getDatasetResponse_alias,
+    getDatasetResponse_createTime,
+    getDatasetResponse_datasetArn,
+    getDatasetResponse_datasetDescription,
+    getDatasetResponse_datasetId,
+    getDatasetResponse_datasetTitle,
+    getDatasetResponse_kind,
+    getDatasetResponse_lastModifiedTime,
+    getDatasetResponse_schemaDefinition,
+    getDatasetResponse_status,
+    getDatasetResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Request for the GetDataset operation.
+--
+-- /See:/ 'newGetDataset' smart constructor.
+data GetDataset = GetDataset'
+  { -- | The unique identifier for a Dataset.
+    datasetId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetDataset' 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:
+--
+-- 'datasetId', 'getDataset_datasetId' - The unique identifier for a Dataset.
+newGetDataset ::
+  -- | 'datasetId'
+  Prelude.Text ->
+  GetDataset
+newGetDataset pDatasetId_ =
+  GetDataset' {datasetId = pDatasetId_}
+
+-- | The unique identifier for a Dataset.
+getDataset_datasetId :: Lens.Lens' GetDataset Prelude.Text
+getDataset_datasetId = Lens.lens (\GetDataset' {datasetId} -> datasetId) (\s@GetDataset' {} a -> s {datasetId = a} :: GetDataset)
+
+instance Core.AWSRequest GetDataset where
+  type AWSResponse GetDataset = GetDatasetResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetDatasetResponse'
+            Prelude.<$> (x Data..?> "alias")
+            Prelude.<*> (x Data..?> "createTime")
+            Prelude.<*> (x Data..?> "datasetArn")
+            Prelude.<*> (x Data..?> "datasetDescription")
+            Prelude.<*> (x Data..?> "datasetId")
+            Prelude.<*> (x Data..?> "datasetTitle")
+            Prelude.<*> (x Data..?> "kind")
+            Prelude.<*> (x Data..?> "lastModifiedTime")
+            Prelude.<*> (x Data..?> "schemaDefinition")
+            Prelude.<*> (x Data..?> "status")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetDataset where
+  hashWithSalt _salt GetDataset' {..} =
+    _salt `Prelude.hashWithSalt` datasetId
+
+instance Prelude.NFData GetDataset where
+  rnf GetDataset' {..} = Prelude.rnf datasetId
+
+instance Data.ToHeaders GetDataset where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetDataset where
+  toPath GetDataset' {..} =
+    Prelude.mconcat
+      ["/datasetsv2/", Data.toBS datasetId]
+
+instance Data.ToQuery GetDataset where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | Response for the GetDataset operation
+--
+-- /See:/ 'newGetDatasetResponse' smart constructor.
+data GetDatasetResponse = GetDatasetResponse'
+  { -- | The unique resource identifier for a Dataset.
+    alias :: Prelude.Maybe Prelude.Text,
+    -- | The timestamp at which the Dataset was created in FinSpace. The value is
+    -- determined as epoch time in milliseconds. For example, the value for
+    -- Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+    createTime :: Prelude.Maybe Prelude.Integer,
+    -- | The ARN identifier of the Dataset.
+    datasetArn :: Prelude.Maybe Prelude.Text,
+    -- | A description of the Dataset.
+    datasetDescription :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier for a Dataset.
+    datasetId :: Prelude.Maybe Prelude.Text,
+    -- | Display title for a Dataset.
+    datasetTitle :: Prelude.Maybe Prelude.Text,
+    -- | The format in which Dataset data is structured.
+    --
+    -- -   @TABULAR@ – Data is structured in a tabular format.
+    --
+    -- -   @NON_TABULAR@ – Data is structured in a non-tabular format.
+    kind :: Prelude.Maybe DatasetKind,
+    -- | The last time that the Dataset was modified. The value is determined as
+    -- epoch time in milliseconds. For example, the value for Monday, November
+    -- 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+    lastModifiedTime :: Prelude.Maybe Prelude.Integer,
+    -- | Definition for a schema on a tabular Dataset.
+    schemaDefinition :: Prelude.Maybe SchemaUnion,
+    -- | Status of the Dataset creation.
+    --
+    -- -   @PENDING@ – Dataset is pending creation.
+    --
+    -- -   @FAILED@ – Dataset creation has failed.
+    --
+    -- -   @SUCCESS@ – Dataset creation has succeeded.
+    --
+    -- -   @RUNNING@ – Dataset creation is running.
+    status :: Prelude.Maybe DatasetStatus,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetDatasetResponse' 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:
+--
+-- 'alias', 'getDatasetResponse_alias' - The unique resource identifier for a Dataset.
+--
+-- 'createTime', 'getDatasetResponse_createTime' - The timestamp at which the Dataset was created in FinSpace. The value is
+-- determined as epoch time in milliseconds. For example, the value for
+-- Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+--
+-- 'datasetArn', 'getDatasetResponse_datasetArn' - The ARN identifier of the Dataset.
+--
+-- 'datasetDescription', 'getDatasetResponse_datasetDescription' - A description of the Dataset.
+--
+-- 'datasetId', 'getDatasetResponse_datasetId' - The unique identifier for a Dataset.
+--
+-- 'datasetTitle', 'getDatasetResponse_datasetTitle' - Display title for a Dataset.
+--
+-- 'kind', 'getDatasetResponse_kind' - The format in which Dataset data is structured.
+--
+-- -   @TABULAR@ – Data is structured in a tabular format.
+--
+-- -   @NON_TABULAR@ – Data is structured in a non-tabular format.
+--
+-- 'lastModifiedTime', 'getDatasetResponse_lastModifiedTime' - The last time that the Dataset was modified. The value is determined as
+-- epoch time in milliseconds. For example, the value for Monday, November
+-- 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+--
+-- 'schemaDefinition', 'getDatasetResponse_schemaDefinition' - Definition for a schema on a tabular Dataset.
+--
+-- 'status', 'getDatasetResponse_status' - Status of the Dataset creation.
+--
+-- -   @PENDING@ – Dataset is pending creation.
+--
+-- -   @FAILED@ – Dataset creation has failed.
+--
+-- -   @SUCCESS@ – Dataset creation has succeeded.
+--
+-- -   @RUNNING@ – Dataset creation is running.
+--
+-- 'httpStatus', 'getDatasetResponse_httpStatus' - The response's http status code.
+newGetDatasetResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetDatasetResponse
+newGetDatasetResponse pHttpStatus_ =
+  GetDatasetResponse'
+    { alias = Prelude.Nothing,
+      createTime = Prelude.Nothing,
+      datasetArn = Prelude.Nothing,
+      datasetDescription = Prelude.Nothing,
+      datasetId = Prelude.Nothing,
+      datasetTitle = Prelude.Nothing,
+      kind = Prelude.Nothing,
+      lastModifiedTime = Prelude.Nothing,
+      schemaDefinition = Prelude.Nothing,
+      status = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The unique resource identifier for a Dataset.
+getDatasetResponse_alias :: Lens.Lens' GetDatasetResponse (Prelude.Maybe Prelude.Text)
+getDatasetResponse_alias = Lens.lens (\GetDatasetResponse' {alias} -> alias) (\s@GetDatasetResponse' {} a -> s {alias = a} :: GetDatasetResponse)
+
+-- | The timestamp at which the Dataset was created in FinSpace. The value is
+-- determined as epoch time in milliseconds. For example, the value for
+-- Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+getDatasetResponse_createTime :: Lens.Lens' GetDatasetResponse (Prelude.Maybe Prelude.Integer)
+getDatasetResponse_createTime = Lens.lens (\GetDatasetResponse' {createTime} -> createTime) (\s@GetDatasetResponse' {} a -> s {createTime = a} :: GetDatasetResponse)
+
+-- | The ARN identifier of the Dataset.
+getDatasetResponse_datasetArn :: Lens.Lens' GetDatasetResponse (Prelude.Maybe Prelude.Text)
+getDatasetResponse_datasetArn = Lens.lens (\GetDatasetResponse' {datasetArn} -> datasetArn) (\s@GetDatasetResponse' {} a -> s {datasetArn = a} :: GetDatasetResponse)
+
+-- | A description of the Dataset.
+getDatasetResponse_datasetDescription :: Lens.Lens' GetDatasetResponse (Prelude.Maybe Prelude.Text)
+getDatasetResponse_datasetDescription = Lens.lens (\GetDatasetResponse' {datasetDescription} -> datasetDescription) (\s@GetDatasetResponse' {} a -> s {datasetDescription = a} :: GetDatasetResponse)
+
+-- | The unique identifier for a Dataset.
+getDatasetResponse_datasetId :: Lens.Lens' GetDatasetResponse (Prelude.Maybe Prelude.Text)
+getDatasetResponse_datasetId = Lens.lens (\GetDatasetResponse' {datasetId} -> datasetId) (\s@GetDatasetResponse' {} a -> s {datasetId = a} :: GetDatasetResponse)
+
+-- | Display title for a Dataset.
+getDatasetResponse_datasetTitle :: Lens.Lens' GetDatasetResponse (Prelude.Maybe Prelude.Text)
+getDatasetResponse_datasetTitle = Lens.lens (\GetDatasetResponse' {datasetTitle} -> datasetTitle) (\s@GetDatasetResponse' {} a -> s {datasetTitle = a} :: GetDatasetResponse)
+
+-- | The format in which Dataset data is structured.
+--
+-- -   @TABULAR@ – Data is structured in a tabular format.
+--
+-- -   @NON_TABULAR@ – Data is structured in a non-tabular format.
+getDatasetResponse_kind :: Lens.Lens' GetDatasetResponse (Prelude.Maybe DatasetKind)
+getDatasetResponse_kind = Lens.lens (\GetDatasetResponse' {kind} -> kind) (\s@GetDatasetResponse' {} a -> s {kind = a} :: GetDatasetResponse)
+
+-- | The last time that the Dataset was modified. The value is determined as
+-- epoch time in milliseconds. For example, the value for Monday, November
+-- 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+getDatasetResponse_lastModifiedTime :: Lens.Lens' GetDatasetResponse (Prelude.Maybe Prelude.Integer)
+getDatasetResponse_lastModifiedTime = Lens.lens (\GetDatasetResponse' {lastModifiedTime} -> lastModifiedTime) (\s@GetDatasetResponse' {} a -> s {lastModifiedTime = a} :: GetDatasetResponse)
+
+-- | Definition for a schema on a tabular Dataset.
+getDatasetResponse_schemaDefinition :: Lens.Lens' GetDatasetResponse (Prelude.Maybe SchemaUnion)
+getDatasetResponse_schemaDefinition = Lens.lens (\GetDatasetResponse' {schemaDefinition} -> schemaDefinition) (\s@GetDatasetResponse' {} a -> s {schemaDefinition = a} :: GetDatasetResponse)
+
+-- | Status of the Dataset creation.
+--
+-- -   @PENDING@ – Dataset is pending creation.
+--
+-- -   @FAILED@ – Dataset creation has failed.
+--
+-- -   @SUCCESS@ – Dataset creation has succeeded.
+--
+-- -   @RUNNING@ – Dataset creation is running.
+getDatasetResponse_status :: Lens.Lens' GetDatasetResponse (Prelude.Maybe DatasetStatus)
+getDatasetResponse_status = Lens.lens (\GetDatasetResponse' {status} -> status) (\s@GetDatasetResponse' {} a -> s {status = a} :: GetDatasetResponse)
+
+-- | The response's http status code.
+getDatasetResponse_httpStatus :: Lens.Lens' GetDatasetResponse Prelude.Int
+getDatasetResponse_httpStatus = Lens.lens (\GetDatasetResponse' {httpStatus} -> httpStatus) (\s@GetDatasetResponse' {} a -> s {httpStatus = a} :: GetDatasetResponse)
+
+instance Prelude.NFData GetDatasetResponse where
+  rnf GetDatasetResponse' {..} =
+    Prelude.rnf alias
+      `Prelude.seq` Prelude.rnf createTime
+      `Prelude.seq` Prelude.rnf datasetArn
+      `Prelude.seq` Prelude.rnf datasetDescription
+      `Prelude.seq` Prelude.rnf datasetId
+      `Prelude.seq` Prelude.rnf datasetTitle
+      `Prelude.seq` Prelude.rnf kind
+      `Prelude.seq` Prelude.rnf lastModifiedTime
+      `Prelude.seq` Prelude.rnf schemaDefinition
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/GetExternalDataViewAccessDetails.hs b/gen/Amazonka/FinSpaceData/GetExternalDataViewAccessDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/GetExternalDataViewAccessDetails.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.FinSpaceData.GetExternalDataViewAccessDetails
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns the credentials to access the external Dataview from an S3
+-- location. To call this API:
+--
+-- -   You must retrieve the programmatic credentials.
+--
+-- -   You must be a member of a FinSpace user group, where the dataset
+--     that you want to access has @Read Dataset Data@ permissions.
+module Amazonka.FinSpaceData.GetExternalDataViewAccessDetails
+  ( -- * Creating a Request
+    GetExternalDataViewAccessDetails (..),
+    newGetExternalDataViewAccessDetails,
+
+    -- * Request Lenses
+    getExternalDataViewAccessDetails_dataViewId,
+    getExternalDataViewAccessDetails_datasetId,
+
+    -- * Destructuring the Response
+    GetExternalDataViewAccessDetailsResponse (..),
+    newGetExternalDataViewAccessDetailsResponse,
+
+    -- * Response Lenses
+    getExternalDataViewAccessDetailsResponse_credentials,
+    getExternalDataViewAccessDetailsResponse_s3Location,
+    getExternalDataViewAccessDetailsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetExternalDataViewAccessDetails' smart constructor.
+data GetExternalDataViewAccessDetails = GetExternalDataViewAccessDetails'
+  { -- | The unique identifier for the Dataview that you want to access.
+    dataViewId :: Prelude.Text,
+    -- | The unique identifier for the Dataset.
+    datasetId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetExternalDataViewAccessDetails' 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:
+--
+-- 'dataViewId', 'getExternalDataViewAccessDetails_dataViewId' - The unique identifier for the Dataview that you want to access.
+--
+-- 'datasetId', 'getExternalDataViewAccessDetails_datasetId' - The unique identifier for the Dataset.
+newGetExternalDataViewAccessDetails ::
+  -- | 'dataViewId'
+  Prelude.Text ->
+  -- | 'datasetId'
+  Prelude.Text ->
+  GetExternalDataViewAccessDetails
+newGetExternalDataViewAccessDetails
+  pDataViewId_
+  pDatasetId_ =
+    GetExternalDataViewAccessDetails'
+      { dataViewId =
+          pDataViewId_,
+        datasetId = pDatasetId_
+      }
+
+-- | The unique identifier for the Dataview that you want to access.
+getExternalDataViewAccessDetails_dataViewId :: Lens.Lens' GetExternalDataViewAccessDetails Prelude.Text
+getExternalDataViewAccessDetails_dataViewId = Lens.lens (\GetExternalDataViewAccessDetails' {dataViewId} -> dataViewId) (\s@GetExternalDataViewAccessDetails' {} a -> s {dataViewId = a} :: GetExternalDataViewAccessDetails)
+
+-- | The unique identifier for the Dataset.
+getExternalDataViewAccessDetails_datasetId :: Lens.Lens' GetExternalDataViewAccessDetails Prelude.Text
+getExternalDataViewAccessDetails_datasetId = Lens.lens (\GetExternalDataViewAccessDetails' {datasetId} -> datasetId) (\s@GetExternalDataViewAccessDetails' {} a -> s {datasetId = a} :: GetExternalDataViewAccessDetails)
+
+instance
+  Core.AWSRequest
+    GetExternalDataViewAccessDetails
+  where
+  type
+    AWSResponse GetExternalDataViewAccessDetails =
+      GetExternalDataViewAccessDetailsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetExternalDataViewAccessDetailsResponse'
+            Prelude.<$> (x Data..?> "credentials")
+            Prelude.<*> (x Data..?> "s3Location")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    GetExternalDataViewAccessDetails
+  where
+  hashWithSalt
+    _salt
+    GetExternalDataViewAccessDetails' {..} =
+      _salt
+        `Prelude.hashWithSalt` dataViewId
+        `Prelude.hashWithSalt` datasetId
+
+instance
+  Prelude.NFData
+    GetExternalDataViewAccessDetails
+  where
+  rnf GetExternalDataViewAccessDetails' {..} =
+    Prelude.rnf dataViewId
+      `Prelude.seq` Prelude.rnf datasetId
+
+instance
+  Data.ToHeaders
+    GetExternalDataViewAccessDetails
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetExternalDataViewAccessDetails where
+  toJSON = Prelude.const (Data.Object Prelude.mempty)
+
+instance Data.ToPath GetExternalDataViewAccessDetails where
+  toPath GetExternalDataViewAccessDetails' {..} =
+    Prelude.mconcat
+      [ "/datasets/",
+        Data.toBS datasetId,
+        "/dataviewsv2/",
+        Data.toBS dataViewId,
+        "/external-access-details"
+      ]
+
+instance
+  Data.ToQuery
+    GetExternalDataViewAccessDetails
+  where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetExternalDataViewAccessDetailsResponse' smart constructor.
+data GetExternalDataViewAccessDetailsResponse = GetExternalDataViewAccessDetailsResponse'
+  { -- | The credentials required to access the external Dataview from the S3
+    -- location.
+    credentials :: Prelude.Maybe AwsCredentials,
+    -- | The location where the external Dataview is stored.
+    s3Location :: Prelude.Maybe S3Location,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetExternalDataViewAccessDetailsResponse' 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:
+--
+-- 'credentials', 'getExternalDataViewAccessDetailsResponse_credentials' - The credentials required to access the external Dataview from the S3
+-- location.
+--
+-- 's3Location', 'getExternalDataViewAccessDetailsResponse_s3Location' - The location where the external Dataview is stored.
+--
+-- 'httpStatus', 'getExternalDataViewAccessDetailsResponse_httpStatus' - The response's http status code.
+newGetExternalDataViewAccessDetailsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetExternalDataViewAccessDetailsResponse
+newGetExternalDataViewAccessDetailsResponse
+  pHttpStatus_ =
+    GetExternalDataViewAccessDetailsResponse'
+      { credentials =
+          Prelude.Nothing,
+        s3Location = Prelude.Nothing,
+        httpStatus = pHttpStatus_
+      }
+
+-- | The credentials required to access the external Dataview from the S3
+-- location.
+getExternalDataViewAccessDetailsResponse_credentials :: Lens.Lens' GetExternalDataViewAccessDetailsResponse (Prelude.Maybe AwsCredentials)
+getExternalDataViewAccessDetailsResponse_credentials = Lens.lens (\GetExternalDataViewAccessDetailsResponse' {credentials} -> credentials) (\s@GetExternalDataViewAccessDetailsResponse' {} a -> s {credentials = a} :: GetExternalDataViewAccessDetailsResponse)
+
+-- | The location where the external Dataview is stored.
+getExternalDataViewAccessDetailsResponse_s3Location :: Lens.Lens' GetExternalDataViewAccessDetailsResponse (Prelude.Maybe S3Location)
+getExternalDataViewAccessDetailsResponse_s3Location = Lens.lens (\GetExternalDataViewAccessDetailsResponse' {s3Location} -> s3Location) (\s@GetExternalDataViewAccessDetailsResponse' {} a -> s {s3Location = a} :: GetExternalDataViewAccessDetailsResponse)
+
+-- | The response's http status code.
+getExternalDataViewAccessDetailsResponse_httpStatus :: Lens.Lens' GetExternalDataViewAccessDetailsResponse Prelude.Int
+getExternalDataViewAccessDetailsResponse_httpStatus = Lens.lens (\GetExternalDataViewAccessDetailsResponse' {httpStatus} -> httpStatus) (\s@GetExternalDataViewAccessDetailsResponse' {} a -> s {httpStatus = a} :: GetExternalDataViewAccessDetailsResponse)
+
+instance
+  Prelude.NFData
+    GetExternalDataViewAccessDetailsResponse
+  where
+  rnf GetExternalDataViewAccessDetailsResponse' {..} =
+    Prelude.rnf credentials
+      `Prelude.seq` Prelude.rnf s3Location
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/GetPermissionGroup.hs b/gen/Amazonka/FinSpaceData/GetPermissionGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/GetPermissionGroup.hs
@@ -0,0 +1,162 @@
+{-# 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.FinSpaceData.GetPermissionGroup
+-- 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 details of a specific permission group.
+module Amazonka.FinSpaceData.GetPermissionGroup
+  ( -- * Creating a Request
+    GetPermissionGroup (..),
+    newGetPermissionGroup,
+
+    -- * Request Lenses
+    getPermissionGroup_permissionGroupId,
+
+    -- * Destructuring the Response
+    GetPermissionGroupResponse (..),
+    newGetPermissionGroupResponse,
+
+    -- * Response Lenses
+    getPermissionGroupResponse_permissionGroup,
+    getPermissionGroupResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetPermissionGroup' smart constructor.
+data GetPermissionGroup = GetPermissionGroup'
+  { -- | The unique identifier for the permission group.
+    permissionGroupId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetPermissionGroup' 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:
+--
+-- 'permissionGroupId', 'getPermissionGroup_permissionGroupId' - The unique identifier for the permission group.
+newGetPermissionGroup ::
+  -- | 'permissionGroupId'
+  Prelude.Text ->
+  GetPermissionGroup
+newGetPermissionGroup pPermissionGroupId_ =
+  GetPermissionGroup'
+    { permissionGroupId =
+        pPermissionGroupId_
+    }
+
+-- | The unique identifier for the permission group.
+getPermissionGroup_permissionGroupId :: Lens.Lens' GetPermissionGroup Prelude.Text
+getPermissionGroup_permissionGroupId = Lens.lens (\GetPermissionGroup' {permissionGroupId} -> permissionGroupId) (\s@GetPermissionGroup' {} a -> s {permissionGroupId = a} :: GetPermissionGroup)
+
+instance Core.AWSRequest GetPermissionGroup where
+  type
+    AWSResponse GetPermissionGroup =
+      GetPermissionGroupResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetPermissionGroupResponse'
+            Prelude.<$> (x Data..?> "permissionGroup")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetPermissionGroup where
+  hashWithSalt _salt GetPermissionGroup' {..} =
+    _salt `Prelude.hashWithSalt` permissionGroupId
+
+instance Prelude.NFData GetPermissionGroup where
+  rnf GetPermissionGroup' {..} =
+    Prelude.rnf permissionGroupId
+
+instance Data.ToHeaders GetPermissionGroup where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetPermissionGroup where
+  toPath GetPermissionGroup' {..} =
+    Prelude.mconcat
+      ["/permission-group/", Data.toBS permissionGroupId]
+
+instance Data.ToQuery GetPermissionGroup where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetPermissionGroupResponse' smart constructor.
+data GetPermissionGroupResponse = GetPermissionGroupResponse'
+  { permissionGroup :: Prelude.Maybe PermissionGroup,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetPermissionGroupResponse' 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:
+--
+-- 'permissionGroup', 'getPermissionGroupResponse_permissionGroup' - Undocumented member.
+--
+-- 'httpStatus', 'getPermissionGroupResponse_httpStatus' - The response's http status code.
+newGetPermissionGroupResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetPermissionGroupResponse
+newGetPermissionGroupResponse pHttpStatus_ =
+  GetPermissionGroupResponse'
+    { permissionGroup =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Undocumented member.
+getPermissionGroupResponse_permissionGroup :: Lens.Lens' GetPermissionGroupResponse (Prelude.Maybe PermissionGroup)
+getPermissionGroupResponse_permissionGroup = Lens.lens (\GetPermissionGroupResponse' {permissionGroup} -> permissionGroup) (\s@GetPermissionGroupResponse' {} a -> s {permissionGroup = a} :: GetPermissionGroupResponse)
+
+-- | The response's http status code.
+getPermissionGroupResponse_httpStatus :: Lens.Lens' GetPermissionGroupResponse Prelude.Int
+getPermissionGroupResponse_httpStatus = Lens.lens (\GetPermissionGroupResponse' {httpStatus} -> httpStatus) (\s@GetPermissionGroupResponse' {} a -> s {httpStatus = a} :: GetPermissionGroupResponse)
+
+instance Prelude.NFData GetPermissionGroupResponse where
+  rnf GetPermissionGroupResponse' {..} =
+    Prelude.rnf permissionGroup
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/GetProgrammaticAccessCredentials.hs b/gen/Amazonka/FinSpaceData/GetProgrammaticAccessCredentials.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/GetProgrammaticAccessCredentials.hs
@@ -0,0 +1,216 @@
+{-# 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.FinSpaceData.GetProgrammaticAccessCredentials
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Request programmatic credentials to use with FinSpace SDK.
+module Amazonka.FinSpaceData.GetProgrammaticAccessCredentials
+  ( -- * Creating a Request
+    GetProgrammaticAccessCredentials (..),
+    newGetProgrammaticAccessCredentials,
+
+    -- * Request Lenses
+    getProgrammaticAccessCredentials_durationInMinutes,
+    getProgrammaticAccessCredentials_environmentId,
+
+    -- * Destructuring the Response
+    GetProgrammaticAccessCredentialsResponse (..),
+    newGetProgrammaticAccessCredentialsResponse,
+
+    -- * Response Lenses
+    getProgrammaticAccessCredentialsResponse_credentials,
+    getProgrammaticAccessCredentialsResponse_durationInMinutes,
+    getProgrammaticAccessCredentialsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Request for GetProgrammaticAccessCredentials operation
+--
+-- /See:/ 'newGetProgrammaticAccessCredentials' smart constructor.
+data GetProgrammaticAccessCredentials = GetProgrammaticAccessCredentials'
+  { -- | The time duration in which the credentials remain valid.
+    durationInMinutes :: Prelude.Maybe Prelude.Natural,
+    -- | The FinSpace environment identifier.
+    environmentId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetProgrammaticAccessCredentials' 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', 'getProgrammaticAccessCredentials_durationInMinutes' - The time duration in which the credentials remain valid.
+--
+-- 'environmentId', 'getProgrammaticAccessCredentials_environmentId' - The FinSpace environment identifier.
+newGetProgrammaticAccessCredentials ::
+  -- | 'environmentId'
+  Prelude.Text ->
+  GetProgrammaticAccessCredentials
+newGetProgrammaticAccessCredentials pEnvironmentId_ =
+  GetProgrammaticAccessCredentials'
+    { durationInMinutes =
+        Prelude.Nothing,
+      environmentId = pEnvironmentId_
+    }
+
+-- | The time duration in which the credentials remain valid.
+getProgrammaticAccessCredentials_durationInMinutes :: Lens.Lens' GetProgrammaticAccessCredentials (Prelude.Maybe Prelude.Natural)
+getProgrammaticAccessCredentials_durationInMinutes = Lens.lens (\GetProgrammaticAccessCredentials' {durationInMinutes} -> durationInMinutes) (\s@GetProgrammaticAccessCredentials' {} a -> s {durationInMinutes = a} :: GetProgrammaticAccessCredentials)
+
+-- | The FinSpace environment identifier.
+getProgrammaticAccessCredentials_environmentId :: Lens.Lens' GetProgrammaticAccessCredentials Prelude.Text
+getProgrammaticAccessCredentials_environmentId = Lens.lens (\GetProgrammaticAccessCredentials' {environmentId} -> environmentId) (\s@GetProgrammaticAccessCredentials' {} a -> s {environmentId = a} :: GetProgrammaticAccessCredentials)
+
+instance
+  Core.AWSRequest
+    GetProgrammaticAccessCredentials
+  where
+  type
+    AWSResponse GetProgrammaticAccessCredentials =
+      GetProgrammaticAccessCredentialsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetProgrammaticAccessCredentialsResponse'
+            Prelude.<$> (x Data..?> "credentials")
+            Prelude.<*> (x Data..?> "durationInMinutes")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    GetProgrammaticAccessCredentials
+  where
+  hashWithSalt
+    _salt
+    GetProgrammaticAccessCredentials' {..} =
+      _salt
+        `Prelude.hashWithSalt` durationInMinutes
+        `Prelude.hashWithSalt` environmentId
+
+instance
+  Prelude.NFData
+    GetProgrammaticAccessCredentials
+  where
+  rnf GetProgrammaticAccessCredentials' {..} =
+    Prelude.rnf durationInMinutes
+      `Prelude.seq` Prelude.rnf environmentId
+
+instance
+  Data.ToHeaders
+    GetProgrammaticAccessCredentials
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetProgrammaticAccessCredentials where
+  toPath = Prelude.const "/credentials/programmatic"
+
+instance
+  Data.ToQuery
+    GetProgrammaticAccessCredentials
+  where
+  toQuery GetProgrammaticAccessCredentials' {..} =
+    Prelude.mconcat
+      [ "durationInMinutes" Data.=: durationInMinutes,
+        "environmentId" Data.=: environmentId
+      ]
+
+-- | Response for GetProgrammaticAccessCredentials operation
+--
+-- /See:/ 'newGetProgrammaticAccessCredentialsResponse' smart constructor.
+data GetProgrammaticAccessCredentialsResponse = GetProgrammaticAccessCredentialsResponse'
+  { -- | Returns the programmatic credentials.
+    credentials :: Prelude.Maybe Credentials,
+    -- | Returns the duration in which the credentials will remain valid.
+    durationInMinutes :: Prelude.Maybe Prelude.Natural,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetProgrammaticAccessCredentialsResponse' 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:
+--
+-- 'credentials', 'getProgrammaticAccessCredentialsResponse_credentials' - Returns the programmatic credentials.
+--
+-- 'durationInMinutes', 'getProgrammaticAccessCredentialsResponse_durationInMinutes' - Returns the duration in which the credentials will remain valid.
+--
+-- 'httpStatus', 'getProgrammaticAccessCredentialsResponse_httpStatus' - The response's http status code.
+newGetProgrammaticAccessCredentialsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetProgrammaticAccessCredentialsResponse
+newGetProgrammaticAccessCredentialsResponse
+  pHttpStatus_ =
+    GetProgrammaticAccessCredentialsResponse'
+      { credentials =
+          Prelude.Nothing,
+        durationInMinutes =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_
+      }
+
+-- | Returns the programmatic credentials.
+getProgrammaticAccessCredentialsResponse_credentials :: Lens.Lens' GetProgrammaticAccessCredentialsResponse (Prelude.Maybe Credentials)
+getProgrammaticAccessCredentialsResponse_credentials = Lens.lens (\GetProgrammaticAccessCredentialsResponse' {credentials} -> credentials) (\s@GetProgrammaticAccessCredentialsResponse' {} a -> s {credentials = a} :: GetProgrammaticAccessCredentialsResponse)
+
+-- | Returns the duration in which the credentials will remain valid.
+getProgrammaticAccessCredentialsResponse_durationInMinutes :: Lens.Lens' GetProgrammaticAccessCredentialsResponse (Prelude.Maybe Prelude.Natural)
+getProgrammaticAccessCredentialsResponse_durationInMinutes = Lens.lens (\GetProgrammaticAccessCredentialsResponse' {durationInMinutes} -> durationInMinutes) (\s@GetProgrammaticAccessCredentialsResponse' {} a -> s {durationInMinutes = a} :: GetProgrammaticAccessCredentialsResponse)
+
+-- | The response's http status code.
+getProgrammaticAccessCredentialsResponse_httpStatus :: Lens.Lens' GetProgrammaticAccessCredentialsResponse Prelude.Int
+getProgrammaticAccessCredentialsResponse_httpStatus = Lens.lens (\GetProgrammaticAccessCredentialsResponse' {httpStatus} -> httpStatus) (\s@GetProgrammaticAccessCredentialsResponse' {} a -> s {httpStatus = a} :: GetProgrammaticAccessCredentialsResponse)
+
+instance
+  Prelude.NFData
+    GetProgrammaticAccessCredentialsResponse
+  where
+  rnf GetProgrammaticAccessCredentialsResponse' {..} =
+    Prelude.rnf credentials
+      `Prelude.seq` Prelude.rnf durationInMinutes
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/GetUser.hs b/gen/Amazonka/FinSpaceData/GetUser.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/GetUser.hs
@@ -0,0 +1,376 @@
+{-# 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.FinSpaceData.GetUser
+-- 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 details for a specific user.
+module Amazonka.FinSpaceData.GetUser
+  ( -- * Creating a Request
+    GetUser (..),
+    newGetUser,
+
+    -- * Request Lenses
+    getUser_userId,
+
+    -- * Destructuring the Response
+    GetUserResponse (..),
+    newGetUserResponse,
+
+    -- * Response Lenses
+    getUserResponse_apiAccess,
+    getUserResponse_apiAccessPrincipalArn,
+    getUserResponse_createTime,
+    getUserResponse_emailAddress,
+    getUserResponse_firstName,
+    getUserResponse_lastDisabledTime,
+    getUserResponse_lastEnabledTime,
+    getUserResponse_lastLoginTime,
+    getUserResponse_lastModifiedTime,
+    getUserResponse_lastName,
+    getUserResponse_status,
+    getUserResponse_type,
+    getUserResponse_userId,
+    getUserResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetUser' smart constructor.
+data GetUser = GetUser'
+  { -- | The unique identifier of the user to get data for.
+    userId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetUser' 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:
+--
+-- 'userId', 'getUser_userId' - The unique identifier of the user to get data for.
+newGetUser ::
+  -- | 'userId'
+  Prelude.Text ->
+  GetUser
+newGetUser pUserId_ = GetUser' {userId = pUserId_}
+
+-- | The unique identifier of the user to get data for.
+getUser_userId :: Lens.Lens' GetUser Prelude.Text
+getUser_userId = Lens.lens (\GetUser' {userId} -> userId) (\s@GetUser' {} a -> s {userId = a} :: GetUser)
+
+instance Core.AWSRequest GetUser where
+  type AWSResponse GetUser = GetUserResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetUserResponse'
+            Prelude.<$> (x Data..?> "apiAccess")
+            Prelude.<*> (x Data..?> "apiAccessPrincipalArn")
+            Prelude.<*> (x Data..?> "createTime")
+            Prelude.<*> (x Data..?> "emailAddress")
+            Prelude.<*> (x Data..?> "firstName")
+            Prelude.<*> (x Data..?> "lastDisabledTime")
+            Prelude.<*> (x Data..?> "lastEnabledTime")
+            Prelude.<*> (x Data..?> "lastLoginTime")
+            Prelude.<*> (x Data..?> "lastModifiedTime")
+            Prelude.<*> (x Data..?> "lastName")
+            Prelude.<*> (x Data..?> "status")
+            Prelude.<*> (x Data..?> "type")
+            Prelude.<*> (x Data..?> "userId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetUser where
+  hashWithSalt _salt GetUser' {..} =
+    _salt `Prelude.hashWithSalt` userId
+
+instance Prelude.NFData GetUser where
+  rnf GetUser' {..} = Prelude.rnf userId
+
+instance Data.ToHeaders GetUser where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetUser where
+  toPath GetUser' {..} =
+    Prelude.mconcat ["/user/", Data.toBS userId]
+
+instance Data.ToQuery GetUser where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetUserResponse' smart constructor.
+data GetUserResponse = GetUserResponse'
+  { -- | Indicates whether the user can use the
+    -- @GetProgrammaticAccessCredentials@ API to obtain credentials that can
+    -- then be used to access other FinSpace Data API operations.
+    --
+    -- -   @ENABLED@ – The user has permissions to use the APIs.
+    --
+    -- -   @DISABLED@ – The user does not have permissions to use any APIs.
+    apiAccess :: Prelude.Maybe ApiAccess,
+    -- | The ARN identifier of an AWS user or role that is allowed to call the
+    -- @GetProgrammaticAccessCredentials@ API to obtain a credentials token for
+    -- a specific FinSpace user. This must be an IAM role within your FinSpace
+    -- account.
+    apiAccessPrincipalArn :: Prelude.Maybe Prelude.Text,
+    -- | The timestamp at which the user account was created in FinSpace. The
+    -- value is determined as epoch time in milliseconds.
+    createTime :: Prelude.Maybe Prelude.Integer,
+    -- | The email address that is associated with the user.
+    emailAddress :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The first name of the user.
+    firstName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | Describes the last time the user account was disabled. The value is
+    -- determined as epoch time in milliseconds.
+    lastDisabledTime :: Prelude.Maybe Prelude.Integer,
+    -- | Describes the last time the user account was enabled. The value is
+    -- determined as epoch time in milliseconds.
+    lastEnabledTime :: Prelude.Maybe Prelude.Integer,
+    -- | Describes the last time that the user logged into their account. The
+    -- value is determined as epoch time in milliseconds.
+    lastLoginTime :: Prelude.Maybe Prelude.Integer,
+    -- | Describes the last time the user account was updated. The value is
+    -- determined as epoch time in milliseconds.
+    lastModifiedTime :: Prelude.Maybe Prelude.Integer,
+    -- | The last name of the user.
+    lastName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The current status of the user account.
+    --
+    -- -   @CREATING@ – The user account creation is in progress.
+    --
+    -- -   @ENABLED@ – The user account is created and is currently active.
+    --
+    -- -   @DISABLED@ – The user account is currently inactive.
+    status :: Prelude.Maybe UserStatus,
+    -- | Indicates the type of user.
+    --
+    -- -   @SUPER_USER@ – A user with permission to all the functionality and
+    --     data in FinSpace.
+    --
+    -- -   @APP_USER@ – A user with specific permissions in FinSpace. The users
+    --     are assigned permissions by adding them to a permission group.
+    type' :: Prelude.Maybe UserType,
+    -- | The unique identifier for the user account that is retrieved.
+    userId :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetUserResponse' 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:
+--
+-- 'apiAccess', 'getUserResponse_apiAccess' - Indicates whether the user can use the
+-- @GetProgrammaticAccessCredentials@ API to obtain credentials that can
+-- then be used to access other FinSpace Data API operations.
+--
+-- -   @ENABLED@ – The user has permissions to use the APIs.
+--
+-- -   @DISABLED@ – The user does not have permissions to use any APIs.
+--
+-- 'apiAccessPrincipalArn', 'getUserResponse_apiAccessPrincipalArn' - The ARN identifier of an AWS user or role that is allowed to call the
+-- @GetProgrammaticAccessCredentials@ API to obtain a credentials token for
+-- a specific FinSpace user. This must be an IAM role within your FinSpace
+-- account.
+--
+-- 'createTime', 'getUserResponse_createTime' - The timestamp at which the user account was created in FinSpace. The
+-- value is determined as epoch time in milliseconds.
+--
+-- 'emailAddress', 'getUserResponse_emailAddress' - The email address that is associated with the user.
+--
+-- 'firstName', 'getUserResponse_firstName' - The first name of the user.
+--
+-- 'lastDisabledTime', 'getUserResponse_lastDisabledTime' - Describes the last time the user account was disabled. The value is
+-- determined as epoch time in milliseconds.
+--
+-- 'lastEnabledTime', 'getUserResponse_lastEnabledTime' - Describes the last time the user account was enabled. The value is
+-- determined as epoch time in milliseconds.
+--
+-- 'lastLoginTime', 'getUserResponse_lastLoginTime' - Describes the last time that the user logged into their account. The
+-- value is determined as epoch time in milliseconds.
+--
+-- 'lastModifiedTime', 'getUserResponse_lastModifiedTime' - Describes the last time the user account was updated. The value is
+-- determined as epoch time in milliseconds.
+--
+-- 'lastName', 'getUserResponse_lastName' - The last name of the user.
+--
+-- 'status', 'getUserResponse_status' - The current status of the user account.
+--
+-- -   @CREATING@ – The user account creation is in progress.
+--
+-- -   @ENABLED@ – The user account is created and is currently active.
+--
+-- -   @DISABLED@ – The user account is currently inactive.
+--
+-- 'type'', 'getUserResponse_type' - Indicates the type of user.
+--
+-- -   @SUPER_USER@ – A user with permission to all the functionality and
+--     data in FinSpace.
+--
+-- -   @APP_USER@ – A user with specific permissions in FinSpace. The users
+--     are assigned permissions by adding them to a permission group.
+--
+-- 'userId', 'getUserResponse_userId' - The unique identifier for the user account that is retrieved.
+--
+-- 'httpStatus', 'getUserResponse_httpStatus' - The response's http status code.
+newGetUserResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetUserResponse
+newGetUserResponse pHttpStatus_ =
+  GetUserResponse'
+    { apiAccess = Prelude.Nothing,
+      apiAccessPrincipalArn = Prelude.Nothing,
+      createTime = Prelude.Nothing,
+      emailAddress = Prelude.Nothing,
+      firstName = Prelude.Nothing,
+      lastDisabledTime = Prelude.Nothing,
+      lastEnabledTime = Prelude.Nothing,
+      lastLoginTime = Prelude.Nothing,
+      lastModifiedTime = Prelude.Nothing,
+      lastName = Prelude.Nothing,
+      status = Prelude.Nothing,
+      type' = Prelude.Nothing,
+      userId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Indicates whether the user can use the
+-- @GetProgrammaticAccessCredentials@ API to obtain credentials that can
+-- then be used to access other FinSpace Data API operations.
+--
+-- -   @ENABLED@ – The user has permissions to use the APIs.
+--
+-- -   @DISABLED@ – The user does not have permissions to use any APIs.
+getUserResponse_apiAccess :: Lens.Lens' GetUserResponse (Prelude.Maybe ApiAccess)
+getUserResponse_apiAccess = Lens.lens (\GetUserResponse' {apiAccess} -> apiAccess) (\s@GetUserResponse' {} a -> s {apiAccess = a} :: GetUserResponse)
+
+-- | The ARN identifier of an AWS user or role that is allowed to call the
+-- @GetProgrammaticAccessCredentials@ API to obtain a credentials token for
+-- a specific FinSpace user. This must be an IAM role within your FinSpace
+-- account.
+getUserResponse_apiAccessPrincipalArn :: Lens.Lens' GetUserResponse (Prelude.Maybe Prelude.Text)
+getUserResponse_apiAccessPrincipalArn = Lens.lens (\GetUserResponse' {apiAccessPrincipalArn} -> apiAccessPrincipalArn) (\s@GetUserResponse' {} a -> s {apiAccessPrincipalArn = a} :: GetUserResponse)
+
+-- | The timestamp at which the user account was created in FinSpace. The
+-- value is determined as epoch time in milliseconds.
+getUserResponse_createTime :: Lens.Lens' GetUserResponse (Prelude.Maybe Prelude.Integer)
+getUserResponse_createTime = Lens.lens (\GetUserResponse' {createTime} -> createTime) (\s@GetUserResponse' {} a -> s {createTime = a} :: GetUserResponse)
+
+-- | The email address that is associated with the user.
+getUserResponse_emailAddress :: Lens.Lens' GetUserResponse (Prelude.Maybe Prelude.Text)
+getUserResponse_emailAddress = Lens.lens (\GetUserResponse' {emailAddress} -> emailAddress) (\s@GetUserResponse' {} a -> s {emailAddress = a} :: GetUserResponse) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The first name of the user.
+getUserResponse_firstName :: Lens.Lens' GetUserResponse (Prelude.Maybe Prelude.Text)
+getUserResponse_firstName = Lens.lens (\GetUserResponse' {firstName} -> firstName) (\s@GetUserResponse' {} a -> s {firstName = a} :: GetUserResponse) Prelude.. Lens.mapping Data._Sensitive
+
+-- | Describes the last time the user account was disabled. The value is
+-- determined as epoch time in milliseconds.
+getUserResponse_lastDisabledTime :: Lens.Lens' GetUserResponse (Prelude.Maybe Prelude.Integer)
+getUserResponse_lastDisabledTime = Lens.lens (\GetUserResponse' {lastDisabledTime} -> lastDisabledTime) (\s@GetUserResponse' {} a -> s {lastDisabledTime = a} :: GetUserResponse)
+
+-- | Describes the last time the user account was enabled. The value is
+-- determined as epoch time in milliseconds.
+getUserResponse_lastEnabledTime :: Lens.Lens' GetUserResponse (Prelude.Maybe Prelude.Integer)
+getUserResponse_lastEnabledTime = Lens.lens (\GetUserResponse' {lastEnabledTime} -> lastEnabledTime) (\s@GetUserResponse' {} a -> s {lastEnabledTime = a} :: GetUserResponse)
+
+-- | Describes the last time that the user logged into their account. The
+-- value is determined as epoch time in milliseconds.
+getUserResponse_lastLoginTime :: Lens.Lens' GetUserResponse (Prelude.Maybe Prelude.Integer)
+getUserResponse_lastLoginTime = Lens.lens (\GetUserResponse' {lastLoginTime} -> lastLoginTime) (\s@GetUserResponse' {} a -> s {lastLoginTime = a} :: GetUserResponse)
+
+-- | Describes the last time the user account was updated. The value is
+-- determined as epoch time in milliseconds.
+getUserResponse_lastModifiedTime :: Lens.Lens' GetUserResponse (Prelude.Maybe Prelude.Integer)
+getUserResponse_lastModifiedTime = Lens.lens (\GetUserResponse' {lastModifiedTime} -> lastModifiedTime) (\s@GetUserResponse' {} a -> s {lastModifiedTime = a} :: GetUserResponse)
+
+-- | The last name of the user.
+getUserResponse_lastName :: Lens.Lens' GetUserResponse (Prelude.Maybe Prelude.Text)
+getUserResponse_lastName = Lens.lens (\GetUserResponse' {lastName} -> lastName) (\s@GetUserResponse' {} a -> s {lastName = a} :: GetUserResponse) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The current status of the user account.
+--
+-- -   @CREATING@ – The user account creation is in progress.
+--
+-- -   @ENABLED@ – The user account is created and is currently active.
+--
+-- -   @DISABLED@ – The user account is currently inactive.
+getUserResponse_status :: Lens.Lens' GetUserResponse (Prelude.Maybe UserStatus)
+getUserResponse_status = Lens.lens (\GetUserResponse' {status} -> status) (\s@GetUserResponse' {} a -> s {status = a} :: GetUserResponse)
+
+-- | Indicates the type of user.
+--
+-- -   @SUPER_USER@ – A user with permission to all the functionality and
+--     data in FinSpace.
+--
+-- -   @APP_USER@ – A user with specific permissions in FinSpace. The users
+--     are assigned permissions by adding them to a permission group.
+getUserResponse_type :: Lens.Lens' GetUserResponse (Prelude.Maybe UserType)
+getUserResponse_type = Lens.lens (\GetUserResponse' {type'} -> type') (\s@GetUserResponse' {} a -> s {type' = a} :: GetUserResponse)
+
+-- | The unique identifier for the user account that is retrieved.
+getUserResponse_userId :: Lens.Lens' GetUserResponse (Prelude.Maybe Prelude.Text)
+getUserResponse_userId = Lens.lens (\GetUserResponse' {userId} -> userId) (\s@GetUserResponse' {} a -> s {userId = a} :: GetUserResponse)
+
+-- | The response's http status code.
+getUserResponse_httpStatus :: Lens.Lens' GetUserResponse Prelude.Int
+getUserResponse_httpStatus = Lens.lens (\GetUserResponse' {httpStatus} -> httpStatus) (\s@GetUserResponse' {} a -> s {httpStatus = a} :: GetUserResponse)
+
+instance Prelude.NFData GetUserResponse where
+  rnf GetUserResponse' {..} =
+    Prelude.rnf apiAccess
+      `Prelude.seq` Prelude.rnf apiAccessPrincipalArn
+      `Prelude.seq` Prelude.rnf createTime
+      `Prelude.seq` Prelude.rnf emailAddress
+      `Prelude.seq` Prelude.rnf firstName
+      `Prelude.seq` Prelude.rnf lastDisabledTime
+      `Prelude.seq` Prelude.rnf lastEnabledTime
+      `Prelude.seq` Prelude.rnf lastLoginTime
+      `Prelude.seq` Prelude.rnf lastModifiedTime
+      `Prelude.seq` Prelude.rnf lastName
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf type'
+      `Prelude.seq` Prelude.rnf userId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/GetWorkingLocation.hs b/gen/Amazonka/FinSpaceData/GetWorkingLocation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/GetWorkingLocation.hs
@@ -0,0 +1,212 @@
+{-# 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.FinSpaceData.GetWorkingLocation
+-- 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 temporary Amazon S3 location, where you can copy your files from a
+-- source location to stage or use as a scratch space in FinSpace notebook.
+module Amazonka.FinSpaceData.GetWorkingLocation
+  ( -- * Creating a Request
+    GetWorkingLocation (..),
+    newGetWorkingLocation,
+
+    -- * Request Lenses
+    getWorkingLocation_locationType,
+
+    -- * Destructuring the Response
+    GetWorkingLocationResponse (..),
+    newGetWorkingLocationResponse,
+
+    -- * Response Lenses
+    getWorkingLocationResponse_s3Bucket,
+    getWorkingLocationResponse_s3Path,
+    getWorkingLocationResponse_s3Uri,
+    getWorkingLocationResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetWorkingLocation' smart constructor.
+data GetWorkingLocation = GetWorkingLocation'
+  { -- | Specify the type of the working location.
+    --
+    -- -   @SAGEMAKER@ – Use the Amazon S3 location as a temporary location to
+    --     store data content when working with FinSpace Notebooks that run on
+    --     SageMaker studio.
+    --
+    -- -   @INGESTION@ – Use the Amazon S3 location as a staging location to
+    --     copy your data content and then use the location with the Changeset
+    --     creation operation.
+    locationType :: Prelude.Maybe LocationType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetWorkingLocation' 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:
+--
+-- 'locationType', 'getWorkingLocation_locationType' - Specify the type of the working location.
+--
+-- -   @SAGEMAKER@ – Use the Amazon S3 location as a temporary location to
+--     store data content when working with FinSpace Notebooks that run on
+--     SageMaker studio.
+--
+-- -   @INGESTION@ – Use the Amazon S3 location as a staging location to
+--     copy your data content and then use the location with the Changeset
+--     creation operation.
+newGetWorkingLocation ::
+  GetWorkingLocation
+newGetWorkingLocation =
+  GetWorkingLocation' {locationType = Prelude.Nothing}
+
+-- | Specify the type of the working location.
+--
+-- -   @SAGEMAKER@ – Use the Amazon S3 location as a temporary location to
+--     store data content when working with FinSpace Notebooks that run on
+--     SageMaker studio.
+--
+-- -   @INGESTION@ – Use the Amazon S3 location as a staging location to
+--     copy your data content and then use the location with the Changeset
+--     creation operation.
+getWorkingLocation_locationType :: Lens.Lens' GetWorkingLocation (Prelude.Maybe LocationType)
+getWorkingLocation_locationType = Lens.lens (\GetWorkingLocation' {locationType} -> locationType) (\s@GetWorkingLocation' {} a -> s {locationType = a} :: GetWorkingLocation)
+
+instance Core.AWSRequest GetWorkingLocation where
+  type
+    AWSResponse GetWorkingLocation =
+      GetWorkingLocationResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetWorkingLocationResponse'
+            Prelude.<$> (x Data..?> "s3Bucket")
+            Prelude.<*> (x Data..?> "s3Path")
+            Prelude.<*> (x Data..?> "s3Uri")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetWorkingLocation where
+  hashWithSalt _salt GetWorkingLocation' {..} =
+    _salt `Prelude.hashWithSalt` locationType
+
+instance Prelude.NFData GetWorkingLocation where
+  rnf GetWorkingLocation' {..} =
+    Prelude.rnf locationType
+
+instance Data.ToHeaders GetWorkingLocation where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetWorkingLocation where
+  toJSON GetWorkingLocation' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("locationType" Data..=) Prelude.<$> locationType]
+      )
+
+instance Data.ToPath GetWorkingLocation where
+  toPath = Prelude.const "/workingLocationV1"
+
+instance Data.ToQuery GetWorkingLocation where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetWorkingLocationResponse' smart constructor.
+data GetWorkingLocationResponse = GetWorkingLocationResponse'
+  { -- | Returns the Amazon S3 bucket name for the working location.
+    s3Bucket :: Prelude.Maybe Prelude.Text,
+    -- | Returns the Amazon S3 Path for the working location.
+    s3Path :: Prelude.Maybe Prelude.Text,
+    -- | Returns the Amazon S3 URI for the working location.
+    s3Uri :: 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 'GetWorkingLocationResponse' 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:
+--
+-- 's3Bucket', 'getWorkingLocationResponse_s3Bucket' - Returns the Amazon S3 bucket name for the working location.
+--
+-- 's3Path', 'getWorkingLocationResponse_s3Path' - Returns the Amazon S3 Path for the working location.
+--
+-- 's3Uri', 'getWorkingLocationResponse_s3Uri' - Returns the Amazon S3 URI for the working location.
+--
+-- 'httpStatus', 'getWorkingLocationResponse_httpStatus' - The response's http status code.
+newGetWorkingLocationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetWorkingLocationResponse
+newGetWorkingLocationResponse pHttpStatus_ =
+  GetWorkingLocationResponse'
+    { s3Bucket =
+        Prelude.Nothing,
+      s3Path = Prelude.Nothing,
+      s3Uri = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Returns the Amazon S3 bucket name for the working location.
+getWorkingLocationResponse_s3Bucket :: Lens.Lens' GetWorkingLocationResponse (Prelude.Maybe Prelude.Text)
+getWorkingLocationResponse_s3Bucket = Lens.lens (\GetWorkingLocationResponse' {s3Bucket} -> s3Bucket) (\s@GetWorkingLocationResponse' {} a -> s {s3Bucket = a} :: GetWorkingLocationResponse)
+
+-- | Returns the Amazon S3 Path for the working location.
+getWorkingLocationResponse_s3Path :: Lens.Lens' GetWorkingLocationResponse (Prelude.Maybe Prelude.Text)
+getWorkingLocationResponse_s3Path = Lens.lens (\GetWorkingLocationResponse' {s3Path} -> s3Path) (\s@GetWorkingLocationResponse' {} a -> s {s3Path = a} :: GetWorkingLocationResponse)
+
+-- | Returns the Amazon S3 URI for the working location.
+getWorkingLocationResponse_s3Uri :: Lens.Lens' GetWorkingLocationResponse (Prelude.Maybe Prelude.Text)
+getWorkingLocationResponse_s3Uri = Lens.lens (\GetWorkingLocationResponse' {s3Uri} -> s3Uri) (\s@GetWorkingLocationResponse' {} a -> s {s3Uri = a} :: GetWorkingLocationResponse)
+
+-- | The response's http status code.
+getWorkingLocationResponse_httpStatus :: Lens.Lens' GetWorkingLocationResponse Prelude.Int
+getWorkingLocationResponse_httpStatus = Lens.lens (\GetWorkingLocationResponse' {httpStatus} -> httpStatus) (\s@GetWorkingLocationResponse' {} a -> s {httpStatus = a} :: GetWorkingLocationResponse)
+
+instance Prelude.NFData GetWorkingLocationResponse where
+  rnf GetWorkingLocationResponse' {..} =
+    Prelude.rnf s3Bucket
+      `Prelude.seq` Prelude.rnf s3Path
+      `Prelude.seq` Prelude.rnf s3Uri
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/Lens.hs b/gen/Amazonka/FinSpaceData/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Lens.hs
@@ -0,0 +1,485 @@
+{-# 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.FinSpaceData.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.FinSpaceData.Lens
+  ( -- * Operations
+
+    -- ** AssociateUserToPermissionGroup
+    associateUserToPermissionGroup_clientToken,
+    associateUserToPermissionGroup_permissionGroupId,
+    associateUserToPermissionGroup_userId,
+    associateUserToPermissionGroupResponse_statusCode,
+
+    -- ** CreateChangeset
+    createChangeset_clientToken,
+    createChangeset_datasetId,
+    createChangeset_changeType,
+    createChangeset_sourceParams,
+    createChangeset_formatParams,
+    createChangesetResponse_changesetId,
+    createChangesetResponse_datasetId,
+    createChangesetResponse_httpStatus,
+
+    -- ** CreateDataView
+    createDataView_asOfTimestamp,
+    createDataView_autoUpdate,
+    createDataView_clientToken,
+    createDataView_partitionColumns,
+    createDataView_sortColumns,
+    createDataView_datasetId,
+    createDataView_destinationTypeParams,
+    createDataViewResponse_dataViewId,
+    createDataViewResponse_datasetId,
+    createDataViewResponse_httpStatus,
+
+    -- ** CreateDataset
+    createDataset_alias,
+    createDataset_clientToken,
+    createDataset_datasetDescription,
+    createDataset_ownerInfo,
+    createDataset_schemaDefinition,
+    createDataset_datasetTitle,
+    createDataset_kind,
+    createDataset_permissionGroupParams,
+    createDatasetResponse_datasetId,
+    createDatasetResponse_httpStatus,
+
+    -- ** CreatePermissionGroup
+    createPermissionGroup_clientToken,
+    createPermissionGroup_description,
+    createPermissionGroup_name,
+    createPermissionGroup_applicationPermissions,
+    createPermissionGroupResponse_permissionGroupId,
+    createPermissionGroupResponse_httpStatus,
+
+    -- ** CreateUser
+    createUser_apiAccess,
+    createUser_apiAccessPrincipalArn,
+    createUser_clientToken,
+    createUser_firstName,
+    createUser_lastName,
+    createUser_emailAddress,
+    createUser_type,
+    createUserResponse_userId,
+    createUserResponse_httpStatus,
+
+    -- ** DeleteDataset
+    deleteDataset_clientToken,
+    deleteDataset_datasetId,
+    deleteDatasetResponse_datasetId,
+    deleteDatasetResponse_httpStatus,
+
+    -- ** DeletePermissionGroup
+    deletePermissionGroup_clientToken,
+    deletePermissionGroup_permissionGroupId,
+    deletePermissionGroupResponse_permissionGroupId,
+    deletePermissionGroupResponse_httpStatus,
+
+    -- ** DisableUser
+    disableUser_clientToken,
+    disableUser_userId,
+    disableUserResponse_userId,
+    disableUserResponse_httpStatus,
+
+    -- ** DisassociateUserFromPermissionGroup
+    disassociateUserFromPermissionGroup_clientToken,
+    disassociateUserFromPermissionGroup_permissionGroupId,
+    disassociateUserFromPermissionGroup_userId,
+    disassociateUserFromPermissionGroupResponse_statusCode,
+
+    -- ** EnableUser
+    enableUser_clientToken,
+    enableUser_userId,
+    enableUserResponse_userId,
+    enableUserResponse_httpStatus,
+
+    -- ** GetChangeset
+    getChangeset_datasetId,
+    getChangeset_changesetId,
+    getChangesetResponse_activeFromTimestamp,
+    getChangesetResponse_activeUntilTimestamp,
+    getChangesetResponse_changeType,
+    getChangesetResponse_changesetArn,
+    getChangesetResponse_changesetId,
+    getChangesetResponse_createTime,
+    getChangesetResponse_datasetId,
+    getChangesetResponse_errorInfo,
+    getChangesetResponse_formatParams,
+    getChangesetResponse_sourceParams,
+    getChangesetResponse_status,
+    getChangesetResponse_updatedByChangesetId,
+    getChangesetResponse_updatesChangesetId,
+    getChangesetResponse_httpStatus,
+
+    -- ** GetDataView
+    getDataView_dataViewId,
+    getDataView_datasetId,
+    getDataViewResponse_asOfTimestamp,
+    getDataViewResponse_autoUpdate,
+    getDataViewResponse_createTime,
+    getDataViewResponse_dataViewArn,
+    getDataViewResponse_dataViewId,
+    getDataViewResponse_datasetId,
+    getDataViewResponse_destinationTypeParams,
+    getDataViewResponse_errorInfo,
+    getDataViewResponse_lastModifiedTime,
+    getDataViewResponse_partitionColumns,
+    getDataViewResponse_sortColumns,
+    getDataViewResponse_status,
+    getDataViewResponse_httpStatus,
+
+    -- ** GetDataset
+    getDataset_datasetId,
+    getDatasetResponse_alias,
+    getDatasetResponse_createTime,
+    getDatasetResponse_datasetArn,
+    getDatasetResponse_datasetDescription,
+    getDatasetResponse_datasetId,
+    getDatasetResponse_datasetTitle,
+    getDatasetResponse_kind,
+    getDatasetResponse_lastModifiedTime,
+    getDatasetResponse_schemaDefinition,
+    getDatasetResponse_status,
+    getDatasetResponse_httpStatus,
+
+    -- ** GetExternalDataViewAccessDetails
+    getExternalDataViewAccessDetails_dataViewId,
+    getExternalDataViewAccessDetails_datasetId,
+    getExternalDataViewAccessDetailsResponse_credentials,
+    getExternalDataViewAccessDetailsResponse_s3Location,
+    getExternalDataViewAccessDetailsResponse_httpStatus,
+
+    -- ** GetPermissionGroup
+    getPermissionGroup_permissionGroupId,
+    getPermissionGroupResponse_permissionGroup,
+    getPermissionGroupResponse_httpStatus,
+
+    -- ** GetProgrammaticAccessCredentials
+    getProgrammaticAccessCredentials_durationInMinutes,
+    getProgrammaticAccessCredentials_environmentId,
+    getProgrammaticAccessCredentialsResponse_credentials,
+    getProgrammaticAccessCredentialsResponse_durationInMinutes,
+    getProgrammaticAccessCredentialsResponse_httpStatus,
+
+    -- ** GetUser
+    getUser_userId,
+    getUserResponse_apiAccess,
+    getUserResponse_apiAccessPrincipalArn,
+    getUserResponse_createTime,
+    getUserResponse_emailAddress,
+    getUserResponse_firstName,
+    getUserResponse_lastDisabledTime,
+    getUserResponse_lastEnabledTime,
+    getUserResponse_lastLoginTime,
+    getUserResponse_lastModifiedTime,
+    getUserResponse_lastName,
+    getUserResponse_status,
+    getUserResponse_type,
+    getUserResponse_userId,
+    getUserResponse_httpStatus,
+
+    -- ** GetWorkingLocation
+    getWorkingLocation_locationType,
+    getWorkingLocationResponse_s3Bucket,
+    getWorkingLocationResponse_s3Path,
+    getWorkingLocationResponse_s3Uri,
+    getWorkingLocationResponse_httpStatus,
+
+    -- ** ListChangesets
+    listChangesets_maxResults,
+    listChangesets_nextToken,
+    listChangesets_datasetId,
+    listChangesetsResponse_changesets,
+    listChangesetsResponse_nextToken,
+    listChangesetsResponse_httpStatus,
+
+    -- ** ListDataViews
+    listDataViews_maxResults,
+    listDataViews_nextToken,
+    listDataViews_datasetId,
+    listDataViewsResponse_dataViews,
+    listDataViewsResponse_nextToken,
+    listDataViewsResponse_httpStatus,
+
+    -- ** ListDatasets
+    listDatasets_maxResults,
+    listDatasets_nextToken,
+    listDatasetsResponse_datasets,
+    listDatasetsResponse_nextToken,
+    listDatasetsResponse_httpStatus,
+
+    -- ** ListPermissionGroups
+    listPermissionGroups_nextToken,
+    listPermissionGroups_maxResults,
+    listPermissionGroupsResponse_nextToken,
+    listPermissionGroupsResponse_permissionGroups,
+    listPermissionGroupsResponse_httpStatus,
+
+    -- ** ListPermissionGroupsByUser
+    listPermissionGroupsByUser_nextToken,
+    listPermissionGroupsByUser_userId,
+    listPermissionGroupsByUser_maxResults,
+    listPermissionGroupsByUserResponse_nextToken,
+    listPermissionGroupsByUserResponse_permissionGroups,
+    listPermissionGroupsByUserResponse_httpStatus,
+
+    -- ** ListUsers
+    listUsers_nextToken,
+    listUsers_maxResults,
+    listUsersResponse_nextToken,
+    listUsersResponse_users,
+    listUsersResponse_httpStatus,
+
+    -- ** ListUsersByPermissionGroup
+    listUsersByPermissionGroup_nextToken,
+    listUsersByPermissionGroup_permissionGroupId,
+    listUsersByPermissionGroup_maxResults,
+    listUsersByPermissionGroupResponse_nextToken,
+    listUsersByPermissionGroupResponse_users,
+    listUsersByPermissionGroupResponse_httpStatus,
+
+    -- ** ResetUserPassword
+    resetUserPassword_clientToken,
+    resetUserPassword_userId,
+    resetUserPasswordResponse_temporaryPassword,
+    resetUserPasswordResponse_userId,
+    resetUserPasswordResponse_httpStatus,
+
+    -- ** UpdateChangeset
+    updateChangeset_clientToken,
+    updateChangeset_datasetId,
+    updateChangeset_changesetId,
+    updateChangeset_sourceParams,
+    updateChangeset_formatParams,
+    updateChangesetResponse_changesetId,
+    updateChangesetResponse_datasetId,
+    updateChangesetResponse_httpStatus,
+
+    -- ** UpdateDataset
+    updateDataset_alias,
+    updateDataset_clientToken,
+    updateDataset_datasetDescription,
+    updateDataset_schemaDefinition,
+    updateDataset_datasetId,
+    updateDataset_datasetTitle,
+    updateDataset_kind,
+    updateDatasetResponse_datasetId,
+    updateDatasetResponse_httpStatus,
+
+    -- ** UpdatePermissionGroup
+    updatePermissionGroup_applicationPermissions,
+    updatePermissionGroup_clientToken,
+    updatePermissionGroup_description,
+    updatePermissionGroup_name,
+    updatePermissionGroup_permissionGroupId,
+    updatePermissionGroupResponse_permissionGroupId,
+    updatePermissionGroupResponse_httpStatus,
+
+    -- ** UpdateUser
+    updateUser_apiAccess,
+    updateUser_apiAccessPrincipalArn,
+    updateUser_clientToken,
+    updateUser_firstName,
+    updateUser_lastName,
+    updateUser_type,
+    updateUser_userId,
+    updateUserResponse_userId,
+    updateUserResponse_httpStatus,
+
+    -- * Types
+
+    -- ** AwsCredentials
+    awsCredentials_accessKeyId,
+    awsCredentials_expiration,
+    awsCredentials_secretAccessKey,
+    awsCredentials_sessionToken,
+
+    -- ** ChangesetErrorInfo
+    changesetErrorInfo_errorCategory,
+    changesetErrorInfo_errorMessage,
+
+    -- ** ChangesetSummary
+    changesetSummary_activeFromTimestamp,
+    changesetSummary_activeUntilTimestamp,
+    changesetSummary_changeType,
+    changesetSummary_changesetArn,
+    changesetSummary_changesetId,
+    changesetSummary_createTime,
+    changesetSummary_datasetId,
+    changesetSummary_errorInfo,
+    changesetSummary_formatParams,
+    changesetSummary_sourceParams,
+    changesetSummary_status,
+    changesetSummary_updatedByChangesetId,
+    changesetSummary_updatesChangesetId,
+
+    -- ** ColumnDefinition
+    columnDefinition_columnDescription,
+    columnDefinition_columnName,
+    columnDefinition_dataType,
+
+    -- ** Credentials
+    credentials_accessKeyId,
+    credentials_secretAccessKey,
+    credentials_sessionToken,
+
+    -- ** DataViewDestinationTypeParams
+    dataViewDestinationTypeParams_s3DestinationExportFileFormat,
+    dataViewDestinationTypeParams_s3DestinationExportFileFormatOptions,
+    dataViewDestinationTypeParams_destinationType,
+
+    -- ** DataViewErrorInfo
+    dataViewErrorInfo_errorCategory,
+    dataViewErrorInfo_errorMessage,
+
+    -- ** DataViewSummary
+    dataViewSummary_asOfTimestamp,
+    dataViewSummary_autoUpdate,
+    dataViewSummary_createTime,
+    dataViewSummary_dataViewArn,
+    dataViewSummary_dataViewId,
+    dataViewSummary_datasetId,
+    dataViewSummary_destinationTypeProperties,
+    dataViewSummary_errorInfo,
+    dataViewSummary_lastModifiedTime,
+    dataViewSummary_partitionColumns,
+    dataViewSummary_sortColumns,
+    dataViewSummary_status,
+
+    -- ** Dataset
+    dataset_alias,
+    dataset_createTime,
+    dataset_datasetArn,
+    dataset_datasetDescription,
+    dataset_datasetId,
+    dataset_datasetTitle,
+    dataset_kind,
+    dataset_lastModifiedTime,
+    dataset_ownerInfo,
+    dataset_schemaDefinition,
+
+    -- ** DatasetOwnerInfo
+    datasetOwnerInfo_email,
+    datasetOwnerInfo_name,
+    datasetOwnerInfo_phoneNumber,
+
+    -- ** PermissionGroup
+    permissionGroup_applicationPermissions,
+    permissionGroup_createTime,
+    permissionGroup_description,
+    permissionGroup_lastModifiedTime,
+    permissionGroup_membershipStatus,
+    permissionGroup_name,
+    permissionGroup_permissionGroupId,
+
+    -- ** PermissionGroupByUser
+    permissionGroupByUser_membershipStatus,
+    permissionGroupByUser_name,
+    permissionGroupByUser_permissionGroupId,
+
+    -- ** PermissionGroupParams
+    permissionGroupParams_datasetPermissions,
+    permissionGroupParams_permissionGroupId,
+
+    -- ** ResourcePermission
+    resourcePermission_permission,
+
+    -- ** S3Location
+    s3Location_bucket,
+    s3Location_key,
+
+    -- ** SchemaDefinition
+    schemaDefinition_columns,
+    schemaDefinition_primaryKeyColumns,
+
+    -- ** SchemaUnion
+    schemaUnion_tabularSchemaConfig,
+
+    -- ** User
+    user_apiAccess,
+    user_apiAccessPrincipalArn,
+    user_createTime,
+    user_emailAddress,
+    user_firstName,
+    user_lastDisabledTime,
+    user_lastEnabledTime,
+    user_lastLoginTime,
+    user_lastModifiedTime,
+    user_lastName,
+    user_status,
+    user_type,
+    user_userId,
+
+    -- ** UserByPermissionGroup
+    userByPermissionGroup_apiAccess,
+    userByPermissionGroup_apiAccessPrincipalArn,
+    userByPermissionGroup_emailAddress,
+    userByPermissionGroup_firstName,
+    userByPermissionGroup_lastName,
+    userByPermissionGroup_membershipStatus,
+    userByPermissionGroup_status,
+    userByPermissionGroup_type,
+    userByPermissionGroup_userId,
+  )
+where
+
+import Amazonka.FinSpaceData.AssociateUserToPermissionGroup
+import Amazonka.FinSpaceData.CreateChangeset
+import Amazonka.FinSpaceData.CreateDataView
+import Amazonka.FinSpaceData.CreateDataset
+import Amazonka.FinSpaceData.CreatePermissionGroup
+import Amazonka.FinSpaceData.CreateUser
+import Amazonka.FinSpaceData.DeleteDataset
+import Amazonka.FinSpaceData.DeletePermissionGroup
+import Amazonka.FinSpaceData.DisableUser
+import Amazonka.FinSpaceData.DisassociateUserFromPermissionGroup
+import Amazonka.FinSpaceData.EnableUser
+import Amazonka.FinSpaceData.GetChangeset
+import Amazonka.FinSpaceData.GetDataView
+import Amazonka.FinSpaceData.GetDataset
+import Amazonka.FinSpaceData.GetExternalDataViewAccessDetails
+import Amazonka.FinSpaceData.GetPermissionGroup
+import Amazonka.FinSpaceData.GetProgrammaticAccessCredentials
+import Amazonka.FinSpaceData.GetUser
+import Amazonka.FinSpaceData.GetWorkingLocation
+import Amazonka.FinSpaceData.ListChangesets
+import Amazonka.FinSpaceData.ListDataViews
+import Amazonka.FinSpaceData.ListDatasets
+import Amazonka.FinSpaceData.ListPermissionGroups
+import Amazonka.FinSpaceData.ListPermissionGroupsByUser
+import Amazonka.FinSpaceData.ListUsers
+import Amazonka.FinSpaceData.ListUsersByPermissionGroup
+import Amazonka.FinSpaceData.ResetUserPassword
+import Amazonka.FinSpaceData.Types.AwsCredentials
+import Amazonka.FinSpaceData.Types.ChangesetErrorInfo
+import Amazonka.FinSpaceData.Types.ChangesetSummary
+import Amazonka.FinSpaceData.Types.ColumnDefinition
+import Amazonka.FinSpaceData.Types.Credentials
+import Amazonka.FinSpaceData.Types.DataViewDestinationTypeParams
+import Amazonka.FinSpaceData.Types.DataViewErrorInfo
+import Amazonka.FinSpaceData.Types.DataViewSummary
+import Amazonka.FinSpaceData.Types.Dataset
+import Amazonka.FinSpaceData.Types.DatasetOwnerInfo
+import Amazonka.FinSpaceData.Types.PermissionGroup
+import Amazonka.FinSpaceData.Types.PermissionGroupByUser
+import Amazonka.FinSpaceData.Types.PermissionGroupParams
+import Amazonka.FinSpaceData.Types.ResourcePermission
+import Amazonka.FinSpaceData.Types.S3Location
+import Amazonka.FinSpaceData.Types.SchemaDefinition
+import Amazonka.FinSpaceData.Types.SchemaUnion
+import Amazonka.FinSpaceData.Types.User
+import Amazonka.FinSpaceData.Types.UserByPermissionGroup
+import Amazonka.FinSpaceData.UpdateChangeset
+import Amazonka.FinSpaceData.UpdateDataset
+import Amazonka.FinSpaceData.UpdatePermissionGroup
+import Amazonka.FinSpaceData.UpdateUser
diff --git a/gen/Amazonka/FinSpaceData/ListChangesets.hs b/gen/Amazonka/FinSpaceData/ListChangesets.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/ListChangesets.hs
@@ -0,0 +1,235 @@
+{-# 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.FinSpaceData.ListChangesets
+-- 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 FinSpace Changesets for a Dataset.
+--
+-- This operation returns paginated results.
+module Amazonka.FinSpaceData.ListChangesets
+  ( -- * Creating a Request
+    ListChangesets (..),
+    newListChangesets,
+
+    -- * Request Lenses
+    listChangesets_maxResults,
+    listChangesets_nextToken,
+    listChangesets_datasetId,
+
+    -- * Destructuring the Response
+    ListChangesetsResponse (..),
+    newListChangesetsResponse,
+
+    -- * Response Lenses
+    listChangesetsResponse_changesets,
+    listChangesetsResponse_nextToken,
+    listChangesetsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Request to ListChangesetsRequest. It exposes minimal query filters.
+--
+-- /See:/ 'newListChangesets' smart constructor.
+data ListChangesets = ListChangesets'
+  { -- | The maximum number of results per page.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | A token that indicates where a results page should begin.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier for the FinSpace Dataset to which the Changeset
+    -- belongs.
+    datasetId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListChangesets' 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', 'listChangesets_maxResults' - The maximum number of results per page.
+--
+-- 'nextToken', 'listChangesets_nextToken' - A token that indicates where a results page should begin.
+--
+-- 'datasetId', 'listChangesets_datasetId' - The unique identifier for the FinSpace Dataset to which the Changeset
+-- belongs.
+newListChangesets ::
+  -- | 'datasetId'
+  Prelude.Text ->
+  ListChangesets
+newListChangesets pDatasetId_ =
+  ListChangesets'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      datasetId = pDatasetId_
+    }
+
+-- | The maximum number of results per page.
+listChangesets_maxResults :: Lens.Lens' ListChangesets (Prelude.Maybe Prelude.Natural)
+listChangesets_maxResults = Lens.lens (\ListChangesets' {maxResults} -> maxResults) (\s@ListChangesets' {} a -> s {maxResults = a} :: ListChangesets)
+
+-- | A token that indicates where a results page should begin.
+listChangesets_nextToken :: Lens.Lens' ListChangesets (Prelude.Maybe Prelude.Text)
+listChangesets_nextToken = Lens.lens (\ListChangesets' {nextToken} -> nextToken) (\s@ListChangesets' {} a -> s {nextToken = a} :: ListChangesets)
+
+-- | The unique identifier for the FinSpace Dataset to which the Changeset
+-- belongs.
+listChangesets_datasetId :: Lens.Lens' ListChangesets Prelude.Text
+listChangesets_datasetId = Lens.lens (\ListChangesets' {datasetId} -> datasetId) (\s@ListChangesets' {} a -> s {datasetId = a} :: ListChangesets)
+
+instance Core.AWSPager ListChangesets where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listChangesetsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listChangesetsResponse_changesets
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listChangesets_nextToken
+          Lens..~ rs
+          Lens.^? listChangesetsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListChangesets where
+  type
+    AWSResponse ListChangesets =
+      ListChangesetsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListChangesetsResponse'
+            Prelude.<$> (x Data..?> "changesets" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListChangesets where
+  hashWithSalt _salt ListChangesets' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` datasetId
+
+instance Prelude.NFData ListChangesets where
+  rnf ListChangesets' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf datasetId
+
+instance Data.ToHeaders ListChangesets where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListChangesets where
+  toPath ListChangesets' {..} =
+    Prelude.mconcat
+      ["/datasets/", Data.toBS datasetId, "/changesetsv2"]
+
+instance Data.ToQuery ListChangesets where
+  toQuery ListChangesets' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | Response to ListChangesetsResponse. This returns a list of dataset
+-- changesets that match the query criteria.
+--
+-- /See:/ 'newListChangesetsResponse' smart constructor.
+data ListChangesetsResponse = ListChangesetsResponse'
+  { -- | List of Changesets found.
+    changesets :: Prelude.Maybe [ChangesetSummary],
+    -- | A token that indicates where a results page should begin.
+    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 'ListChangesetsResponse' 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:
+--
+-- 'changesets', 'listChangesetsResponse_changesets' - List of Changesets found.
+--
+-- 'nextToken', 'listChangesetsResponse_nextToken' - A token that indicates where a results page should begin.
+--
+-- 'httpStatus', 'listChangesetsResponse_httpStatus' - The response's http status code.
+newListChangesetsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListChangesetsResponse
+newListChangesetsResponse pHttpStatus_ =
+  ListChangesetsResponse'
+    { changesets =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | List of Changesets found.
+listChangesetsResponse_changesets :: Lens.Lens' ListChangesetsResponse (Prelude.Maybe [ChangesetSummary])
+listChangesetsResponse_changesets = Lens.lens (\ListChangesetsResponse' {changesets} -> changesets) (\s@ListChangesetsResponse' {} a -> s {changesets = a} :: ListChangesetsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A token that indicates where a results page should begin.
+listChangesetsResponse_nextToken :: Lens.Lens' ListChangesetsResponse (Prelude.Maybe Prelude.Text)
+listChangesetsResponse_nextToken = Lens.lens (\ListChangesetsResponse' {nextToken} -> nextToken) (\s@ListChangesetsResponse' {} a -> s {nextToken = a} :: ListChangesetsResponse)
+
+-- | The response's http status code.
+listChangesetsResponse_httpStatus :: Lens.Lens' ListChangesetsResponse Prelude.Int
+listChangesetsResponse_httpStatus = Lens.lens (\ListChangesetsResponse' {httpStatus} -> httpStatus) (\s@ListChangesetsResponse' {} a -> s {httpStatus = a} :: ListChangesetsResponse)
+
+instance Prelude.NFData ListChangesetsResponse where
+  rnf ListChangesetsResponse' {..} =
+    Prelude.rnf changesets
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/ListDataViews.hs b/gen/Amazonka/FinSpaceData/ListDataViews.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/ListDataViews.hs
@@ -0,0 +1,228 @@
+{-# 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.FinSpaceData.ListDataViews
+-- 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 available Dataviews for a Dataset.
+--
+-- This operation returns paginated results.
+module Amazonka.FinSpaceData.ListDataViews
+  ( -- * Creating a Request
+    ListDataViews (..),
+    newListDataViews,
+
+    -- * Request Lenses
+    listDataViews_maxResults,
+    listDataViews_nextToken,
+    listDataViews_datasetId,
+
+    -- * Destructuring the Response
+    ListDataViewsResponse (..),
+    newListDataViewsResponse,
+
+    -- * Response Lenses
+    listDataViewsResponse_dataViews,
+    listDataViewsResponse_nextToken,
+    listDataViewsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Request for a list data views.
+--
+-- /See:/ 'newListDataViews' smart constructor.
+data ListDataViews = ListDataViews'
+  { -- | The maximum number of results per page.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | A token that indicates where a results page should begin.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier of the Dataset for which to retrieve Dataviews.
+    datasetId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDataViews' 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', 'listDataViews_maxResults' - The maximum number of results per page.
+--
+-- 'nextToken', 'listDataViews_nextToken' - A token that indicates where a results page should begin.
+--
+-- 'datasetId', 'listDataViews_datasetId' - The unique identifier of the Dataset for which to retrieve Dataviews.
+newListDataViews ::
+  -- | 'datasetId'
+  Prelude.Text ->
+  ListDataViews
+newListDataViews pDatasetId_ =
+  ListDataViews'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      datasetId = pDatasetId_
+    }
+
+-- | The maximum number of results per page.
+listDataViews_maxResults :: Lens.Lens' ListDataViews (Prelude.Maybe Prelude.Natural)
+listDataViews_maxResults = Lens.lens (\ListDataViews' {maxResults} -> maxResults) (\s@ListDataViews' {} a -> s {maxResults = a} :: ListDataViews)
+
+-- | A token that indicates where a results page should begin.
+listDataViews_nextToken :: Lens.Lens' ListDataViews (Prelude.Maybe Prelude.Text)
+listDataViews_nextToken = Lens.lens (\ListDataViews' {nextToken} -> nextToken) (\s@ListDataViews' {} a -> s {nextToken = a} :: ListDataViews)
+
+-- | The unique identifier of the Dataset for which to retrieve Dataviews.
+listDataViews_datasetId :: Lens.Lens' ListDataViews Prelude.Text
+listDataViews_datasetId = Lens.lens (\ListDataViews' {datasetId} -> datasetId) (\s@ListDataViews' {} a -> s {datasetId = a} :: ListDataViews)
+
+instance Core.AWSPager ListDataViews where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listDataViewsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listDataViewsResponse_dataViews
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listDataViews_nextToken
+          Lens..~ rs
+          Lens.^? listDataViewsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListDataViews where
+  type
+    AWSResponse ListDataViews =
+      ListDataViewsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListDataViewsResponse'
+            Prelude.<$> (x Data..?> "dataViews" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListDataViews where
+  hashWithSalt _salt ListDataViews' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` datasetId
+
+instance Prelude.NFData ListDataViews where
+  rnf ListDataViews' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf datasetId
+
+instance Data.ToHeaders ListDataViews where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListDataViews where
+  toPath ListDataViews' {..} =
+    Prelude.mconcat
+      ["/datasets/", Data.toBS datasetId, "/dataviewsv2"]
+
+instance Data.ToQuery ListDataViews where
+  toQuery ListDataViews' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListDataViewsResponse' smart constructor.
+data ListDataViewsResponse = ListDataViewsResponse'
+  { -- | A list of Dataviews.
+    dataViews :: Prelude.Maybe [DataViewSummary],
+    -- | A token that indicates where a results page should begin.
+    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 'ListDataViewsResponse' 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:
+--
+-- 'dataViews', 'listDataViewsResponse_dataViews' - A list of Dataviews.
+--
+-- 'nextToken', 'listDataViewsResponse_nextToken' - A token that indicates where a results page should begin.
+--
+-- 'httpStatus', 'listDataViewsResponse_httpStatus' - The response's http status code.
+newListDataViewsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListDataViewsResponse
+newListDataViewsResponse pHttpStatus_ =
+  ListDataViewsResponse'
+    { dataViews = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of Dataviews.
+listDataViewsResponse_dataViews :: Lens.Lens' ListDataViewsResponse (Prelude.Maybe [DataViewSummary])
+listDataViewsResponse_dataViews = Lens.lens (\ListDataViewsResponse' {dataViews} -> dataViews) (\s@ListDataViewsResponse' {} a -> s {dataViews = a} :: ListDataViewsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A token that indicates where a results page should begin.
+listDataViewsResponse_nextToken :: Lens.Lens' ListDataViewsResponse (Prelude.Maybe Prelude.Text)
+listDataViewsResponse_nextToken = Lens.lens (\ListDataViewsResponse' {nextToken} -> nextToken) (\s@ListDataViewsResponse' {} a -> s {nextToken = a} :: ListDataViewsResponse)
+
+-- | The response's http status code.
+listDataViewsResponse_httpStatus :: Lens.Lens' ListDataViewsResponse Prelude.Int
+listDataViewsResponse_httpStatus = Lens.lens (\ListDataViewsResponse' {httpStatus} -> httpStatus) (\s@ListDataViewsResponse' {} a -> s {httpStatus = a} :: ListDataViewsResponse)
+
+instance Prelude.NFData ListDataViewsResponse where
+  rnf ListDataViewsResponse' {..} =
+    Prelude.rnf dataViews
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/ListDatasets.hs b/gen/Amazonka/FinSpaceData/ListDatasets.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/ListDatasets.hs
@@ -0,0 +1,212 @@
+{-# 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.FinSpaceData.ListDatasets
+-- 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 active Datasets that a user has access to.
+--
+-- This operation returns paginated results.
+module Amazonka.FinSpaceData.ListDatasets
+  ( -- * Creating a Request
+    ListDatasets (..),
+    newListDatasets,
+
+    -- * Request Lenses
+    listDatasets_maxResults,
+    listDatasets_nextToken,
+
+    -- * Destructuring the Response
+    ListDatasetsResponse (..),
+    newListDatasetsResponse,
+
+    -- * Response Lenses
+    listDatasetsResponse_datasets,
+    listDatasetsResponse_nextToken,
+    listDatasetsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Request for the ListDatasets operation.
+--
+-- /See:/ 'newListDatasets' smart constructor.
+data ListDatasets = ListDatasets'
+  { -- | The maximum number of results per page.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | A token that indicates where a results page should begin.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDatasets' 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', 'listDatasets_maxResults' - The maximum number of results per page.
+--
+-- 'nextToken', 'listDatasets_nextToken' - A token that indicates where a results page should begin.
+newListDatasets ::
+  ListDatasets
+newListDatasets =
+  ListDatasets'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of results per page.
+listDatasets_maxResults :: Lens.Lens' ListDatasets (Prelude.Maybe Prelude.Natural)
+listDatasets_maxResults = Lens.lens (\ListDatasets' {maxResults} -> maxResults) (\s@ListDatasets' {} a -> s {maxResults = a} :: ListDatasets)
+
+-- | A token that indicates where a results page should begin.
+listDatasets_nextToken :: Lens.Lens' ListDatasets (Prelude.Maybe Prelude.Text)
+listDatasets_nextToken = Lens.lens (\ListDatasets' {nextToken} -> nextToken) (\s@ListDatasets' {} a -> s {nextToken = a} :: ListDatasets)
+
+instance Core.AWSPager ListDatasets where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listDatasetsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listDatasetsResponse_datasets
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listDatasets_nextToken
+          Lens..~ rs
+          Lens.^? listDatasetsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListDatasets where
+  type AWSResponse ListDatasets = ListDatasetsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListDatasetsResponse'
+            Prelude.<$> (x Data..?> "datasets" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListDatasets where
+  hashWithSalt _salt ListDatasets' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListDatasets where
+  rnf ListDatasets' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListDatasets where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListDatasets where
+  toPath = Prelude.const "/datasetsv2"
+
+instance Data.ToQuery ListDatasets where
+  toQuery ListDatasets' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | Response for the ListDatasets operation
+--
+-- /See:/ 'newListDatasetsResponse' smart constructor.
+data ListDatasetsResponse = ListDatasetsResponse'
+  { -- | List of Datasets.
+    datasets :: Prelude.Maybe [Dataset],
+    -- | A token that indicates where a results page should begin.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDatasetsResponse' 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:
+--
+-- 'datasets', 'listDatasetsResponse_datasets' - List of Datasets.
+--
+-- 'nextToken', 'listDatasetsResponse_nextToken' - A token that indicates where a results page should begin.
+--
+-- 'httpStatus', 'listDatasetsResponse_httpStatus' - The response's http status code.
+newListDatasetsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListDatasetsResponse
+newListDatasetsResponse pHttpStatus_ =
+  ListDatasetsResponse'
+    { datasets = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | List of Datasets.
+listDatasetsResponse_datasets :: Lens.Lens' ListDatasetsResponse (Prelude.Maybe [Dataset])
+listDatasetsResponse_datasets = Lens.lens (\ListDatasetsResponse' {datasets} -> datasets) (\s@ListDatasetsResponse' {} a -> s {datasets = a} :: ListDatasetsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A token that indicates where a results page should begin.
+listDatasetsResponse_nextToken :: Lens.Lens' ListDatasetsResponse (Prelude.Maybe Prelude.Text)
+listDatasetsResponse_nextToken = Lens.lens (\ListDatasetsResponse' {nextToken} -> nextToken) (\s@ListDatasetsResponse' {} a -> s {nextToken = a} :: ListDatasetsResponse)
+
+-- | The response's http status code.
+listDatasetsResponse_httpStatus :: Lens.Lens' ListDatasetsResponse Prelude.Int
+listDatasetsResponse_httpStatus = Lens.lens (\ListDatasetsResponse' {httpStatus} -> httpStatus) (\s@ListDatasetsResponse' {} a -> s {httpStatus = a} :: ListDatasetsResponse)
+
+instance Prelude.NFData ListDatasetsResponse where
+  rnf ListDatasetsResponse' {..} =
+    Prelude.rnf datasets
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/ListPermissionGroups.hs b/gen/Amazonka/FinSpaceData/ListPermissionGroups.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/ListPermissionGroups.hs
@@ -0,0 +1,216 @@
+{-# 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.FinSpaceData.ListPermissionGroups
+-- 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 available permission groups in FinSpace.
+--
+-- This operation returns paginated results.
+module Amazonka.FinSpaceData.ListPermissionGroups
+  ( -- * Creating a Request
+    ListPermissionGroups (..),
+    newListPermissionGroups,
+
+    -- * Request Lenses
+    listPermissionGroups_nextToken,
+    listPermissionGroups_maxResults,
+
+    -- * Destructuring the Response
+    ListPermissionGroupsResponse (..),
+    newListPermissionGroupsResponse,
+
+    -- * Response Lenses
+    listPermissionGroupsResponse_nextToken,
+    listPermissionGroupsResponse_permissionGroups,
+    listPermissionGroupsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListPermissionGroups' smart constructor.
+data ListPermissionGroups = ListPermissionGroups'
+  { -- | A token that indicates where a results page should begin.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of results per page.
+    maxResults :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListPermissionGroups' 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', 'listPermissionGroups_nextToken' - A token that indicates where a results page should begin.
+--
+-- 'maxResults', 'listPermissionGroups_maxResults' - The maximum number of results per page.
+newListPermissionGroups ::
+  -- | 'maxResults'
+  Prelude.Natural ->
+  ListPermissionGroups
+newListPermissionGroups pMaxResults_ =
+  ListPermissionGroups'
+    { nextToken = Prelude.Nothing,
+      maxResults = pMaxResults_
+    }
+
+-- | A token that indicates where a results page should begin.
+listPermissionGroups_nextToken :: Lens.Lens' ListPermissionGroups (Prelude.Maybe Prelude.Text)
+listPermissionGroups_nextToken = Lens.lens (\ListPermissionGroups' {nextToken} -> nextToken) (\s@ListPermissionGroups' {} a -> s {nextToken = a} :: ListPermissionGroups)
+
+-- | The maximum number of results per page.
+listPermissionGroups_maxResults :: Lens.Lens' ListPermissionGroups Prelude.Natural
+listPermissionGroups_maxResults = Lens.lens (\ListPermissionGroups' {maxResults} -> maxResults) (\s@ListPermissionGroups' {} a -> s {maxResults = a} :: ListPermissionGroups)
+
+instance Core.AWSPager ListPermissionGroups where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listPermissionGroupsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listPermissionGroupsResponse_permissionGroups
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listPermissionGroups_nextToken
+          Lens..~ rs
+          Lens.^? listPermissionGroupsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListPermissionGroups where
+  type
+    AWSResponse ListPermissionGroups =
+      ListPermissionGroupsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListPermissionGroupsResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> ( x
+                            Data..?> "permissionGroups"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListPermissionGroups where
+  hashWithSalt _salt ListPermissionGroups' {..} =
+    _salt
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` maxResults
+
+instance Prelude.NFData ListPermissionGroups where
+  rnf ListPermissionGroups' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf maxResults
+
+instance Data.ToHeaders ListPermissionGroups where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListPermissionGroups where
+  toPath = Prelude.const "/permission-group"
+
+instance Data.ToQuery ListPermissionGroups where
+  toQuery ListPermissionGroups' {..} =
+    Prelude.mconcat
+      [ "nextToken" Data.=: nextToken,
+        "maxResults" Data.=: maxResults
+      ]
+
+-- | /See:/ 'newListPermissionGroupsResponse' smart constructor.
+data ListPermissionGroupsResponse = ListPermissionGroupsResponse'
+  { -- | A token that indicates where a results page should begin.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of all the permission groups.
+    permissionGroups :: Prelude.Maybe [PermissionGroup],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListPermissionGroupsResponse' 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', 'listPermissionGroupsResponse_nextToken' - A token that indicates where a results page should begin.
+--
+-- 'permissionGroups', 'listPermissionGroupsResponse_permissionGroups' - A list of all the permission groups.
+--
+-- 'httpStatus', 'listPermissionGroupsResponse_httpStatus' - The response's http status code.
+newListPermissionGroupsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListPermissionGroupsResponse
+newListPermissionGroupsResponse pHttpStatus_ =
+  ListPermissionGroupsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      permissionGroups = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A token that indicates where a results page should begin.
+listPermissionGroupsResponse_nextToken :: Lens.Lens' ListPermissionGroupsResponse (Prelude.Maybe Prelude.Text)
+listPermissionGroupsResponse_nextToken = Lens.lens (\ListPermissionGroupsResponse' {nextToken} -> nextToken) (\s@ListPermissionGroupsResponse' {} a -> s {nextToken = a} :: ListPermissionGroupsResponse)
+
+-- | A list of all the permission groups.
+listPermissionGroupsResponse_permissionGroups :: Lens.Lens' ListPermissionGroupsResponse (Prelude.Maybe [PermissionGroup])
+listPermissionGroupsResponse_permissionGroups = Lens.lens (\ListPermissionGroupsResponse' {permissionGroups} -> permissionGroups) (\s@ListPermissionGroupsResponse' {} a -> s {permissionGroups = a} :: ListPermissionGroupsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listPermissionGroupsResponse_httpStatus :: Lens.Lens' ListPermissionGroupsResponse Prelude.Int
+listPermissionGroupsResponse_httpStatus = Lens.lens (\ListPermissionGroupsResponse' {httpStatus} -> httpStatus) (\s@ListPermissionGroupsResponse' {} a -> s {httpStatus = a} :: ListPermissionGroupsResponse)
+
+instance Prelude.NFData ListPermissionGroupsResponse where
+  rnf ListPermissionGroupsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf permissionGroups
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/ListPermissionGroupsByUser.hs b/gen/Amazonka/FinSpaceData/ListPermissionGroupsByUser.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/ListPermissionGroupsByUser.hs
@@ -0,0 +1,213 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FinSpaceData.ListPermissionGroupsByUser
+-- 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 the permission groups that are associated with a specific user
+-- account.
+module Amazonka.FinSpaceData.ListPermissionGroupsByUser
+  ( -- * Creating a Request
+    ListPermissionGroupsByUser (..),
+    newListPermissionGroupsByUser,
+
+    -- * Request Lenses
+    listPermissionGroupsByUser_nextToken,
+    listPermissionGroupsByUser_userId,
+    listPermissionGroupsByUser_maxResults,
+
+    -- * Destructuring the Response
+    ListPermissionGroupsByUserResponse (..),
+    newListPermissionGroupsByUserResponse,
+
+    -- * Response Lenses
+    listPermissionGroupsByUserResponse_nextToken,
+    listPermissionGroupsByUserResponse_permissionGroups,
+    listPermissionGroupsByUserResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListPermissionGroupsByUser' smart constructor.
+data ListPermissionGroupsByUser = ListPermissionGroupsByUser'
+  { -- | A token that indicates where a results page should begin.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier for the user.
+    userId :: Prelude.Text,
+    -- | The maximum number of results per page.
+    maxResults :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListPermissionGroupsByUser' 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', 'listPermissionGroupsByUser_nextToken' - A token that indicates where a results page should begin.
+--
+-- 'userId', 'listPermissionGroupsByUser_userId' - The unique identifier for the user.
+--
+-- 'maxResults', 'listPermissionGroupsByUser_maxResults' - The maximum number of results per page.
+newListPermissionGroupsByUser ::
+  -- | 'userId'
+  Prelude.Text ->
+  -- | 'maxResults'
+  Prelude.Natural ->
+  ListPermissionGroupsByUser
+newListPermissionGroupsByUser pUserId_ pMaxResults_ =
+  ListPermissionGroupsByUser'
+    { nextToken =
+        Prelude.Nothing,
+      userId = pUserId_,
+      maxResults = pMaxResults_
+    }
+
+-- | A token that indicates where a results page should begin.
+listPermissionGroupsByUser_nextToken :: Lens.Lens' ListPermissionGroupsByUser (Prelude.Maybe Prelude.Text)
+listPermissionGroupsByUser_nextToken = Lens.lens (\ListPermissionGroupsByUser' {nextToken} -> nextToken) (\s@ListPermissionGroupsByUser' {} a -> s {nextToken = a} :: ListPermissionGroupsByUser)
+
+-- | The unique identifier for the user.
+listPermissionGroupsByUser_userId :: Lens.Lens' ListPermissionGroupsByUser Prelude.Text
+listPermissionGroupsByUser_userId = Lens.lens (\ListPermissionGroupsByUser' {userId} -> userId) (\s@ListPermissionGroupsByUser' {} a -> s {userId = a} :: ListPermissionGroupsByUser)
+
+-- | The maximum number of results per page.
+listPermissionGroupsByUser_maxResults :: Lens.Lens' ListPermissionGroupsByUser Prelude.Natural
+listPermissionGroupsByUser_maxResults = Lens.lens (\ListPermissionGroupsByUser' {maxResults} -> maxResults) (\s@ListPermissionGroupsByUser' {} a -> s {maxResults = a} :: ListPermissionGroupsByUser)
+
+instance Core.AWSRequest ListPermissionGroupsByUser where
+  type
+    AWSResponse ListPermissionGroupsByUser =
+      ListPermissionGroupsByUserResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListPermissionGroupsByUserResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> ( x
+                            Data..?> "permissionGroups"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListPermissionGroupsByUser where
+  hashWithSalt _salt ListPermissionGroupsByUser' {..} =
+    _salt
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` userId
+      `Prelude.hashWithSalt` maxResults
+
+instance Prelude.NFData ListPermissionGroupsByUser where
+  rnf ListPermissionGroupsByUser' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf userId
+      `Prelude.seq` Prelude.rnf maxResults
+
+instance Data.ToHeaders ListPermissionGroupsByUser where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListPermissionGroupsByUser where
+  toPath ListPermissionGroupsByUser' {..} =
+    Prelude.mconcat
+      ["/user/", Data.toBS userId, "/permission-groups"]
+
+instance Data.ToQuery ListPermissionGroupsByUser where
+  toQuery ListPermissionGroupsByUser' {..} =
+    Prelude.mconcat
+      [ "nextToken" Data.=: nextToken,
+        "maxResults" Data.=: maxResults
+      ]
+
+-- | /See:/ 'newListPermissionGroupsByUserResponse' smart constructor.
+data ListPermissionGroupsByUserResponse = ListPermissionGroupsByUserResponse'
+  { -- | A token that indicates where a results page should begin.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of returned permission groups.
+    permissionGroups :: Prelude.Maybe [PermissionGroupByUser],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListPermissionGroupsByUserResponse' 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', 'listPermissionGroupsByUserResponse_nextToken' - A token that indicates where a results page should begin.
+--
+-- 'permissionGroups', 'listPermissionGroupsByUserResponse_permissionGroups' - A list of returned permission groups.
+--
+-- 'httpStatus', 'listPermissionGroupsByUserResponse_httpStatus' - The response's http status code.
+newListPermissionGroupsByUserResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListPermissionGroupsByUserResponse
+newListPermissionGroupsByUserResponse pHttpStatus_ =
+  ListPermissionGroupsByUserResponse'
+    { nextToken =
+        Prelude.Nothing,
+      permissionGroups = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A token that indicates where a results page should begin.
+listPermissionGroupsByUserResponse_nextToken :: Lens.Lens' ListPermissionGroupsByUserResponse (Prelude.Maybe Prelude.Text)
+listPermissionGroupsByUserResponse_nextToken = Lens.lens (\ListPermissionGroupsByUserResponse' {nextToken} -> nextToken) (\s@ListPermissionGroupsByUserResponse' {} a -> s {nextToken = a} :: ListPermissionGroupsByUserResponse)
+
+-- | A list of returned permission groups.
+listPermissionGroupsByUserResponse_permissionGroups :: Lens.Lens' ListPermissionGroupsByUserResponse (Prelude.Maybe [PermissionGroupByUser])
+listPermissionGroupsByUserResponse_permissionGroups = Lens.lens (\ListPermissionGroupsByUserResponse' {permissionGroups} -> permissionGroups) (\s@ListPermissionGroupsByUserResponse' {} a -> s {permissionGroups = a} :: ListPermissionGroupsByUserResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listPermissionGroupsByUserResponse_httpStatus :: Lens.Lens' ListPermissionGroupsByUserResponse Prelude.Int
+listPermissionGroupsByUserResponse_httpStatus = Lens.lens (\ListPermissionGroupsByUserResponse' {httpStatus} -> httpStatus) (\s@ListPermissionGroupsByUserResponse' {} a -> s {httpStatus = a} :: ListPermissionGroupsByUserResponse)
+
+instance
+  Prelude.NFData
+    ListPermissionGroupsByUserResponse
+  where
+  rnf ListPermissionGroupsByUserResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf permissionGroups
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/ListUsers.hs b/gen/Amazonka/FinSpaceData/ListUsers.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/ListUsers.hs
@@ -0,0 +1,210 @@
+{-# 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.FinSpaceData.ListUsers
+-- 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 available user accounts in FinSpace.
+--
+-- This operation returns paginated results.
+module Amazonka.FinSpaceData.ListUsers
+  ( -- * Creating a Request
+    ListUsers (..),
+    newListUsers,
+
+    -- * Request Lenses
+    listUsers_nextToken,
+    listUsers_maxResults,
+
+    -- * Destructuring the Response
+    ListUsersResponse (..),
+    newListUsersResponse,
+
+    -- * Response Lenses
+    listUsersResponse_nextToken,
+    listUsersResponse_users,
+    listUsersResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListUsers' smart constructor.
+data ListUsers = ListUsers'
+  { -- | A token that indicates where a results page should begin.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of results per page.
+    maxResults :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListUsers' 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', 'listUsers_nextToken' - A token that indicates where a results page should begin.
+--
+-- 'maxResults', 'listUsers_maxResults' - The maximum number of results per page.
+newListUsers ::
+  -- | 'maxResults'
+  Prelude.Natural ->
+  ListUsers
+newListUsers pMaxResults_ =
+  ListUsers'
+    { nextToken = Prelude.Nothing,
+      maxResults = pMaxResults_
+    }
+
+-- | A token that indicates where a results page should begin.
+listUsers_nextToken :: Lens.Lens' ListUsers (Prelude.Maybe Prelude.Text)
+listUsers_nextToken = Lens.lens (\ListUsers' {nextToken} -> nextToken) (\s@ListUsers' {} a -> s {nextToken = a} :: ListUsers)
+
+-- | The maximum number of results per page.
+listUsers_maxResults :: Lens.Lens' ListUsers Prelude.Natural
+listUsers_maxResults = Lens.lens (\ListUsers' {maxResults} -> maxResults) (\s@ListUsers' {} a -> s {maxResults = a} :: ListUsers)
+
+instance Core.AWSPager ListUsers where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listUsersResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listUsersResponse_users
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listUsers_nextToken
+          Lens..~ rs
+          Lens.^? listUsersResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListUsers where
+  type AWSResponse ListUsers = ListUsersResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListUsersResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "users" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListUsers where
+  hashWithSalt _salt ListUsers' {..} =
+    _salt
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` maxResults
+
+instance Prelude.NFData ListUsers where
+  rnf ListUsers' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf maxResults
+
+instance Data.ToHeaders ListUsers where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListUsers where
+  toPath = Prelude.const "/user"
+
+instance Data.ToQuery ListUsers where
+  toQuery ListUsers' {..} =
+    Prelude.mconcat
+      [ "nextToken" Data.=: nextToken,
+        "maxResults" Data.=: maxResults
+      ]
+
+-- | /See:/ 'newListUsersResponse' smart constructor.
+data ListUsersResponse = ListUsersResponse'
+  { -- | A token that indicates where a results page should begin.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of all the user accounts.
+    users :: Prelude.Maybe [User],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListUsersResponse' 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', 'listUsersResponse_nextToken' - A token that indicates where a results page should begin.
+--
+-- 'users', 'listUsersResponse_users' - A list of all the user accounts.
+--
+-- 'httpStatus', 'listUsersResponse_httpStatus' - The response's http status code.
+newListUsersResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListUsersResponse
+newListUsersResponse pHttpStatus_ =
+  ListUsersResponse'
+    { nextToken = Prelude.Nothing,
+      users = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A token that indicates where a results page should begin.
+listUsersResponse_nextToken :: Lens.Lens' ListUsersResponse (Prelude.Maybe Prelude.Text)
+listUsersResponse_nextToken = Lens.lens (\ListUsersResponse' {nextToken} -> nextToken) (\s@ListUsersResponse' {} a -> s {nextToken = a} :: ListUsersResponse)
+
+-- | A list of all the user accounts.
+listUsersResponse_users :: Lens.Lens' ListUsersResponse (Prelude.Maybe [User])
+listUsersResponse_users = Lens.lens (\ListUsersResponse' {users} -> users) (\s@ListUsersResponse' {} a -> s {users = a} :: ListUsersResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listUsersResponse_httpStatus :: Lens.Lens' ListUsersResponse Prelude.Int
+listUsersResponse_httpStatus = Lens.lens (\ListUsersResponse' {httpStatus} -> httpStatus) (\s@ListUsersResponse' {} a -> s {httpStatus = a} :: ListUsersResponse)
+
+instance Prelude.NFData ListUsersResponse where
+  rnf ListUsersResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf users
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/ListUsersByPermissionGroup.hs b/gen/Amazonka/FinSpaceData/ListUsersByPermissionGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/ListUsersByPermissionGroup.hs
@@ -0,0 +1,214 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FinSpaceData.ListUsersByPermissionGroup
+-- 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 all the users in a specific permission group.
+module Amazonka.FinSpaceData.ListUsersByPermissionGroup
+  ( -- * Creating a Request
+    ListUsersByPermissionGroup (..),
+    newListUsersByPermissionGroup,
+
+    -- * Request Lenses
+    listUsersByPermissionGroup_nextToken,
+    listUsersByPermissionGroup_permissionGroupId,
+    listUsersByPermissionGroup_maxResults,
+
+    -- * Destructuring the Response
+    ListUsersByPermissionGroupResponse (..),
+    newListUsersByPermissionGroupResponse,
+
+    -- * Response Lenses
+    listUsersByPermissionGroupResponse_nextToken,
+    listUsersByPermissionGroupResponse_users,
+    listUsersByPermissionGroupResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListUsersByPermissionGroup' smart constructor.
+data ListUsersByPermissionGroup = ListUsersByPermissionGroup'
+  { -- | A token that indicates where a results page should begin.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier for the permission group.
+    permissionGroupId :: Prelude.Text,
+    -- | The maximum number of results per page.
+    maxResults :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListUsersByPermissionGroup' 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', 'listUsersByPermissionGroup_nextToken' - A token that indicates where a results page should begin.
+--
+-- 'permissionGroupId', 'listUsersByPermissionGroup_permissionGroupId' - The unique identifier for the permission group.
+--
+-- 'maxResults', 'listUsersByPermissionGroup_maxResults' - The maximum number of results per page.
+newListUsersByPermissionGroup ::
+  -- | 'permissionGroupId'
+  Prelude.Text ->
+  -- | 'maxResults'
+  Prelude.Natural ->
+  ListUsersByPermissionGroup
+newListUsersByPermissionGroup
+  pPermissionGroupId_
+  pMaxResults_ =
+    ListUsersByPermissionGroup'
+      { nextToken =
+          Prelude.Nothing,
+        permissionGroupId = pPermissionGroupId_,
+        maxResults = pMaxResults_
+      }
+
+-- | A token that indicates where a results page should begin.
+listUsersByPermissionGroup_nextToken :: Lens.Lens' ListUsersByPermissionGroup (Prelude.Maybe Prelude.Text)
+listUsersByPermissionGroup_nextToken = Lens.lens (\ListUsersByPermissionGroup' {nextToken} -> nextToken) (\s@ListUsersByPermissionGroup' {} a -> s {nextToken = a} :: ListUsersByPermissionGroup)
+
+-- | The unique identifier for the permission group.
+listUsersByPermissionGroup_permissionGroupId :: Lens.Lens' ListUsersByPermissionGroup Prelude.Text
+listUsersByPermissionGroup_permissionGroupId = Lens.lens (\ListUsersByPermissionGroup' {permissionGroupId} -> permissionGroupId) (\s@ListUsersByPermissionGroup' {} a -> s {permissionGroupId = a} :: ListUsersByPermissionGroup)
+
+-- | The maximum number of results per page.
+listUsersByPermissionGroup_maxResults :: Lens.Lens' ListUsersByPermissionGroup Prelude.Natural
+listUsersByPermissionGroup_maxResults = Lens.lens (\ListUsersByPermissionGroup' {maxResults} -> maxResults) (\s@ListUsersByPermissionGroup' {} a -> s {maxResults = a} :: ListUsersByPermissionGroup)
+
+instance Core.AWSRequest ListUsersByPermissionGroup where
+  type
+    AWSResponse ListUsersByPermissionGroup =
+      ListUsersByPermissionGroupResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListUsersByPermissionGroupResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "users" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListUsersByPermissionGroup where
+  hashWithSalt _salt ListUsersByPermissionGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` permissionGroupId
+      `Prelude.hashWithSalt` maxResults
+
+instance Prelude.NFData ListUsersByPermissionGroup where
+  rnf ListUsersByPermissionGroup' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf permissionGroupId
+      `Prelude.seq` Prelude.rnf maxResults
+
+instance Data.ToHeaders ListUsersByPermissionGroup where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListUsersByPermissionGroup where
+  toPath ListUsersByPermissionGroup' {..} =
+    Prelude.mconcat
+      [ "/permission-group/",
+        Data.toBS permissionGroupId,
+        "/users"
+      ]
+
+instance Data.ToQuery ListUsersByPermissionGroup where
+  toQuery ListUsersByPermissionGroup' {..} =
+    Prelude.mconcat
+      [ "nextToken" Data.=: nextToken,
+        "maxResults" Data.=: maxResults
+      ]
+
+-- | /See:/ 'newListUsersByPermissionGroupResponse' smart constructor.
+data ListUsersByPermissionGroupResponse = ListUsersByPermissionGroupResponse'
+  { -- | A token that indicates where a results page should begin.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Lists details of all users in a specific permission group.
+    users :: Prelude.Maybe [UserByPermissionGroup],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListUsersByPermissionGroupResponse' 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', 'listUsersByPermissionGroupResponse_nextToken' - A token that indicates where a results page should begin.
+--
+-- 'users', 'listUsersByPermissionGroupResponse_users' - Lists details of all users in a specific permission group.
+--
+-- 'httpStatus', 'listUsersByPermissionGroupResponse_httpStatus' - The response's http status code.
+newListUsersByPermissionGroupResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListUsersByPermissionGroupResponse
+newListUsersByPermissionGroupResponse pHttpStatus_ =
+  ListUsersByPermissionGroupResponse'
+    { nextToken =
+        Prelude.Nothing,
+      users = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A token that indicates where a results page should begin.
+listUsersByPermissionGroupResponse_nextToken :: Lens.Lens' ListUsersByPermissionGroupResponse (Prelude.Maybe Prelude.Text)
+listUsersByPermissionGroupResponse_nextToken = Lens.lens (\ListUsersByPermissionGroupResponse' {nextToken} -> nextToken) (\s@ListUsersByPermissionGroupResponse' {} a -> s {nextToken = a} :: ListUsersByPermissionGroupResponse)
+
+-- | Lists details of all users in a specific permission group.
+listUsersByPermissionGroupResponse_users :: Lens.Lens' ListUsersByPermissionGroupResponse (Prelude.Maybe [UserByPermissionGroup])
+listUsersByPermissionGroupResponse_users = Lens.lens (\ListUsersByPermissionGroupResponse' {users} -> users) (\s@ListUsersByPermissionGroupResponse' {} a -> s {users = a} :: ListUsersByPermissionGroupResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listUsersByPermissionGroupResponse_httpStatus :: Lens.Lens' ListUsersByPermissionGroupResponse Prelude.Int
+listUsersByPermissionGroupResponse_httpStatus = Lens.lens (\ListUsersByPermissionGroupResponse' {httpStatus} -> httpStatus) (\s@ListUsersByPermissionGroupResponse' {} a -> s {httpStatus = a} :: ListUsersByPermissionGroupResponse)
+
+instance
+  Prelude.NFData
+    ListUsersByPermissionGroupResponse
+  where
+  rnf ListUsersByPermissionGroupResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf users
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/ResetUserPassword.hs b/gen/Amazonka/FinSpaceData/ResetUserPassword.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/ResetUserPassword.hs
@@ -0,0 +1,203 @@
+{-# 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.FinSpaceData.ResetUserPassword
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Resets the password for a specified user ID and generates a temporary
+-- one. Only a superuser can reset password for other users. Resetting the
+-- password immediately invalidates the previous password associated with
+-- the user.
+module Amazonka.FinSpaceData.ResetUserPassword
+  ( -- * Creating a Request
+    ResetUserPassword (..),
+    newResetUserPassword,
+
+    -- * Request Lenses
+    resetUserPassword_clientToken,
+    resetUserPassword_userId,
+
+    -- * Destructuring the Response
+    ResetUserPasswordResponse (..),
+    newResetUserPasswordResponse,
+
+    -- * Response Lenses
+    resetUserPasswordResponse_temporaryPassword,
+    resetUserPasswordResponse_userId,
+    resetUserPasswordResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newResetUserPassword' smart constructor.
+data ResetUserPassword = ResetUserPassword'
+  { -- | A token that ensures idempotency. This token expires in 10 minutes.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier of the user that a temporary password is requested
+    -- for.
+    userId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ResetUserPassword' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'resetUserPassword_clientToken' - A token that ensures idempotency. This token expires in 10 minutes.
+--
+-- 'userId', 'resetUserPassword_userId' - The unique identifier of the user that a temporary password is requested
+-- for.
+newResetUserPassword ::
+  -- | 'userId'
+  Prelude.Text ->
+  ResetUserPassword
+newResetUserPassword pUserId_ =
+  ResetUserPassword'
+    { clientToken = Prelude.Nothing,
+      userId = pUserId_
+    }
+
+-- | A token that ensures idempotency. This token expires in 10 minutes.
+resetUserPassword_clientToken :: Lens.Lens' ResetUserPassword (Prelude.Maybe Prelude.Text)
+resetUserPassword_clientToken = Lens.lens (\ResetUserPassword' {clientToken} -> clientToken) (\s@ResetUserPassword' {} a -> s {clientToken = a} :: ResetUserPassword)
+
+-- | The unique identifier of the user that a temporary password is requested
+-- for.
+resetUserPassword_userId :: Lens.Lens' ResetUserPassword Prelude.Text
+resetUserPassword_userId = Lens.lens (\ResetUserPassword' {userId} -> userId) (\s@ResetUserPassword' {} a -> s {userId = a} :: ResetUserPassword)
+
+instance Core.AWSRequest ResetUserPassword where
+  type
+    AWSResponse ResetUserPassword =
+      ResetUserPasswordResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ResetUserPasswordResponse'
+            Prelude.<$> (x Data..?> "temporaryPassword")
+            Prelude.<*> (x Data..?> "userId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ResetUserPassword where
+  hashWithSalt _salt ResetUserPassword' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` userId
+
+instance Prelude.NFData ResetUserPassword where
+  rnf ResetUserPassword' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf userId
+
+instance Data.ToHeaders ResetUserPassword where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ResetUserPassword where
+  toJSON ResetUserPassword' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("clientToken" Data..=) Prelude.<$> clientToken]
+      )
+
+instance Data.ToPath ResetUserPassword where
+  toPath ResetUserPassword' {..} =
+    Prelude.mconcat
+      ["/user/", Data.toBS userId, "/password"]
+
+instance Data.ToQuery ResetUserPassword where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newResetUserPasswordResponse' smart constructor.
+data ResetUserPasswordResponse = ResetUserPasswordResponse'
+  { -- | A randomly generated temporary password for the requested user account.
+    -- This password expires in 7 days.
+    temporaryPassword :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The unique identifier of the user that a new password is generated for.
+    userId :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ResetUserPasswordResponse' 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:
+--
+-- 'temporaryPassword', 'resetUserPasswordResponse_temporaryPassword' - A randomly generated temporary password for the requested user account.
+-- This password expires in 7 days.
+--
+-- 'userId', 'resetUserPasswordResponse_userId' - The unique identifier of the user that a new password is generated for.
+--
+-- 'httpStatus', 'resetUserPasswordResponse_httpStatus' - The response's http status code.
+newResetUserPasswordResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ResetUserPasswordResponse
+newResetUserPasswordResponse pHttpStatus_ =
+  ResetUserPasswordResponse'
+    { temporaryPassword =
+        Prelude.Nothing,
+      userId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A randomly generated temporary password for the requested user account.
+-- This password expires in 7 days.
+resetUserPasswordResponse_temporaryPassword :: Lens.Lens' ResetUserPasswordResponse (Prelude.Maybe Prelude.Text)
+resetUserPasswordResponse_temporaryPassword = Lens.lens (\ResetUserPasswordResponse' {temporaryPassword} -> temporaryPassword) (\s@ResetUserPasswordResponse' {} a -> s {temporaryPassword = a} :: ResetUserPasswordResponse) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The unique identifier of the user that a new password is generated for.
+resetUserPasswordResponse_userId :: Lens.Lens' ResetUserPasswordResponse (Prelude.Maybe Prelude.Text)
+resetUserPasswordResponse_userId = Lens.lens (\ResetUserPasswordResponse' {userId} -> userId) (\s@ResetUserPasswordResponse' {} a -> s {userId = a} :: ResetUserPasswordResponse)
+
+-- | The response's http status code.
+resetUserPasswordResponse_httpStatus :: Lens.Lens' ResetUserPasswordResponse Prelude.Int
+resetUserPasswordResponse_httpStatus = Lens.lens (\ResetUserPasswordResponse' {httpStatus} -> httpStatus) (\s@ResetUserPasswordResponse' {} a -> s {httpStatus = a} :: ResetUserPasswordResponse)
+
+instance Prelude.NFData ResetUserPasswordResponse where
+  rnf ResetUserPasswordResponse' {..} =
+    Prelude.rnf temporaryPassword
+      `Prelude.seq` Prelude.rnf userId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/Types.hs b/gen/Amazonka/FinSpaceData/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types.hs
@@ -0,0 +1,407 @@
+{-# 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.FinSpaceData.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.FinSpaceData.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _AccessDeniedException,
+    _ConflictException,
+    _InternalServerException,
+    _LimitExceededException,
+    _ResourceNotFoundException,
+    _ThrottlingException,
+    _ValidationException,
+
+    -- * ApiAccess
+    ApiAccess (..),
+
+    -- * ApplicationPermission
+    ApplicationPermission (..),
+
+    -- * ChangeType
+    ChangeType (..),
+
+    -- * ColumnDataType
+    ColumnDataType (..),
+
+    -- * DataViewStatus
+    DataViewStatus (..),
+
+    -- * DatasetKind
+    DatasetKind (..),
+
+    -- * DatasetStatus
+    DatasetStatus (..),
+
+    -- * ErrorCategory
+    ErrorCategory (..),
+
+    -- * ExportFileFormat
+    ExportFileFormat (..),
+
+    -- * IngestionStatus
+    IngestionStatus (..),
+
+    -- * LocationType
+    LocationType (..),
+
+    -- * PermissionGroupMembershipStatus
+    PermissionGroupMembershipStatus (..),
+
+    -- * UserStatus
+    UserStatus (..),
+
+    -- * UserType
+    UserType (..),
+
+    -- * AwsCredentials
+    AwsCredentials (..),
+    newAwsCredentials,
+    awsCredentials_accessKeyId,
+    awsCredentials_expiration,
+    awsCredentials_secretAccessKey,
+    awsCredentials_sessionToken,
+
+    -- * ChangesetErrorInfo
+    ChangesetErrorInfo (..),
+    newChangesetErrorInfo,
+    changesetErrorInfo_errorCategory,
+    changesetErrorInfo_errorMessage,
+
+    -- * ChangesetSummary
+    ChangesetSummary (..),
+    newChangesetSummary,
+    changesetSummary_activeFromTimestamp,
+    changesetSummary_activeUntilTimestamp,
+    changesetSummary_changeType,
+    changesetSummary_changesetArn,
+    changesetSummary_changesetId,
+    changesetSummary_createTime,
+    changesetSummary_datasetId,
+    changesetSummary_errorInfo,
+    changesetSummary_formatParams,
+    changesetSummary_sourceParams,
+    changesetSummary_status,
+    changesetSummary_updatedByChangesetId,
+    changesetSummary_updatesChangesetId,
+
+    -- * ColumnDefinition
+    ColumnDefinition (..),
+    newColumnDefinition,
+    columnDefinition_columnDescription,
+    columnDefinition_columnName,
+    columnDefinition_dataType,
+
+    -- * Credentials
+    Credentials (..),
+    newCredentials,
+    credentials_accessKeyId,
+    credentials_secretAccessKey,
+    credentials_sessionToken,
+
+    -- * DataViewDestinationTypeParams
+    DataViewDestinationTypeParams (..),
+    newDataViewDestinationTypeParams,
+    dataViewDestinationTypeParams_s3DestinationExportFileFormat,
+    dataViewDestinationTypeParams_s3DestinationExportFileFormatOptions,
+    dataViewDestinationTypeParams_destinationType,
+
+    -- * DataViewErrorInfo
+    DataViewErrorInfo (..),
+    newDataViewErrorInfo,
+    dataViewErrorInfo_errorCategory,
+    dataViewErrorInfo_errorMessage,
+
+    -- * DataViewSummary
+    DataViewSummary (..),
+    newDataViewSummary,
+    dataViewSummary_asOfTimestamp,
+    dataViewSummary_autoUpdate,
+    dataViewSummary_createTime,
+    dataViewSummary_dataViewArn,
+    dataViewSummary_dataViewId,
+    dataViewSummary_datasetId,
+    dataViewSummary_destinationTypeProperties,
+    dataViewSummary_errorInfo,
+    dataViewSummary_lastModifiedTime,
+    dataViewSummary_partitionColumns,
+    dataViewSummary_sortColumns,
+    dataViewSummary_status,
+
+    -- * Dataset
+    Dataset (..),
+    newDataset,
+    dataset_alias,
+    dataset_createTime,
+    dataset_datasetArn,
+    dataset_datasetDescription,
+    dataset_datasetId,
+    dataset_datasetTitle,
+    dataset_kind,
+    dataset_lastModifiedTime,
+    dataset_ownerInfo,
+    dataset_schemaDefinition,
+
+    -- * DatasetOwnerInfo
+    DatasetOwnerInfo (..),
+    newDatasetOwnerInfo,
+    datasetOwnerInfo_email,
+    datasetOwnerInfo_name,
+    datasetOwnerInfo_phoneNumber,
+
+    -- * PermissionGroup
+    PermissionGroup (..),
+    newPermissionGroup,
+    permissionGroup_applicationPermissions,
+    permissionGroup_createTime,
+    permissionGroup_description,
+    permissionGroup_lastModifiedTime,
+    permissionGroup_membershipStatus,
+    permissionGroup_name,
+    permissionGroup_permissionGroupId,
+
+    -- * PermissionGroupByUser
+    PermissionGroupByUser (..),
+    newPermissionGroupByUser,
+    permissionGroupByUser_membershipStatus,
+    permissionGroupByUser_name,
+    permissionGroupByUser_permissionGroupId,
+
+    -- * PermissionGroupParams
+    PermissionGroupParams (..),
+    newPermissionGroupParams,
+    permissionGroupParams_datasetPermissions,
+    permissionGroupParams_permissionGroupId,
+
+    -- * ResourcePermission
+    ResourcePermission (..),
+    newResourcePermission,
+    resourcePermission_permission,
+
+    -- * S3Location
+    S3Location (..),
+    newS3Location,
+    s3Location_bucket,
+    s3Location_key,
+
+    -- * SchemaDefinition
+    SchemaDefinition (..),
+    newSchemaDefinition,
+    schemaDefinition_columns,
+    schemaDefinition_primaryKeyColumns,
+
+    -- * SchemaUnion
+    SchemaUnion (..),
+    newSchemaUnion,
+    schemaUnion_tabularSchemaConfig,
+
+    -- * User
+    User (..),
+    newUser,
+    user_apiAccess,
+    user_apiAccessPrincipalArn,
+    user_createTime,
+    user_emailAddress,
+    user_firstName,
+    user_lastDisabledTime,
+    user_lastEnabledTime,
+    user_lastLoginTime,
+    user_lastModifiedTime,
+    user_lastName,
+    user_status,
+    user_type,
+    user_userId,
+
+    -- * UserByPermissionGroup
+    UserByPermissionGroup (..),
+    newUserByPermissionGroup,
+    userByPermissionGroup_apiAccess,
+    userByPermissionGroup_apiAccessPrincipalArn,
+    userByPermissionGroup_emailAddress,
+    userByPermissionGroup_firstName,
+    userByPermissionGroup_lastName,
+    userByPermissionGroup_membershipStatus,
+    userByPermissionGroup_status,
+    userByPermissionGroup_type,
+    userByPermissionGroup_userId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import Amazonka.FinSpaceData.Types.ApiAccess
+import Amazonka.FinSpaceData.Types.ApplicationPermission
+import Amazonka.FinSpaceData.Types.AwsCredentials
+import Amazonka.FinSpaceData.Types.ChangeType
+import Amazonka.FinSpaceData.Types.ChangesetErrorInfo
+import Amazonka.FinSpaceData.Types.ChangesetSummary
+import Amazonka.FinSpaceData.Types.ColumnDataType
+import Amazonka.FinSpaceData.Types.ColumnDefinition
+import Amazonka.FinSpaceData.Types.Credentials
+import Amazonka.FinSpaceData.Types.DataViewDestinationTypeParams
+import Amazonka.FinSpaceData.Types.DataViewErrorInfo
+import Amazonka.FinSpaceData.Types.DataViewStatus
+import Amazonka.FinSpaceData.Types.DataViewSummary
+import Amazonka.FinSpaceData.Types.Dataset
+import Amazonka.FinSpaceData.Types.DatasetKind
+import Amazonka.FinSpaceData.Types.DatasetOwnerInfo
+import Amazonka.FinSpaceData.Types.DatasetStatus
+import Amazonka.FinSpaceData.Types.ErrorCategory
+import Amazonka.FinSpaceData.Types.ExportFileFormat
+import Amazonka.FinSpaceData.Types.IngestionStatus
+import Amazonka.FinSpaceData.Types.LocationType
+import Amazonka.FinSpaceData.Types.PermissionGroup
+import Amazonka.FinSpaceData.Types.PermissionGroupByUser
+import Amazonka.FinSpaceData.Types.PermissionGroupMembershipStatus
+import Amazonka.FinSpaceData.Types.PermissionGroupParams
+import Amazonka.FinSpaceData.Types.ResourcePermission
+import Amazonka.FinSpaceData.Types.S3Location
+import Amazonka.FinSpaceData.Types.SchemaDefinition
+import Amazonka.FinSpaceData.Types.SchemaUnion
+import Amazonka.FinSpaceData.Types.User
+import Amazonka.FinSpaceData.Types.UserByPermissionGroup
+import Amazonka.FinSpaceData.Types.UserStatus
+import Amazonka.FinSpaceData.Types.UserType
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2020-07-13@ of the Amazon FinSpace Public API SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "FinSpaceData",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "finspace-api",
+      Core.signingName = "finspace-api",
+      Core.version = "2020-07-13",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "FinSpaceData",
+      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 do not have sufficient access to perform this action.
+_AccessDeniedException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_AccessDeniedException =
+  Core._MatchServiceError
+    defaultService
+    "AccessDeniedException"
+    Prelude.. Core.hasStatus 403
+
+-- | The request conflicts with an existing resource.
+_ConflictException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ConflictException =
+  Core._MatchServiceError
+    defaultService
+    "ConflictException"
+    Prelude.. Core.hasStatus 409
+
+-- | The request processing has failed because of an unknown error, exception
+-- or failure.
+_InternalServerException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalServerException =
+  Core._MatchServiceError
+    defaultService
+    "InternalServerException"
+    Prelude.. Core.hasStatus 500
+
+-- | A limit has exceeded.
+_LimitExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_LimitExceededException =
+  Core._MatchServiceError
+    defaultService
+    "LimitExceededException"
+    Prelude.. Core.hasStatus 400
+
+-- | One or more resources can\'t be found.
+_ResourceNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNotFoundException"
+    Prelude.. Core.hasStatus 404
+
+-- | The request was denied due to request throttling.
+_ThrottlingException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ThrottlingException =
+  Core._MatchServiceError
+    defaultService
+    "ThrottlingException"
+    Prelude.. Core.hasStatus 429
+
+-- | The input fails to satisfy the constraints specified by an AWS service.
+_ValidationException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ValidationException =
+  Core._MatchServiceError
+    defaultService
+    "ValidationException"
+    Prelude.. Core.hasStatus 400
diff --git a/gen/Amazonka/FinSpaceData/Types/ApiAccess.hs b/gen/Amazonka/FinSpaceData/Types/ApiAccess.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/ApiAccess.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.FinSpaceData.Types.ApiAccess
+-- 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.FinSpaceData.Types.ApiAccess
+  ( ApiAccess
+      ( ..,
+        ApiAccess_DISABLED,
+        ApiAccess_ENABLED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ApiAccess = ApiAccess'
+  { fromApiAccess ::
+      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 ApiAccess_DISABLED :: ApiAccess
+pattern ApiAccess_DISABLED = ApiAccess' "DISABLED"
+
+pattern ApiAccess_ENABLED :: ApiAccess
+pattern ApiAccess_ENABLED = ApiAccess' "ENABLED"
+
+{-# COMPLETE
+  ApiAccess_DISABLED,
+  ApiAccess_ENABLED,
+  ApiAccess'
+  #-}
diff --git a/gen/Amazonka/FinSpaceData/Types/ApplicationPermission.hs b/gen/Amazonka/FinSpaceData/Types/ApplicationPermission.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/ApplicationPermission.hs
@@ -0,0 +1,96 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FinSpaceData.Types.ApplicationPermission
+-- 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.FinSpaceData.Types.ApplicationPermission
+  ( ApplicationPermission
+      ( ..,
+        ApplicationPermission_AccessNotebooks,
+        ApplicationPermission_CreateDataset,
+        ApplicationPermission_GetTemporaryCredentials,
+        ApplicationPermission_ManageAttributeSets,
+        ApplicationPermission_ManageClusters,
+        ApplicationPermission_ManageUsersAndGroups,
+        ApplicationPermission_ViewAuditData
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ApplicationPermission = ApplicationPermission'
+  { fromApplicationPermission ::
+      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 ApplicationPermission_AccessNotebooks :: ApplicationPermission
+pattern ApplicationPermission_AccessNotebooks = ApplicationPermission' "AccessNotebooks"
+
+pattern ApplicationPermission_CreateDataset :: ApplicationPermission
+pattern ApplicationPermission_CreateDataset = ApplicationPermission' "CreateDataset"
+
+pattern ApplicationPermission_GetTemporaryCredentials :: ApplicationPermission
+pattern ApplicationPermission_GetTemporaryCredentials = ApplicationPermission' "GetTemporaryCredentials"
+
+pattern ApplicationPermission_ManageAttributeSets :: ApplicationPermission
+pattern ApplicationPermission_ManageAttributeSets = ApplicationPermission' "ManageAttributeSets"
+
+pattern ApplicationPermission_ManageClusters :: ApplicationPermission
+pattern ApplicationPermission_ManageClusters = ApplicationPermission' "ManageClusters"
+
+pattern ApplicationPermission_ManageUsersAndGroups :: ApplicationPermission
+pattern ApplicationPermission_ManageUsersAndGroups = ApplicationPermission' "ManageUsersAndGroups"
+
+pattern ApplicationPermission_ViewAuditData :: ApplicationPermission
+pattern ApplicationPermission_ViewAuditData = ApplicationPermission' "ViewAuditData"
+
+{-# COMPLETE
+  ApplicationPermission_AccessNotebooks,
+  ApplicationPermission_CreateDataset,
+  ApplicationPermission_GetTemporaryCredentials,
+  ApplicationPermission_ManageAttributeSets,
+  ApplicationPermission_ManageClusters,
+  ApplicationPermission_ManageUsersAndGroups,
+  ApplicationPermission_ViewAuditData,
+  ApplicationPermission'
+  #-}
diff --git a/gen/Amazonka/FinSpaceData/Types/AwsCredentials.hs b/gen/Amazonka/FinSpaceData/Types/AwsCredentials.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/AwsCredentials.hs
@@ -0,0 +1,109 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FinSpaceData.Types.AwsCredentials
+-- 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.FinSpaceData.Types.AwsCredentials 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 credentials required to access the external Dataview from the S3
+-- location.
+--
+-- /See:/ 'newAwsCredentials' smart constructor.
+data AwsCredentials = AwsCredentials'
+  { -- | The unique identifier for the security credentials.
+    accessKeyId :: Prelude.Maybe Prelude.Text,
+    -- | The Epoch time when the current credentials expire.
+    expiration :: Prelude.Maybe Prelude.Integer,
+    -- | The secret access key that can be used to sign requests.
+    secretAccessKey :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The token that users must pass to use the credentials.
+    sessionToken :: Prelude.Maybe (Data.Sensitive Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AwsCredentials' 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:
+--
+-- 'accessKeyId', 'awsCredentials_accessKeyId' - The unique identifier for the security credentials.
+--
+-- 'expiration', 'awsCredentials_expiration' - The Epoch time when the current credentials expire.
+--
+-- 'secretAccessKey', 'awsCredentials_secretAccessKey' - The secret access key that can be used to sign requests.
+--
+-- 'sessionToken', 'awsCredentials_sessionToken' - The token that users must pass to use the credentials.
+newAwsCredentials ::
+  AwsCredentials
+newAwsCredentials =
+  AwsCredentials'
+    { accessKeyId = Prelude.Nothing,
+      expiration = Prelude.Nothing,
+      secretAccessKey = Prelude.Nothing,
+      sessionToken = Prelude.Nothing
+    }
+
+-- | The unique identifier for the security credentials.
+awsCredentials_accessKeyId :: Lens.Lens' AwsCredentials (Prelude.Maybe Prelude.Text)
+awsCredentials_accessKeyId = Lens.lens (\AwsCredentials' {accessKeyId} -> accessKeyId) (\s@AwsCredentials' {} a -> s {accessKeyId = a} :: AwsCredentials)
+
+-- | The Epoch time when the current credentials expire.
+awsCredentials_expiration :: Lens.Lens' AwsCredentials (Prelude.Maybe Prelude.Integer)
+awsCredentials_expiration = Lens.lens (\AwsCredentials' {expiration} -> expiration) (\s@AwsCredentials' {} a -> s {expiration = a} :: AwsCredentials)
+
+-- | The secret access key that can be used to sign requests.
+awsCredentials_secretAccessKey :: Lens.Lens' AwsCredentials (Prelude.Maybe Prelude.Text)
+awsCredentials_secretAccessKey = Lens.lens (\AwsCredentials' {secretAccessKey} -> secretAccessKey) (\s@AwsCredentials' {} a -> s {secretAccessKey = a} :: AwsCredentials) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The token that users must pass to use the credentials.
+awsCredentials_sessionToken :: Lens.Lens' AwsCredentials (Prelude.Maybe Prelude.Text)
+awsCredentials_sessionToken = Lens.lens (\AwsCredentials' {sessionToken} -> sessionToken) (\s@AwsCredentials' {} a -> s {sessionToken = a} :: AwsCredentials) Prelude.. Lens.mapping Data._Sensitive
+
+instance Data.FromJSON AwsCredentials where
+  parseJSON =
+    Data.withObject
+      "AwsCredentials"
+      ( \x ->
+          AwsCredentials'
+            Prelude.<$> (x Data..:? "accessKeyId")
+            Prelude.<*> (x Data..:? "expiration")
+            Prelude.<*> (x Data..:? "secretAccessKey")
+            Prelude.<*> (x Data..:? "sessionToken")
+      )
+
+instance Prelude.Hashable AwsCredentials where
+  hashWithSalt _salt AwsCredentials' {..} =
+    _salt
+      `Prelude.hashWithSalt` accessKeyId
+      `Prelude.hashWithSalt` expiration
+      `Prelude.hashWithSalt` secretAccessKey
+      `Prelude.hashWithSalt` sessionToken
+
+instance Prelude.NFData AwsCredentials where
+  rnf AwsCredentials' {..} =
+    Prelude.rnf accessKeyId
+      `Prelude.seq` Prelude.rnf expiration
+      `Prelude.seq` Prelude.rnf secretAccessKey
+      `Prelude.seq` Prelude.rnf sessionToken
diff --git a/gen/Amazonka/FinSpaceData/Types/ChangeType.hs b/gen/Amazonka/FinSpaceData/Types/ChangeType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/ChangeType.hs
@@ -0,0 +1,77 @@
+{-# 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.FinSpaceData.Types.ChangeType
+-- 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.FinSpaceData.Types.ChangeType
+  ( ChangeType
+      ( ..,
+        ChangeType_APPEND,
+        ChangeType_MODIFY,
+        ChangeType_REPLACE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Indicates how the given change will be applied to the dataset.
+newtype ChangeType = ChangeType'
+  { fromChangeType ::
+      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 ChangeType_APPEND :: ChangeType
+pattern ChangeType_APPEND = ChangeType' "APPEND"
+
+pattern ChangeType_MODIFY :: ChangeType
+pattern ChangeType_MODIFY = ChangeType' "MODIFY"
+
+pattern ChangeType_REPLACE :: ChangeType
+pattern ChangeType_REPLACE = ChangeType' "REPLACE"
+
+{-# COMPLETE
+  ChangeType_APPEND,
+  ChangeType_MODIFY,
+  ChangeType_REPLACE,
+  ChangeType'
+  #-}
diff --git a/gen/Amazonka/FinSpaceData/Types/ChangesetErrorInfo.hs b/gen/Amazonka/FinSpaceData/Types/ChangesetErrorInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/ChangesetErrorInfo.hs
@@ -0,0 +1,149 @@
+{-# 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.FinSpaceData.Types.ChangesetErrorInfo
+-- 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.FinSpaceData.Types.ChangesetErrorInfo where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types.ErrorCategory
+import qualified Amazonka.Prelude as Prelude
+
+-- | The structure with error messages.
+--
+-- /See:/ 'newChangesetErrorInfo' smart constructor.
+data ChangesetErrorInfo = ChangesetErrorInfo'
+  { -- | The category of the error.
+    --
+    -- -   @VALIDATION@ – The inputs to this request are invalid.
+    --
+    -- -   @SERVICE_QUOTA_EXCEEDED@ – Service quotas have been exceeded. Please
+    --     contact AWS support to increase quotas.
+    --
+    -- -   @ACCESS_DENIED@ – Missing required permission to perform this
+    --     request.
+    --
+    -- -   @RESOURCE_NOT_FOUND@ – One or more inputs to this request were not
+    --     found.
+    --
+    -- -   @THROTTLING@ – The system temporarily lacks sufficient resources to
+    --     process the request.
+    --
+    -- -   @INTERNAL_SERVICE_EXCEPTION@ – An internal service error has
+    --     occurred.
+    --
+    -- -   @CANCELLED@ – Cancelled.
+    --
+    -- -   @USER_RECOVERABLE@ – A user recoverable error has occurred.
+    errorCategory :: Prelude.Maybe ErrorCategory,
+    -- | The text of the error message.
+    errorMessage :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ChangesetErrorInfo' 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:
+--
+-- 'errorCategory', 'changesetErrorInfo_errorCategory' - The category of the error.
+--
+-- -   @VALIDATION@ – The inputs to this request are invalid.
+--
+-- -   @SERVICE_QUOTA_EXCEEDED@ – Service quotas have been exceeded. Please
+--     contact AWS support to increase quotas.
+--
+-- -   @ACCESS_DENIED@ – Missing required permission to perform this
+--     request.
+--
+-- -   @RESOURCE_NOT_FOUND@ – One or more inputs to this request were not
+--     found.
+--
+-- -   @THROTTLING@ – The system temporarily lacks sufficient resources to
+--     process the request.
+--
+-- -   @INTERNAL_SERVICE_EXCEPTION@ – An internal service error has
+--     occurred.
+--
+-- -   @CANCELLED@ – Cancelled.
+--
+-- -   @USER_RECOVERABLE@ – A user recoverable error has occurred.
+--
+-- 'errorMessage', 'changesetErrorInfo_errorMessage' - The text of the error message.
+newChangesetErrorInfo ::
+  ChangesetErrorInfo
+newChangesetErrorInfo =
+  ChangesetErrorInfo'
+    { errorCategory =
+        Prelude.Nothing,
+      errorMessage = Prelude.Nothing
+    }
+
+-- | The category of the error.
+--
+-- -   @VALIDATION@ – The inputs to this request are invalid.
+--
+-- -   @SERVICE_QUOTA_EXCEEDED@ – Service quotas have been exceeded. Please
+--     contact AWS support to increase quotas.
+--
+-- -   @ACCESS_DENIED@ – Missing required permission to perform this
+--     request.
+--
+-- -   @RESOURCE_NOT_FOUND@ – One or more inputs to this request were not
+--     found.
+--
+-- -   @THROTTLING@ – The system temporarily lacks sufficient resources to
+--     process the request.
+--
+-- -   @INTERNAL_SERVICE_EXCEPTION@ – An internal service error has
+--     occurred.
+--
+-- -   @CANCELLED@ – Cancelled.
+--
+-- -   @USER_RECOVERABLE@ – A user recoverable error has occurred.
+changesetErrorInfo_errorCategory :: Lens.Lens' ChangesetErrorInfo (Prelude.Maybe ErrorCategory)
+changesetErrorInfo_errorCategory = Lens.lens (\ChangesetErrorInfo' {errorCategory} -> errorCategory) (\s@ChangesetErrorInfo' {} a -> s {errorCategory = a} :: ChangesetErrorInfo)
+
+-- | The text of the error message.
+changesetErrorInfo_errorMessage :: Lens.Lens' ChangesetErrorInfo (Prelude.Maybe Prelude.Text)
+changesetErrorInfo_errorMessage = Lens.lens (\ChangesetErrorInfo' {errorMessage} -> errorMessage) (\s@ChangesetErrorInfo' {} a -> s {errorMessage = a} :: ChangesetErrorInfo)
+
+instance Data.FromJSON ChangesetErrorInfo where
+  parseJSON =
+    Data.withObject
+      "ChangesetErrorInfo"
+      ( \x ->
+          ChangesetErrorInfo'
+            Prelude.<$> (x Data..:? "errorCategory")
+            Prelude.<*> (x Data..:? "errorMessage")
+      )
+
+instance Prelude.Hashable ChangesetErrorInfo where
+  hashWithSalt _salt ChangesetErrorInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` errorCategory
+      `Prelude.hashWithSalt` errorMessage
+
+instance Prelude.NFData ChangesetErrorInfo where
+  rnf ChangesetErrorInfo' {..} =
+    Prelude.rnf errorCategory
+      `Prelude.seq` Prelude.rnf errorMessage
diff --git a/gen/Amazonka/FinSpaceData/Types/ChangesetSummary.hs b/gen/Amazonka/FinSpaceData/Types/ChangesetSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/ChangesetSummary.hs
@@ -0,0 +1,298 @@
+{-# 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.FinSpaceData.Types.ChangesetSummary
+-- 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.FinSpaceData.Types.ChangesetSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types.ChangeType
+import Amazonka.FinSpaceData.Types.ChangesetErrorInfo
+import Amazonka.FinSpaceData.Types.IngestionStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | A Changeset is unit of data in a Dataset.
+--
+-- /See:/ 'newChangesetSummary' smart constructor.
+data ChangesetSummary = ChangesetSummary'
+  { -- | Beginning time from which the Changeset is active. The value is
+    -- determined as epoch time in milliseconds. For example, the value for
+    -- Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+    activeFromTimestamp :: Prelude.Maybe Prelude.Integer,
+    -- | Time until which the Changeset is active. The value is determined as
+    -- epoch time in milliseconds. For example, the value for Monday, November
+    -- 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+    activeUntilTimestamp :: Prelude.Maybe Prelude.Integer,
+    -- | Type that indicates how a Changeset is applied to a Dataset.
+    --
+    -- -   @REPLACE@ – Changeset is considered as a replacement to all prior
+    --     loaded Changesets.
+    --
+    -- -   @APPEND@ – Changeset is considered as an addition to the end of all
+    --     prior loaded Changesets.
+    --
+    -- -   @MODIFY@ – Changeset is considered as a replacement to a specific
+    --     prior ingested Changeset.
+    changeType :: Prelude.Maybe ChangeType,
+    -- | The ARN identifier of the Changeset.
+    changesetArn :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier for a Changeset.
+    changesetId :: Prelude.Maybe Prelude.Text,
+    -- | The timestamp at which the Changeset was created in FinSpace. The value
+    -- is determined as epoch time in milliseconds. For example, the value for
+    -- Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+    createTime :: Prelude.Maybe Prelude.Integer,
+    -- | The unique identifier for the FinSpace Dataset in which the Changeset is
+    -- created.
+    datasetId :: Prelude.Maybe Prelude.Text,
+    -- | The structure with error messages.
+    errorInfo :: Prelude.Maybe ChangesetErrorInfo,
+    -- | Options that define the structure of the source file(s).
+    formatParams :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | Options that define the location of the data being ingested.
+    sourceParams :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | Status of the Changeset ingestion.
+    --
+    -- -   @PENDING@ – Changeset is pending creation.
+    --
+    -- -   @FAILED@ – Changeset creation has failed.
+    --
+    -- -   @SUCCESS@ – Changeset creation has succeeded.
+    --
+    -- -   @RUNNING@ – Changeset creation is running.
+    --
+    -- -   @STOP_REQUESTED@ – User requested Changeset creation to stop.
+    status :: Prelude.Maybe IngestionStatus,
+    -- | The unique identifier of the updated Changeset.
+    updatedByChangesetId :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier of the Changeset that is updated.
+    updatesChangesetId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ChangesetSummary' 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:
+--
+-- 'activeFromTimestamp', 'changesetSummary_activeFromTimestamp' - Beginning time from which the Changeset is active. The value is
+-- determined as epoch time in milliseconds. For example, the value for
+-- Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+--
+-- 'activeUntilTimestamp', 'changesetSummary_activeUntilTimestamp' - Time until which the Changeset is active. The value is determined as
+-- epoch time in milliseconds. For example, the value for Monday, November
+-- 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+--
+-- 'changeType', 'changesetSummary_changeType' - Type that indicates how a Changeset is applied to a Dataset.
+--
+-- -   @REPLACE@ – Changeset is considered as a replacement to all prior
+--     loaded Changesets.
+--
+-- -   @APPEND@ – Changeset is considered as an addition to the end of all
+--     prior loaded Changesets.
+--
+-- -   @MODIFY@ – Changeset is considered as a replacement to a specific
+--     prior ingested Changeset.
+--
+-- 'changesetArn', 'changesetSummary_changesetArn' - The ARN identifier of the Changeset.
+--
+-- 'changesetId', 'changesetSummary_changesetId' - The unique identifier for a Changeset.
+--
+-- 'createTime', 'changesetSummary_createTime' - The timestamp at which the Changeset was created in FinSpace. The value
+-- is determined as epoch time in milliseconds. For example, the value for
+-- Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+--
+-- 'datasetId', 'changesetSummary_datasetId' - The unique identifier for the FinSpace Dataset in which the Changeset is
+-- created.
+--
+-- 'errorInfo', 'changesetSummary_errorInfo' - The structure with error messages.
+--
+-- 'formatParams', 'changesetSummary_formatParams' - Options that define the structure of the source file(s).
+--
+-- 'sourceParams', 'changesetSummary_sourceParams' - Options that define the location of the data being ingested.
+--
+-- 'status', 'changesetSummary_status' - Status of the Changeset ingestion.
+--
+-- -   @PENDING@ – Changeset is pending creation.
+--
+-- -   @FAILED@ – Changeset creation has failed.
+--
+-- -   @SUCCESS@ – Changeset creation has succeeded.
+--
+-- -   @RUNNING@ – Changeset creation is running.
+--
+-- -   @STOP_REQUESTED@ – User requested Changeset creation to stop.
+--
+-- 'updatedByChangesetId', 'changesetSummary_updatedByChangesetId' - The unique identifier of the updated Changeset.
+--
+-- 'updatesChangesetId', 'changesetSummary_updatesChangesetId' - The unique identifier of the Changeset that is updated.
+newChangesetSummary ::
+  ChangesetSummary
+newChangesetSummary =
+  ChangesetSummary'
+    { activeFromTimestamp =
+        Prelude.Nothing,
+      activeUntilTimestamp = Prelude.Nothing,
+      changeType = Prelude.Nothing,
+      changesetArn = Prelude.Nothing,
+      changesetId = Prelude.Nothing,
+      createTime = Prelude.Nothing,
+      datasetId = Prelude.Nothing,
+      errorInfo = Prelude.Nothing,
+      formatParams = Prelude.Nothing,
+      sourceParams = Prelude.Nothing,
+      status = Prelude.Nothing,
+      updatedByChangesetId = Prelude.Nothing,
+      updatesChangesetId = Prelude.Nothing
+    }
+
+-- | Beginning time from which the Changeset is active. The value is
+-- determined as epoch time in milliseconds. For example, the value for
+-- Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+changesetSummary_activeFromTimestamp :: Lens.Lens' ChangesetSummary (Prelude.Maybe Prelude.Integer)
+changesetSummary_activeFromTimestamp = Lens.lens (\ChangesetSummary' {activeFromTimestamp} -> activeFromTimestamp) (\s@ChangesetSummary' {} a -> s {activeFromTimestamp = a} :: ChangesetSummary)
+
+-- | Time until which the Changeset is active. The value is determined as
+-- epoch time in milliseconds. For example, the value for Monday, November
+-- 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+changesetSummary_activeUntilTimestamp :: Lens.Lens' ChangesetSummary (Prelude.Maybe Prelude.Integer)
+changesetSummary_activeUntilTimestamp = Lens.lens (\ChangesetSummary' {activeUntilTimestamp} -> activeUntilTimestamp) (\s@ChangesetSummary' {} a -> s {activeUntilTimestamp = a} :: ChangesetSummary)
+
+-- | Type that indicates how a Changeset is applied to a Dataset.
+--
+-- -   @REPLACE@ – Changeset is considered as a replacement to all prior
+--     loaded Changesets.
+--
+-- -   @APPEND@ – Changeset is considered as an addition to the end of all
+--     prior loaded Changesets.
+--
+-- -   @MODIFY@ – Changeset is considered as a replacement to a specific
+--     prior ingested Changeset.
+changesetSummary_changeType :: Lens.Lens' ChangesetSummary (Prelude.Maybe ChangeType)
+changesetSummary_changeType = Lens.lens (\ChangesetSummary' {changeType} -> changeType) (\s@ChangesetSummary' {} a -> s {changeType = a} :: ChangesetSummary)
+
+-- | The ARN identifier of the Changeset.
+changesetSummary_changesetArn :: Lens.Lens' ChangesetSummary (Prelude.Maybe Prelude.Text)
+changesetSummary_changesetArn = Lens.lens (\ChangesetSummary' {changesetArn} -> changesetArn) (\s@ChangesetSummary' {} a -> s {changesetArn = a} :: ChangesetSummary)
+
+-- | The unique identifier for a Changeset.
+changesetSummary_changesetId :: Lens.Lens' ChangesetSummary (Prelude.Maybe Prelude.Text)
+changesetSummary_changesetId = Lens.lens (\ChangesetSummary' {changesetId} -> changesetId) (\s@ChangesetSummary' {} a -> s {changesetId = a} :: ChangesetSummary)
+
+-- | The timestamp at which the Changeset was created in FinSpace. The value
+-- is determined as epoch time in milliseconds. For example, the value for
+-- Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+changesetSummary_createTime :: Lens.Lens' ChangesetSummary (Prelude.Maybe Prelude.Integer)
+changesetSummary_createTime = Lens.lens (\ChangesetSummary' {createTime} -> createTime) (\s@ChangesetSummary' {} a -> s {createTime = a} :: ChangesetSummary)
+
+-- | The unique identifier for the FinSpace Dataset in which the Changeset is
+-- created.
+changesetSummary_datasetId :: Lens.Lens' ChangesetSummary (Prelude.Maybe Prelude.Text)
+changesetSummary_datasetId = Lens.lens (\ChangesetSummary' {datasetId} -> datasetId) (\s@ChangesetSummary' {} a -> s {datasetId = a} :: ChangesetSummary)
+
+-- | The structure with error messages.
+changesetSummary_errorInfo :: Lens.Lens' ChangesetSummary (Prelude.Maybe ChangesetErrorInfo)
+changesetSummary_errorInfo = Lens.lens (\ChangesetSummary' {errorInfo} -> errorInfo) (\s@ChangesetSummary' {} a -> s {errorInfo = a} :: ChangesetSummary)
+
+-- | Options that define the structure of the source file(s).
+changesetSummary_formatParams :: Lens.Lens' ChangesetSummary (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+changesetSummary_formatParams = Lens.lens (\ChangesetSummary' {formatParams} -> formatParams) (\s@ChangesetSummary' {} a -> s {formatParams = a} :: ChangesetSummary) Prelude.. Lens.mapping Lens.coerced
+
+-- | Options that define the location of the data being ingested.
+changesetSummary_sourceParams :: Lens.Lens' ChangesetSummary (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+changesetSummary_sourceParams = Lens.lens (\ChangesetSummary' {sourceParams} -> sourceParams) (\s@ChangesetSummary' {} a -> s {sourceParams = a} :: ChangesetSummary) Prelude.. Lens.mapping Lens.coerced
+
+-- | Status of the Changeset ingestion.
+--
+-- -   @PENDING@ – Changeset is pending creation.
+--
+-- -   @FAILED@ – Changeset creation has failed.
+--
+-- -   @SUCCESS@ – Changeset creation has succeeded.
+--
+-- -   @RUNNING@ – Changeset creation is running.
+--
+-- -   @STOP_REQUESTED@ – User requested Changeset creation to stop.
+changesetSummary_status :: Lens.Lens' ChangesetSummary (Prelude.Maybe IngestionStatus)
+changesetSummary_status = Lens.lens (\ChangesetSummary' {status} -> status) (\s@ChangesetSummary' {} a -> s {status = a} :: ChangesetSummary)
+
+-- | The unique identifier of the updated Changeset.
+changesetSummary_updatedByChangesetId :: Lens.Lens' ChangesetSummary (Prelude.Maybe Prelude.Text)
+changesetSummary_updatedByChangesetId = Lens.lens (\ChangesetSummary' {updatedByChangesetId} -> updatedByChangesetId) (\s@ChangesetSummary' {} a -> s {updatedByChangesetId = a} :: ChangesetSummary)
+
+-- | The unique identifier of the Changeset that is updated.
+changesetSummary_updatesChangesetId :: Lens.Lens' ChangesetSummary (Prelude.Maybe Prelude.Text)
+changesetSummary_updatesChangesetId = Lens.lens (\ChangesetSummary' {updatesChangesetId} -> updatesChangesetId) (\s@ChangesetSummary' {} a -> s {updatesChangesetId = a} :: ChangesetSummary)
+
+instance Data.FromJSON ChangesetSummary where
+  parseJSON =
+    Data.withObject
+      "ChangesetSummary"
+      ( \x ->
+          ChangesetSummary'
+            Prelude.<$> (x Data..:? "activeFromTimestamp")
+            Prelude.<*> (x Data..:? "activeUntilTimestamp")
+            Prelude.<*> (x Data..:? "changeType")
+            Prelude.<*> (x Data..:? "changesetArn")
+            Prelude.<*> (x Data..:? "changesetId")
+            Prelude.<*> (x Data..:? "createTime")
+            Prelude.<*> (x Data..:? "datasetId")
+            Prelude.<*> (x Data..:? "errorInfo")
+            Prelude.<*> (x Data..:? "formatParams" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "sourceParams" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "status")
+            Prelude.<*> (x Data..:? "updatedByChangesetId")
+            Prelude.<*> (x Data..:? "updatesChangesetId")
+      )
+
+instance Prelude.Hashable ChangesetSummary where
+  hashWithSalt _salt ChangesetSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` activeFromTimestamp
+      `Prelude.hashWithSalt` activeUntilTimestamp
+      `Prelude.hashWithSalt` changeType
+      `Prelude.hashWithSalt` changesetArn
+      `Prelude.hashWithSalt` changesetId
+      `Prelude.hashWithSalt` createTime
+      `Prelude.hashWithSalt` datasetId
+      `Prelude.hashWithSalt` errorInfo
+      `Prelude.hashWithSalt` formatParams
+      `Prelude.hashWithSalt` sourceParams
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` updatedByChangesetId
+      `Prelude.hashWithSalt` updatesChangesetId
+
+instance Prelude.NFData ChangesetSummary where
+  rnf ChangesetSummary' {..} =
+    Prelude.rnf activeFromTimestamp
+      `Prelude.seq` Prelude.rnf activeUntilTimestamp
+      `Prelude.seq` Prelude.rnf changeType
+      `Prelude.seq` Prelude.rnf changesetArn
+      `Prelude.seq` Prelude.rnf changesetId
+      `Prelude.seq` Prelude.rnf createTime
+      `Prelude.seq` Prelude.rnf datasetId
+      `Prelude.seq` Prelude.rnf errorInfo
+      `Prelude.seq` Prelude.rnf formatParams
+      `Prelude.seq` Prelude.rnf sourceParams
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf updatedByChangesetId
+      `Prelude.seq` Prelude.rnf updatesChangesetId
diff --git a/gen/Amazonka/FinSpaceData/Types/ColumnDataType.hs b/gen/Amazonka/FinSpaceData/Types/ColumnDataType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/ColumnDataType.hs
@@ -0,0 +1,122 @@
+{-# 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.FinSpaceData.Types.ColumnDataType
+-- 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.FinSpaceData.Types.ColumnDataType
+  ( ColumnDataType
+      ( ..,
+        ColumnDataType_BIGINT,
+        ColumnDataType_BINARY,
+        ColumnDataType_BOOLEAN,
+        ColumnDataType_CHAR,
+        ColumnDataType_DATE,
+        ColumnDataType_DATETIME,
+        ColumnDataType_DOUBLE,
+        ColumnDataType_FLOAT,
+        ColumnDataType_INTEGER,
+        ColumnDataType_SMALLINT,
+        ColumnDataType_STRING,
+        ColumnDataType_TINYINT
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Data type of a column.
+newtype ColumnDataType = ColumnDataType'
+  { fromColumnDataType ::
+      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 ColumnDataType_BIGINT :: ColumnDataType
+pattern ColumnDataType_BIGINT = ColumnDataType' "BIGINT"
+
+pattern ColumnDataType_BINARY :: ColumnDataType
+pattern ColumnDataType_BINARY = ColumnDataType' "BINARY"
+
+pattern ColumnDataType_BOOLEAN :: ColumnDataType
+pattern ColumnDataType_BOOLEAN = ColumnDataType' "BOOLEAN"
+
+pattern ColumnDataType_CHAR :: ColumnDataType
+pattern ColumnDataType_CHAR = ColumnDataType' "CHAR"
+
+pattern ColumnDataType_DATE :: ColumnDataType
+pattern ColumnDataType_DATE = ColumnDataType' "DATE"
+
+pattern ColumnDataType_DATETIME :: ColumnDataType
+pattern ColumnDataType_DATETIME = ColumnDataType' "DATETIME"
+
+pattern ColumnDataType_DOUBLE :: ColumnDataType
+pattern ColumnDataType_DOUBLE = ColumnDataType' "DOUBLE"
+
+pattern ColumnDataType_FLOAT :: ColumnDataType
+pattern ColumnDataType_FLOAT = ColumnDataType' "FLOAT"
+
+pattern ColumnDataType_INTEGER :: ColumnDataType
+pattern ColumnDataType_INTEGER = ColumnDataType' "INTEGER"
+
+pattern ColumnDataType_SMALLINT :: ColumnDataType
+pattern ColumnDataType_SMALLINT = ColumnDataType' "SMALLINT"
+
+pattern ColumnDataType_STRING :: ColumnDataType
+pattern ColumnDataType_STRING = ColumnDataType' "STRING"
+
+pattern ColumnDataType_TINYINT :: ColumnDataType
+pattern ColumnDataType_TINYINT = ColumnDataType' "TINYINT"
+
+{-# COMPLETE
+  ColumnDataType_BIGINT,
+  ColumnDataType_BINARY,
+  ColumnDataType_BOOLEAN,
+  ColumnDataType_CHAR,
+  ColumnDataType_DATE,
+  ColumnDataType_DATETIME,
+  ColumnDataType_DOUBLE,
+  ColumnDataType_FLOAT,
+  ColumnDataType_INTEGER,
+  ColumnDataType_SMALLINT,
+  ColumnDataType_STRING,
+  ColumnDataType_TINYINT,
+  ColumnDataType'
+  #-}
diff --git a/gen/Amazonka/FinSpaceData/Types/ColumnDefinition.hs b/gen/Amazonka/FinSpaceData/Types/ColumnDefinition.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/ColumnDefinition.hs
@@ -0,0 +1,181 @@
+{-# 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.FinSpaceData.Types.ColumnDefinition
+-- 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.FinSpaceData.Types.ColumnDefinition where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types.ColumnDataType
+import qualified Amazonka.Prelude as Prelude
+
+-- | The definition of a column in a tabular Dataset.
+--
+-- /See:/ 'newColumnDefinition' smart constructor.
+data ColumnDefinition = ColumnDefinition'
+  { -- | Description for a column.
+    columnDescription :: Prelude.Maybe Prelude.Text,
+    -- | The name of a column.
+    columnName :: Prelude.Maybe Prelude.Text,
+    -- | Data type of a column.
+    --
+    -- -   @STRING@ – A String data type.
+    --
+    --     @CHAR@ – A char data type.
+    --
+    --     @INTEGER@ – An integer data type.
+    --
+    --     @TINYINT@ – A tinyint data type.
+    --
+    --     @SMALLINT@ – A smallint data type.
+    --
+    --     @BIGINT@ – A bigint data type.
+    --
+    --     @FLOAT@ – A float data type.
+    --
+    --     @DOUBLE@ – A double data type.
+    --
+    --     @DATE@ – A date data type.
+    --
+    --     @DATETIME@ – A datetime data type.
+    --
+    --     @BOOLEAN@ – A boolean data type.
+    --
+    --     @BINARY@ – A binary data type.
+    dataType :: Prelude.Maybe ColumnDataType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ColumnDefinition' 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:
+--
+-- 'columnDescription', 'columnDefinition_columnDescription' - Description for a column.
+--
+-- 'columnName', 'columnDefinition_columnName' - The name of a column.
+--
+-- 'dataType', 'columnDefinition_dataType' - Data type of a column.
+--
+-- -   @STRING@ – A String data type.
+--
+--     @CHAR@ – A char data type.
+--
+--     @INTEGER@ – An integer data type.
+--
+--     @TINYINT@ – A tinyint data type.
+--
+--     @SMALLINT@ – A smallint data type.
+--
+--     @BIGINT@ – A bigint data type.
+--
+--     @FLOAT@ – A float data type.
+--
+--     @DOUBLE@ – A double data type.
+--
+--     @DATE@ – A date data type.
+--
+--     @DATETIME@ – A datetime data type.
+--
+--     @BOOLEAN@ – A boolean data type.
+--
+--     @BINARY@ – A binary data type.
+newColumnDefinition ::
+  ColumnDefinition
+newColumnDefinition =
+  ColumnDefinition'
+    { columnDescription =
+        Prelude.Nothing,
+      columnName = Prelude.Nothing,
+      dataType = Prelude.Nothing
+    }
+
+-- | Description for a column.
+columnDefinition_columnDescription :: Lens.Lens' ColumnDefinition (Prelude.Maybe Prelude.Text)
+columnDefinition_columnDescription = Lens.lens (\ColumnDefinition' {columnDescription} -> columnDescription) (\s@ColumnDefinition' {} a -> s {columnDescription = a} :: ColumnDefinition)
+
+-- | The name of a column.
+columnDefinition_columnName :: Lens.Lens' ColumnDefinition (Prelude.Maybe Prelude.Text)
+columnDefinition_columnName = Lens.lens (\ColumnDefinition' {columnName} -> columnName) (\s@ColumnDefinition' {} a -> s {columnName = a} :: ColumnDefinition)
+
+-- | Data type of a column.
+--
+-- -   @STRING@ – A String data type.
+--
+--     @CHAR@ – A char data type.
+--
+--     @INTEGER@ – An integer data type.
+--
+--     @TINYINT@ – A tinyint data type.
+--
+--     @SMALLINT@ – A smallint data type.
+--
+--     @BIGINT@ – A bigint data type.
+--
+--     @FLOAT@ – A float data type.
+--
+--     @DOUBLE@ – A double data type.
+--
+--     @DATE@ – A date data type.
+--
+--     @DATETIME@ – A datetime data type.
+--
+--     @BOOLEAN@ – A boolean data type.
+--
+--     @BINARY@ – A binary data type.
+columnDefinition_dataType :: Lens.Lens' ColumnDefinition (Prelude.Maybe ColumnDataType)
+columnDefinition_dataType = Lens.lens (\ColumnDefinition' {dataType} -> dataType) (\s@ColumnDefinition' {} a -> s {dataType = a} :: ColumnDefinition)
+
+instance Data.FromJSON ColumnDefinition where
+  parseJSON =
+    Data.withObject
+      "ColumnDefinition"
+      ( \x ->
+          ColumnDefinition'
+            Prelude.<$> (x Data..:? "columnDescription")
+            Prelude.<*> (x Data..:? "columnName")
+            Prelude.<*> (x Data..:? "dataType")
+      )
+
+instance Prelude.Hashable ColumnDefinition where
+  hashWithSalt _salt ColumnDefinition' {..} =
+    _salt
+      `Prelude.hashWithSalt` columnDescription
+      `Prelude.hashWithSalt` columnName
+      `Prelude.hashWithSalt` dataType
+
+instance Prelude.NFData ColumnDefinition where
+  rnf ColumnDefinition' {..} =
+    Prelude.rnf columnDescription
+      `Prelude.seq` Prelude.rnf columnName
+      `Prelude.seq` Prelude.rnf dataType
+
+instance Data.ToJSON ColumnDefinition where
+  toJSON ColumnDefinition' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("columnDescription" Data..=)
+              Prelude.<$> columnDescription,
+            ("columnName" Data..=) Prelude.<$> columnName,
+            ("dataType" Data..=) Prelude.<$> dataType
+          ]
+      )
diff --git a/gen/Amazonka/FinSpaceData/Types/Credentials.hs b/gen/Amazonka/FinSpaceData/Types/Credentials.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/Credentials.hs
@@ -0,0 +1,96 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FinSpaceData.Types.Credentials
+-- 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.FinSpaceData.Types.Credentials 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
+
+-- | Short term API credentials.
+--
+-- /See:/ 'newCredentials' smart constructor.
+data Credentials = Credentials'
+  { -- | The access key identifier.
+    accessKeyId :: Prelude.Maybe Prelude.Text,
+    -- | The access key.
+    secretAccessKey :: Prelude.Maybe Prelude.Text,
+    -- | The session token.
+    sessionToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Credentials' 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:
+--
+-- 'accessKeyId', 'credentials_accessKeyId' - The access key identifier.
+--
+-- 'secretAccessKey', 'credentials_secretAccessKey' - The access key.
+--
+-- 'sessionToken', 'credentials_sessionToken' - The session token.
+newCredentials ::
+  Credentials
+newCredentials =
+  Credentials'
+    { accessKeyId = Prelude.Nothing,
+      secretAccessKey = Prelude.Nothing,
+      sessionToken = Prelude.Nothing
+    }
+
+-- | The access key identifier.
+credentials_accessKeyId :: Lens.Lens' Credentials (Prelude.Maybe Prelude.Text)
+credentials_accessKeyId = Lens.lens (\Credentials' {accessKeyId} -> accessKeyId) (\s@Credentials' {} a -> s {accessKeyId = a} :: Credentials)
+
+-- | The access key.
+credentials_secretAccessKey :: Lens.Lens' Credentials (Prelude.Maybe Prelude.Text)
+credentials_secretAccessKey = Lens.lens (\Credentials' {secretAccessKey} -> secretAccessKey) (\s@Credentials' {} a -> s {secretAccessKey = a} :: Credentials)
+
+-- | The session token.
+credentials_sessionToken :: Lens.Lens' Credentials (Prelude.Maybe Prelude.Text)
+credentials_sessionToken = Lens.lens (\Credentials' {sessionToken} -> sessionToken) (\s@Credentials' {} a -> s {sessionToken = a} :: Credentials)
+
+instance Data.FromJSON Credentials where
+  parseJSON =
+    Data.withObject
+      "Credentials"
+      ( \x ->
+          Credentials'
+            Prelude.<$> (x Data..:? "accessKeyId")
+            Prelude.<*> (x Data..:? "secretAccessKey")
+            Prelude.<*> (x Data..:? "sessionToken")
+      )
+
+instance Prelude.Hashable Credentials where
+  hashWithSalt _salt Credentials' {..} =
+    _salt
+      `Prelude.hashWithSalt` accessKeyId
+      `Prelude.hashWithSalt` secretAccessKey
+      `Prelude.hashWithSalt` sessionToken
+
+instance Prelude.NFData Credentials where
+  rnf Credentials' {..} =
+    Prelude.rnf accessKeyId
+      `Prelude.seq` Prelude.rnf secretAccessKey
+      `Prelude.seq` Prelude.rnf sessionToken
diff --git a/gen/Amazonka/FinSpaceData/Types/DataViewDestinationTypeParams.hs b/gen/Amazonka/FinSpaceData/Types/DataViewDestinationTypeParams.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/DataViewDestinationTypeParams.hs
@@ -0,0 +1,159 @@
+{-# 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.FinSpaceData.Types.DataViewDestinationTypeParams
+-- 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.FinSpaceData.Types.DataViewDestinationTypeParams where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types.ExportFileFormat
+import qualified Amazonka.Prelude as Prelude
+
+-- | Structure for the Dataview destination type parameters.
+--
+-- /See:/ 'newDataViewDestinationTypeParams' smart constructor.
+data DataViewDestinationTypeParams = DataViewDestinationTypeParams'
+  { -- | Dataview export file format.
+    --
+    -- -   @PARQUET@ – Parquet export file format.
+    --
+    -- -   @DELIMITED_TEXT@ – Delimited text export file format.
+    s3DestinationExportFileFormat :: Prelude.Maybe ExportFileFormat,
+    -- | Format Options for S3 Destination type.
+    --
+    -- Here is an example of how you could specify the
+    -- @s3DestinationExportFileFormatOptions@
+    --
+    -- @ { \"header\": \"true\", \"delimiter\": \",\", \"compression\": \"gzip\" }@
+    s3DestinationExportFileFormatOptions :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | Destination type for a Dataview.
+    --
+    -- -   @GLUE_TABLE@ – Glue table destination type.
+    --
+    -- -   @S3@ – S3 destination type.
+    destinationType :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DataViewDestinationTypeParams' 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:
+--
+-- 's3DestinationExportFileFormat', 'dataViewDestinationTypeParams_s3DestinationExportFileFormat' - Dataview export file format.
+--
+-- -   @PARQUET@ – Parquet export file format.
+--
+-- -   @DELIMITED_TEXT@ – Delimited text export file format.
+--
+-- 's3DestinationExportFileFormatOptions', 'dataViewDestinationTypeParams_s3DestinationExportFileFormatOptions' - Format Options for S3 Destination type.
+--
+-- Here is an example of how you could specify the
+-- @s3DestinationExportFileFormatOptions@
+--
+-- @ { \"header\": \"true\", \"delimiter\": \",\", \"compression\": \"gzip\" }@
+--
+-- 'destinationType', 'dataViewDestinationTypeParams_destinationType' - Destination type for a Dataview.
+--
+-- -   @GLUE_TABLE@ – Glue table destination type.
+--
+-- -   @S3@ – S3 destination type.
+newDataViewDestinationTypeParams ::
+  -- | 'destinationType'
+  Prelude.Text ->
+  DataViewDestinationTypeParams
+newDataViewDestinationTypeParams pDestinationType_ =
+  DataViewDestinationTypeParams'
+    { s3DestinationExportFileFormat =
+        Prelude.Nothing,
+      s3DestinationExportFileFormatOptions =
+        Prelude.Nothing,
+      destinationType = pDestinationType_
+    }
+
+-- | Dataview export file format.
+--
+-- -   @PARQUET@ – Parquet export file format.
+--
+-- -   @DELIMITED_TEXT@ – Delimited text export file format.
+dataViewDestinationTypeParams_s3DestinationExportFileFormat :: Lens.Lens' DataViewDestinationTypeParams (Prelude.Maybe ExportFileFormat)
+dataViewDestinationTypeParams_s3DestinationExportFileFormat = Lens.lens (\DataViewDestinationTypeParams' {s3DestinationExportFileFormat} -> s3DestinationExportFileFormat) (\s@DataViewDestinationTypeParams' {} a -> s {s3DestinationExportFileFormat = a} :: DataViewDestinationTypeParams)
+
+-- | Format Options for S3 Destination type.
+--
+-- Here is an example of how you could specify the
+-- @s3DestinationExportFileFormatOptions@
+--
+-- @ { \"header\": \"true\", \"delimiter\": \",\", \"compression\": \"gzip\" }@
+dataViewDestinationTypeParams_s3DestinationExportFileFormatOptions :: Lens.Lens' DataViewDestinationTypeParams (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+dataViewDestinationTypeParams_s3DestinationExportFileFormatOptions = Lens.lens (\DataViewDestinationTypeParams' {s3DestinationExportFileFormatOptions} -> s3DestinationExportFileFormatOptions) (\s@DataViewDestinationTypeParams' {} a -> s {s3DestinationExportFileFormatOptions = a} :: DataViewDestinationTypeParams) Prelude.. Lens.mapping Lens.coerced
+
+-- | Destination type for a Dataview.
+--
+-- -   @GLUE_TABLE@ – Glue table destination type.
+--
+-- -   @S3@ – S3 destination type.
+dataViewDestinationTypeParams_destinationType :: Lens.Lens' DataViewDestinationTypeParams Prelude.Text
+dataViewDestinationTypeParams_destinationType = Lens.lens (\DataViewDestinationTypeParams' {destinationType} -> destinationType) (\s@DataViewDestinationTypeParams' {} a -> s {destinationType = a} :: DataViewDestinationTypeParams)
+
+instance Data.FromJSON DataViewDestinationTypeParams where
+  parseJSON =
+    Data.withObject
+      "DataViewDestinationTypeParams"
+      ( \x ->
+          DataViewDestinationTypeParams'
+            Prelude.<$> (x Data..:? "s3DestinationExportFileFormat")
+            Prelude.<*> ( x
+                            Data..:? "s3DestinationExportFileFormatOptions"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..: "destinationType")
+      )
+
+instance
+  Prelude.Hashable
+    DataViewDestinationTypeParams
+  where
+  hashWithSalt _salt DataViewDestinationTypeParams' {..} =
+    _salt
+      `Prelude.hashWithSalt` s3DestinationExportFileFormat
+      `Prelude.hashWithSalt` s3DestinationExportFileFormatOptions
+      `Prelude.hashWithSalt` destinationType
+
+instance Prelude.NFData DataViewDestinationTypeParams where
+  rnf DataViewDestinationTypeParams' {..} =
+    Prelude.rnf s3DestinationExportFileFormat
+      `Prelude.seq` Prelude.rnf s3DestinationExportFileFormatOptions
+      `Prelude.seq` Prelude.rnf destinationType
+
+instance Data.ToJSON DataViewDestinationTypeParams where
+  toJSON DataViewDestinationTypeParams' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("s3DestinationExportFileFormat" Data..=)
+              Prelude.<$> s3DestinationExportFileFormat,
+            ("s3DestinationExportFileFormatOptions" Data..=)
+              Prelude.<$> s3DestinationExportFileFormatOptions,
+            Prelude.Just
+              ("destinationType" Data..= destinationType)
+          ]
+      )
diff --git a/gen/Amazonka/FinSpaceData/Types/DataViewErrorInfo.hs b/gen/Amazonka/FinSpaceData/Types/DataViewErrorInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/DataViewErrorInfo.hs
@@ -0,0 +1,148 @@
+{-# 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.FinSpaceData.Types.DataViewErrorInfo
+-- 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.FinSpaceData.Types.DataViewErrorInfo where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types.ErrorCategory
+import qualified Amazonka.Prelude as Prelude
+
+-- | The structure with error messages.
+--
+-- /See:/ 'newDataViewErrorInfo' smart constructor.
+data DataViewErrorInfo = DataViewErrorInfo'
+  { -- | The category of the error.
+    --
+    -- -   @VALIDATION@ – The inputs to this request are invalid.
+    --
+    -- -   @SERVICE_QUOTA_EXCEEDED@ – Service quotas have been exceeded. Please
+    --     contact AWS support to increase quotas.
+    --
+    -- -   @ACCESS_DENIED@ – Missing required permission to perform this
+    --     request.
+    --
+    -- -   @RESOURCE_NOT_FOUND@ – One or more inputs to this request were not
+    --     found.
+    --
+    -- -   @THROTTLING@ – The system temporarily lacks sufficient resources to
+    --     process the request.
+    --
+    -- -   @INTERNAL_SERVICE_EXCEPTION@ – An internal service error has
+    --     occurred.
+    --
+    -- -   @CANCELLED@ – Cancelled.
+    --
+    -- -   @USER_RECOVERABLE@ – A user recoverable error has occurred.
+    errorCategory :: Prelude.Maybe ErrorCategory,
+    -- | The text of the error message.
+    errorMessage :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DataViewErrorInfo' 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:
+--
+-- 'errorCategory', 'dataViewErrorInfo_errorCategory' - The category of the error.
+--
+-- -   @VALIDATION@ – The inputs to this request are invalid.
+--
+-- -   @SERVICE_QUOTA_EXCEEDED@ – Service quotas have been exceeded. Please
+--     contact AWS support to increase quotas.
+--
+-- -   @ACCESS_DENIED@ – Missing required permission to perform this
+--     request.
+--
+-- -   @RESOURCE_NOT_FOUND@ – One or more inputs to this request were not
+--     found.
+--
+-- -   @THROTTLING@ – The system temporarily lacks sufficient resources to
+--     process the request.
+--
+-- -   @INTERNAL_SERVICE_EXCEPTION@ – An internal service error has
+--     occurred.
+--
+-- -   @CANCELLED@ – Cancelled.
+--
+-- -   @USER_RECOVERABLE@ – A user recoverable error has occurred.
+--
+-- 'errorMessage', 'dataViewErrorInfo_errorMessage' - The text of the error message.
+newDataViewErrorInfo ::
+  DataViewErrorInfo
+newDataViewErrorInfo =
+  DataViewErrorInfo'
+    { errorCategory = Prelude.Nothing,
+      errorMessage = Prelude.Nothing
+    }
+
+-- | The category of the error.
+--
+-- -   @VALIDATION@ – The inputs to this request are invalid.
+--
+-- -   @SERVICE_QUOTA_EXCEEDED@ – Service quotas have been exceeded. Please
+--     contact AWS support to increase quotas.
+--
+-- -   @ACCESS_DENIED@ – Missing required permission to perform this
+--     request.
+--
+-- -   @RESOURCE_NOT_FOUND@ – One or more inputs to this request were not
+--     found.
+--
+-- -   @THROTTLING@ – The system temporarily lacks sufficient resources to
+--     process the request.
+--
+-- -   @INTERNAL_SERVICE_EXCEPTION@ – An internal service error has
+--     occurred.
+--
+-- -   @CANCELLED@ – Cancelled.
+--
+-- -   @USER_RECOVERABLE@ – A user recoverable error has occurred.
+dataViewErrorInfo_errorCategory :: Lens.Lens' DataViewErrorInfo (Prelude.Maybe ErrorCategory)
+dataViewErrorInfo_errorCategory = Lens.lens (\DataViewErrorInfo' {errorCategory} -> errorCategory) (\s@DataViewErrorInfo' {} a -> s {errorCategory = a} :: DataViewErrorInfo)
+
+-- | The text of the error message.
+dataViewErrorInfo_errorMessage :: Lens.Lens' DataViewErrorInfo (Prelude.Maybe Prelude.Text)
+dataViewErrorInfo_errorMessage = Lens.lens (\DataViewErrorInfo' {errorMessage} -> errorMessage) (\s@DataViewErrorInfo' {} a -> s {errorMessage = a} :: DataViewErrorInfo)
+
+instance Data.FromJSON DataViewErrorInfo where
+  parseJSON =
+    Data.withObject
+      "DataViewErrorInfo"
+      ( \x ->
+          DataViewErrorInfo'
+            Prelude.<$> (x Data..:? "errorCategory")
+            Prelude.<*> (x Data..:? "errorMessage")
+      )
+
+instance Prelude.Hashable DataViewErrorInfo where
+  hashWithSalt _salt DataViewErrorInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` errorCategory
+      `Prelude.hashWithSalt` errorMessage
+
+instance Prelude.NFData DataViewErrorInfo where
+  rnf DataViewErrorInfo' {..} =
+    Prelude.rnf errorCategory
+      `Prelude.seq` Prelude.rnf errorMessage
diff --git a/gen/Amazonka/FinSpaceData/Types/DataViewStatus.hs b/gen/Amazonka/FinSpaceData/Types/DataViewStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/DataViewStatus.hs
@@ -0,0 +1,102 @@
+{-# 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.FinSpaceData.Types.DataViewStatus
+-- 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.FinSpaceData.Types.DataViewStatus
+  ( DataViewStatus
+      ( ..,
+        DataViewStatus_CANCELLED,
+        DataViewStatus_FAILED,
+        DataViewStatus_FAILED_CLEANUP_FAILED,
+        DataViewStatus_PENDING,
+        DataViewStatus_RUNNING,
+        DataViewStatus_STARTING,
+        DataViewStatus_SUCCESS,
+        DataViewStatus_TIMEOUT
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Status of a DataView
+newtype DataViewStatus = DataViewStatus'
+  { fromDataViewStatus ::
+      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 DataViewStatus_CANCELLED :: DataViewStatus
+pattern DataViewStatus_CANCELLED = DataViewStatus' "CANCELLED"
+
+pattern DataViewStatus_FAILED :: DataViewStatus
+pattern DataViewStatus_FAILED = DataViewStatus' "FAILED"
+
+pattern DataViewStatus_FAILED_CLEANUP_FAILED :: DataViewStatus
+pattern DataViewStatus_FAILED_CLEANUP_FAILED = DataViewStatus' "FAILED_CLEANUP_FAILED"
+
+pattern DataViewStatus_PENDING :: DataViewStatus
+pattern DataViewStatus_PENDING = DataViewStatus' "PENDING"
+
+pattern DataViewStatus_RUNNING :: DataViewStatus
+pattern DataViewStatus_RUNNING = DataViewStatus' "RUNNING"
+
+pattern DataViewStatus_STARTING :: DataViewStatus
+pattern DataViewStatus_STARTING = DataViewStatus' "STARTING"
+
+pattern DataViewStatus_SUCCESS :: DataViewStatus
+pattern DataViewStatus_SUCCESS = DataViewStatus' "SUCCESS"
+
+pattern DataViewStatus_TIMEOUT :: DataViewStatus
+pattern DataViewStatus_TIMEOUT = DataViewStatus' "TIMEOUT"
+
+{-# COMPLETE
+  DataViewStatus_CANCELLED,
+  DataViewStatus_FAILED,
+  DataViewStatus_FAILED_CLEANUP_FAILED,
+  DataViewStatus_PENDING,
+  DataViewStatus_RUNNING,
+  DataViewStatus_STARTING,
+  DataViewStatus_SUCCESS,
+  DataViewStatus_TIMEOUT,
+  DataViewStatus'
+  #-}
diff --git a/gen/Amazonka/FinSpaceData/Types/DataViewSummary.hs b/gen/Amazonka/FinSpaceData/Types/DataViewSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/DataViewSummary.hs
@@ -0,0 +1,279 @@
+{-# 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.FinSpaceData.Types.DataViewSummary
+-- 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.FinSpaceData.Types.DataViewSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types.DataViewDestinationTypeParams
+import Amazonka.FinSpaceData.Types.DataViewErrorInfo
+import Amazonka.FinSpaceData.Types.DataViewStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | Structure for the summary of a Dataview.
+--
+-- /See:/ 'newDataViewSummary' smart constructor.
+data DataViewSummary = DataViewSummary'
+  { -- | Time range to use for the Dataview. The value is determined as epoch
+    -- time in milliseconds. For example, the value for Monday, November 1,
+    -- 2021 12:00:00 PM UTC is specified as 1635768000000.
+    asOfTimestamp :: Prelude.Maybe Prelude.Integer,
+    -- | The flag to indicate Dataview should be updated automatically.
+    autoUpdate :: Prelude.Maybe Prelude.Bool,
+    -- | The timestamp at which the Dataview was created in FinSpace. The value
+    -- is determined as epoch time in milliseconds. For example, the value for
+    -- Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+    createTime :: Prelude.Maybe Prelude.Integer,
+    -- | The ARN identifier of the Dataview.
+    dataViewArn :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier for the Dataview.
+    dataViewId :: Prelude.Maybe Prelude.Text,
+    -- | Th unique identifier for the Dataview Dataset.
+    datasetId :: Prelude.Maybe Prelude.Text,
+    -- | Information about the Dataview destination.
+    destinationTypeProperties :: Prelude.Maybe DataViewDestinationTypeParams,
+    -- | The structure with error messages.
+    errorInfo :: Prelude.Maybe DataViewErrorInfo,
+    -- | The last time that a Dataview was modified. The value is determined as
+    -- epoch time in milliseconds. For example, the value for Monday, November
+    -- 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+    lastModifiedTime :: Prelude.Maybe Prelude.Integer,
+    -- | Ordered set of column names used to partition data.
+    partitionColumns :: Prelude.Maybe [Prelude.Text],
+    -- | Columns to be used for sorting the data.
+    sortColumns :: Prelude.Maybe [Prelude.Text],
+    -- | The status of a Dataview creation.
+    --
+    -- -   @RUNNING@ – Dataview creation is running.
+    --
+    -- -   @STARTING@ – Dataview creation is starting.
+    --
+    -- -   @FAILED@ – Dataview creation has failed.
+    --
+    -- -   @CANCELLED@ – Dataview creation has been cancelled.
+    --
+    -- -   @TIMEOUT@ – Dataview creation has timed out.
+    --
+    -- -   @SUCCESS@ – Dataview creation has succeeded.
+    --
+    -- -   @PENDING@ – Dataview creation is pending.
+    --
+    -- -   @FAILED_CLEANUP_FAILED@ – Dataview creation failed and resource
+    --     cleanup failed.
+    status :: Prelude.Maybe DataViewStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DataViewSummary' 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:
+--
+-- 'asOfTimestamp', 'dataViewSummary_asOfTimestamp' - Time range to use for the Dataview. The value is determined as epoch
+-- time in milliseconds. For example, the value for Monday, November 1,
+-- 2021 12:00:00 PM UTC is specified as 1635768000000.
+--
+-- 'autoUpdate', 'dataViewSummary_autoUpdate' - The flag to indicate Dataview should be updated automatically.
+--
+-- 'createTime', 'dataViewSummary_createTime' - The timestamp at which the Dataview was created in FinSpace. The value
+-- is determined as epoch time in milliseconds. For example, the value for
+-- Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+--
+-- 'dataViewArn', 'dataViewSummary_dataViewArn' - The ARN identifier of the Dataview.
+--
+-- 'dataViewId', 'dataViewSummary_dataViewId' - The unique identifier for the Dataview.
+--
+-- 'datasetId', 'dataViewSummary_datasetId' - Th unique identifier for the Dataview Dataset.
+--
+-- 'destinationTypeProperties', 'dataViewSummary_destinationTypeProperties' - Information about the Dataview destination.
+--
+-- 'errorInfo', 'dataViewSummary_errorInfo' - The structure with error messages.
+--
+-- 'lastModifiedTime', 'dataViewSummary_lastModifiedTime' - The last time that a Dataview was modified. The value is determined as
+-- epoch time in milliseconds. For example, the value for Monday, November
+-- 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+--
+-- 'partitionColumns', 'dataViewSummary_partitionColumns' - Ordered set of column names used to partition data.
+--
+-- 'sortColumns', 'dataViewSummary_sortColumns' - Columns to be used for sorting the data.
+--
+-- 'status', 'dataViewSummary_status' - The status of a Dataview creation.
+--
+-- -   @RUNNING@ – Dataview creation is running.
+--
+-- -   @STARTING@ – Dataview creation is starting.
+--
+-- -   @FAILED@ – Dataview creation has failed.
+--
+-- -   @CANCELLED@ – Dataview creation has been cancelled.
+--
+-- -   @TIMEOUT@ – Dataview creation has timed out.
+--
+-- -   @SUCCESS@ – Dataview creation has succeeded.
+--
+-- -   @PENDING@ – Dataview creation is pending.
+--
+-- -   @FAILED_CLEANUP_FAILED@ – Dataview creation failed and resource
+--     cleanup failed.
+newDataViewSummary ::
+  DataViewSummary
+newDataViewSummary =
+  DataViewSummary'
+    { asOfTimestamp = Prelude.Nothing,
+      autoUpdate = Prelude.Nothing,
+      createTime = Prelude.Nothing,
+      dataViewArn = Prelude.Nothing,
+      dataViewId = Prelude.Nothing,
+      datasetId = Prelude.Nothing,
+      destinationTypeProperties = Prelude.Nothing,
+      errorInfo = Prelude.Nothing,
+      lastModifiedTime = Prelude.Nothing,
+      partitionColumns = Prelude.Nothing,
+      sortColumns = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | Time range to use for the Dataview. The value is determined as epoch
+-- time in milliseconds. For example, the value for Monday, November 1,
+-- 2021 12:00:00 PM UTC is specified as 1635768000000.
+dataViewSummary_asOfTimestamp :: Lens.Lens' DataViewSummary (Prelude.Maybe Prelude.Integer)
+dataViewSummary_asOfTimestamp = Lens.lens (\DataViewSummary' {asOfTimestamp} -> asOfTimestamp) (\s@DataViewSummary' {} a -> s {asOfTimestamp = a} :: DataViewSummary)
+
+-- | The flag to indicate Dataview should be updated automatically.
+dataViewSummary_autoUpdate :: Lens.Lens' DataViewSummary (Prelude.Maybe Prelude.Bool)
+dataViewSummary_autoUpdate = Lens.lens (\DataViewSummary' {autoUpdate} -> autoUpdate) (\s@DataViewSummary' {} a -> s {autoUpdate = a} :: DataViewSummary)
+
+-- | The timestamp at which the Dataview was created in FinSpace. The value
+-- is determined as epoch time in milliseconds. For example, the value for
+-- Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+dataViewSummary_createTime :: Lens.Lens' DataViewSummary (Prelude.Maybe Prelude.Integer)
+dataViewSummary_createTime = Lens.lens (\DataViewSummary' {createTime} -> createTime) (\s@DataViewSummary' {} a -> s {createTime = a} :: DataViewSummary)
+
+-- | The ARN identifier of the Dataview.
+dataViewSummary_dataViewArn :: Lens.Lens' DataViewSummary (Prelude.Maybe Prelude.Text)
+dataViewSummary_dataViewArn = Lens.lens (\DataViewSummary' {dataViewArn} -> dataViewArn) (\s@DataViewSummary' {} a -> s {dataViewArn = a} :: DataViewSummary)
+
+-- | The unique identifier for the Dataview.
+dataViewSummary_dataViewId :: Lens.Lens' DataViewSummary (Prelude.Maybe Prelude.Text)
+dataViewSummary_dataViewId = Lens.lens (\DataViewSummary' {dataViewId} -> dataViewId) (\s@DataViewSummary' {} a -> s {dataViewId = a} :: DataViewSummary)
+
+-- | Th unique identifier for the Dataview Dataset.
+dataViewSummary_datasetId :: Lens.Lens' DataViewSummary (Prelude.Maybe Prelude.Text)
+dataViewSummary_datasetId = Lens.lens (\DataViewSummary' {datasetId} -> datasetId) (\s@DataViewSummary' {} a -> s {datasetId = a} :: DataViewSummary)
+
+-- | Information about the Dataview destination.
+dataViewSummary_destinationTypeProperties :: Lens.Lens' DataViewSummary (Prelude.Maybe DataViewDestinationTypeParams)
+dataViewSummary_destinationTypeProperties = Lens.lens (\DataViewSummary' {destinationTypeProperties} -> destinationTypeProperties) (\s@DataViewSummary' {} a -> s {destinationTypeProperties = a} :: DataViewSummary)
+
+-- | The structure with error messages.
+dataViewSummary_errorInfo :: Lens.Lens' DataViewSummary (Prelude.Maybe DataViewErrorInfo)
+dataViewSummary_errorInfo = Lens.lens (\DataViewSummary' {errorInfo} -> errorInfo) (\s@DataViewSummary' {} a -> s {errorInfo = a} :: DataViewSummary)
+
+-- | The last time that a Dataview was modified. The value is determined as
+-- epoch time in milliseconds. For example, the value for Monday, November
+-- 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+dataViewSummary_lastModifiedTime :: Lens.Lens' DataViewSummary (Prelude.Maybe Prelude.Integer)
+dataViewSummary_lastModifiedTime = Lens.lens (\DataViewSummary' {lastModifiedTime} -> lastModifiedTime) (\s@DataViewSummary' {} a -> s {lastModifiedTime = a} :: DataViewSummary)
+
+-- | Ordered set of column names used to partition data.
+dataViewSummary_partitionColumns :: Lens.Lens' DataViewSummary (Prelude.Maybe [Prelude.Text])
+dataViewSummary_partitionColumns = Lens.lens (\DataViewSummary' {partitionColumns} -> partitionColumns) (\s@DataViewSummary' {} a -> s {partitionColumns = a} :: DataViewSummary) Prelude.. Lens.mapping Lens.coerced
+
+-- | Columns to be used for sorting the data.
+dataViewSummary_sortColumns :: Lens.Lens' DataViewSummary (Prelude.Maybe [Prelude.Text])
+dataViewSummary_sortColumns = Lens.lens (\DataViewSummary' {sortColumns} -> sortColumns) (\s@DataViewSummary' {} a -> s {sortColumns = a} :: DataViewSummary) Prelude.. Lens.mapping Lens.coerced
+
+-- | The status of a Dataview creation.
+--
+-- -   @RUNNING@ – Dataview creation is running.
+--
+-- -   @STARTING@ – Dataview creation is starting.
+--
+-- -   @FAILED@ – Dataview creation has failed.
+--
+-- -   @CANCELLED@ – Dataview creation has been cancelled.
+--
+-- -   @TIMEOUT@ – Dataview creation has timed out.
+--
+-- -   @SUCCESS@ – Dataview creation has succeeded.
+--
+-- -   @PENDING@ – Dataview creation is pending.
+--
+-- -   @FAILED_CLEANUP_FAILED@ – Dataview creation failed and resource
+--     cleanup failed.
+dataViewSummary_status :: Lens.Lens' DataViewSummary (Prelude.Maybe DataViewStatus)
+dataViewSummary_status = Lens.lens (\DataViewSummary' {status} -> status) (\s@DataViewSummary' {} a -> s {status = a} :: DataViewSummary)
+
+instance Data.FromJSON DataViewSummary where
+  parseJSON =
+    Data.withObject
+      "DataViewSummary"
+      ( \x ->
+          DataViewSummary'
+            Prelude.<$> (x Data..:? "asOfTimestamp")
+            Prelude.<*> (x Data..:? "autoUpdate")
+            Prelude.<*> (x Data..:? "createTime")
+            Prelude.<*> (x Data..:? "dataViewArn")
+            Prelude.<*> (x Data..:? "dataViewId")
+            Prelude.<*> (x Data..:? "datasetId")
+            Prelude.<*> (x Data..:? "destinationTypeProperties")
+            Prelude.<*> (x Data..:? "errorInfo")
+            Prelude.<*> (x Data..:? "lastModifiedTime")
+            Prelude.<*> ( x
+                            Data..:? "partitionColumns"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "sortColumns" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable DataViewSummary where
+  hashWithSalt _salt DataViewSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` asOfTimestamp
+      `Prelude.hashWithSalt` autoUpdate
+      `Prelude.hashWithSalt` createTime
+      `Prelude.hashWithSalt` dataViewArn
+      `Prelude.hashWithSalt` dataViewId
+      `Prelude.hashWithSalt` datasetId
+      `Prelude.hashWithSalt` destinationTypeProperties
+      `Prelude.hashWithSalt` errorInfo
+      `Prelude.hashWithSalt` lastModifiedTime
+      `Prelude.hashWithSalt` partitionColumns
+      `Prelude.hashWithSalt` sortColumns
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData DataViewSummary where
+  rnf DataViewSummary' {..} =
+    Prelude.rnf asOfTimestamp
+      `Prelude.seq` Prelude.rnf autoUpdate
+      `Prelude.seq` Prelude.rnf createTime
+      `Prelude.seq` Prelude.rnf dataViewArn
+      `Prelude.seq` Prelude.rnf dataViewId
+      `Prelude.seq` Prelude.rnf datasetId
+      `Prelude.seq` Prelude.rnf destinationTypeProperties
+      `Prelude.seq` Prelude.rnf errorInfo
+      `Prelude.seq` Prelude.rnf lastModifiedTime
+      `Prelude.seq` Prelude.rnf partitionColumns
+      `Prelude.seq` Prelude.rnf sortColumns
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/FinSpaceData/Types/Dataset.hs b/gen/Amazonka/FinSpaceData/Types/Dataset.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/Dataset.hs
@@ -0,0 +1,207 @@
+{-# 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.FinSpaceData.Types.Dataset
+-- 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.FinSpaceData.Types.Dataset where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types.DatasetKind
+import Amazonka.FinSpaceData.Types.DatasetOwnerInfo
+import Amazonka.FinSpaceData.Types.SchemaUnion
+import qualified Amazonka.Prelude as Prelude
+
+-- | The structure for a Dataset.
+--
+-- /See:/ 'newDataset' smart constructor.
+data Dataset = Dataset'
+  { -- | The unique resource identifier for a Dataset.
+    alias :: Prelude.Maybe Prelude.Text,
+    -- | The timestamp at which the Dataset was created in FinSpace. The value is
+    -- determined as epoch time in milliseconds. For example, the value for
+    -- Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+    createTime :: Prelude.Maybe Prelude.Integer,
+    -- | The ARN identifier of the Dataset.
+    datasetArn :: Prelude.Maybe Prelude.Text,
+    -- | Description for a Dataset.
+    datasetDescription :: Prelude.Maybe Prelude.Text,
+    -- | An identifier for a Dataset.
+    datasetId :: Prelude.Maybe Prelude.Text,
+    -- | Display title for a Dataset.
+    datasetTitle :: Prelude.Maybe Prelude.Text,
+    -- | The format in which Dataset data is structured.
+    --
+    -- -   @TABULAR@ – Data is structured in a tabular format.
+    --
+    -- -   @NON_TABULAR@ – Data is structured in a non-tabular format.
+    kind :: Prelude.Maybe DatasetKind,
+    -- | The last time that the Dataset was modified. The value is determined as
+    -- epoch time in milliseconds. For example, the value for Monday, November
+    -- 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+    lastModifiedTime :: Prelude.Maybe Prelude.Integer,
+    -- | Contact information for a Dataset owner.
+    ownerInfo :: Prelude.Maybe DatasetOwnerInfo,
+    -- | Definition for a schema on a tabular Dataset.
+    schemaDefinition :: Prelude.Maybe SchemaUnion
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Dataset' 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:
+--
+-- 'alias', 'dataset_alias' - The unique resource identifier for a Dataset.
+--
+-- 'createTime', 'dataset_createTime' - The timestamp at which the Dataset was created in FinSpace. The value is
+-- determined as epoch time in milliseconds. For example, the value for
+-- Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+--
+-- 'datasetArn', 'dataset_datasetArn' - The ARN identifier of the Dataset.
+--
+-- 'datasetDescription', 'dataset_datasetDescription' - Description for a Dataset.
+--
+-- 'datasetId', 'dataset_datasetId' - An identifier for a Dataset.
+--
+-- 'datasetTitle', 'dataset_datasetTitle' - Display title for a Dataset.
+--
+-- 'kind', 'dataset_kind' - The format in which Dataset data is structured.
+--
+-- -   @TABULAR@ – Data is structured in a tabular format.
+--
+-- -   @NON_TABULAR@ – Data is structured in a non-tabular format.
+--
+-- 'lastModifiedTime', 'dataset_lastModifiedTime' - The last time that the Dataset was modified. The value is determined as
+-- epoch time in milliseconds. For example, the value for Monday, November
+-- 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+--
+-- 'ownerInfo', 'dataset_ownerInfo' - Contact information for a Dataset owner.
+--
+-- 'schemaDefinition', 'dataset_schemaDefinition' - Definition for a schema on a tabular Dataset.
+newDataset ::
+  Dataset
+newDataset =
+  Dataset'
+    { alias = Prelude.Nothing,
+      createTime = Prelude.Nothing,
+      datasetArn = Prelude.Nothing,
+      datasetDescription = Prelude.Nothing,
+      datasetId = Prelude.Nothing,
+      datasetTitle = Prelude.Nothing,
+      kind = Prelude.Nothing,
+      lastModifiedTime = Prelude.Nothing,
+      ownerInfo = Prelude.Nothing,
+      schemaDefinition = Prelude.Nothing
+    }
+
+-- | The unique resource identifier for a Dataset.
+dataset_alias :: Lens.Lens' Dataset (Prelude.Maybe Prelude.Text)
+dataset_alias = Lens.lens (\Dataset' {alias} -> alias) (\s@Dataset' {} a -> s {alias = a} :: Dataset)
+
+-- | The timestamp at which the Dataset was created in FinSpace. The value is
+-- determined as epoch time in milliseconds. For example, the value for
+-- Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+dataset_createTime :: Lens.Lens' Dataset (Prelude.Maybe Prelude.Integer)
+dataset_createTime = Lens.lens (\Dataset' {createTime} -> createTime) (\s@Dataset' {} a -> s {createTime = a} :: Dataset)
+
+-- | The ARN identifier of the Dataset.
+dataset_datasetArn :: Lens.Lens' Dataset (Prelude.Maybe Prelude.Text)
+dataset_datasetArn = Lens.lens (\Dataset' {datasetArn} -> datasetArn) (\s@Dataset' {} a -> s {datasetArn = a} :: Dataset)
+
+-- | Description for a Dataset.
+dataset_datasetDescription :: Lens.Lens' Dataset (Prelude.Maybe Prelude.Text)
+dataset_datasetDescription = Lens.lens (\Dataset' {datasetDescription} -> datasetDescription) (\s@Dataset' {} a -> s {datasetDescription = a} :: Dataset)
+
+-- | An identifier for a Dataset.
+dataset_datasetId :: Lens.Lens' Dataset (Prelude.Maybe Prelude.Text)
+dataset_datasetId = Lens.lens (\Dataset' {datasetId} -> datasetId) (\s@Dataset' {} a -> s {datasetId = a} :: Dataset)
+
+-- | Display title for a Dataset.
+dataset_datasetTitle :: Lens.Lens' Dataset (Prelude.Maybe Prelude.Text)
+dataset_datasetTitle = Lens.lens (\Dataset' {datasetTitle} -> datasetTitle) (\s@Dataset' {} a -> s {datasetTitle = a} :: Dataset)
+
+-- | The format in which Dataset data is structured.
+--
+-- -   @TABULAR@ – Data is structured in a tabular format.
+--
+-- -   @NON_TABULAR@ – Data is structured in a non-tabular format.
+dataset_kind :: Lens.Lens' Dataset (Prelude.Maybe DatasetKind)
+dataset_kind = Lens.lens (\Dataset' {kind} -> kind) (\s@Dataset' {} a -> s {kind = a} :: Dataset)
+
+-- | The last time that the Dataset was modified. The value is determined as
+-- epoch time in milliseconds. For example, the value for Monday, November
+-- 1, 2021 12:00:00 PM UTC is specified as 1635768000000.
+dataset_lastModifiedTime :: Lens.Lens' Dataset (Prelude.Maybe Prelude.Integer)
+dataset_lastModifiedTime = Lens.lens (\Dataset' {lastModifiedTime} -> lastModifiedTime) (\s@Dataset' {} a -> s {lastModifiedTime = a} :: Dataset)
+
+-- | Contact information for a Dataset owner.
+dataset_ownerInfo :: Lens.Lens' Dataset (Prelude.Maybe DatasetOwnerInfo)
+dataset_ownerInfo = Lens.lens (\Dataset' {ownerInfo} -> ownerInfo) (\s@Dataset' {} a -> s {ownerInfo = a} :: Dataset)
+
+-- | Definition for a schema on a tabular Dataset.
+dataset_schemaDefinition :: Lens.Lens' Dataset (Prelude.Maybe SchemaUnion)
+dataset_schemaDefinition = Lens.lens (\Dataset' {schemaDefinition} -> schemaDefinition) (\s@Dataset' {} a -> s {schemaDefinition = a} :: Dataset)
+
+instance Data.FromJSON Dataset where
+  parseJSON =
+    Data.withObject
+      "Dataset"
+      ( \x ->
+          Dataset'
+            Prelude.<$> (x Data..:? "alias")
+            Prelude.<*> (x Data..:? "createTime")
+            Prelude.<*> (x Data..:? "datasetArn")
+            Prelude.<*> (x Data..:? "datasetDescription")
+            Prelude.<*> (x Data..:? "datasetId")
+            Prelude.<*> (x Data..:? "datasetTitle")
+            Prelude.<*> (x Data..:? "kind")
+            Prelude.<*> (x Data..:? "lastModifiedTime")
+            Prelude.<*> (x Data..:? "ownerInfo")
+            Prelude.<*> (x Data..:? "schemaDefinition")
+      )
+
+instance Prelude.Hashable Dataset where
+  hashWithSalt _salt Dataset' {..} =
+    _salt
+      `Prelude.hashWithSalt` alias
+      `Prelude.hashWithSalt` createTime
+      `Prelude.hashWithSalt` datasetArn
+      `Prelude.hashWithSalt` datasetDescription
+      `Prelude.hashWithSalt` datasetId
+      `Prelude.hashWithSalt` datasetTitle
+      `Prelude.hashWithSalt` kind
+      `Prelude.hashWithSalt` lastModifiedTime
+      `Prelude.hashWithSalt` ownerInfo
+      `Prelude.hashWithSalt` schemaDefinition
+
+instance Prelude.NFData Dataset where
+  rnf Dataset' {..} =
+    Prelude.rnf alias
+      `Prelude.seq` Prelude.rnf createTime
+      `Prelude.seq` Prelude.rnf datasetArn
+      `Prelude.seq` Prelude.rnf datasetDescription
+      `Prelude.seq` Prelude.rnf datasetId
+      `Prelude.seq` Prelude.rnf datasetTitle
+      `Prelude.seq` Prelude.rnf kind
+      `Prelude.seq` Prelude.rnf lastModifiedTime
+      `Prelude.seq` Prelude.rnf ownerInfo
+      `Prelude.seq` Prelude.rnf schemaDefinition
diff --git a/gen/Amazonka/FinSpaceData/Types/DatasetKind.hs b/gen/Amazonka/FinSpaceData/Types/DatasetKind.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/DatasetKind.hs
@@ -0,0 +1,72 @@
+{-# 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.FinSpaceData.Types.DatasetKind
+-- 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.FinSpaceData.Types.DatasetKind
+  ( DatasetKind
+      ( ..,
+        DatasetKind_NON_TABULAR,
+        DatasetKind_TABULAR
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Dataset Kind
+newtype DatasetKind = DatasetKind'
+  { fromDatasetKind ::
+      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 DatasetKind_NON_TABULAR :: DatasetKind
+pattern DatasetKind_NON_TABULAR = DatasetKind' "NON_TABULAR"
+
+pattern DatasetKind_TABULAR :: DatasetKind
+pattern DatasetKind_TABULAR = DatasetKind' "TABULAR"
+
+{-# COMPLETE
+  DatasetKind_NON_TABULAR,
+  DatasetKind_TABULAR,
+  DatasetKind'
+  #-}
diff --git a/gen/Amazonka/FinSpaceData/Types/DatasetOwnerInfo.hs b/gen/Amazonka/FinSpaceData/Types/DatasetOwnerInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/DatasetOwnerInfo.hs
@@ -0,0 +1,106 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FinSpaceData.Types.DatasetOwnerInfo
+-- 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.FinSpaceData.Types.DatasetOwnerInfo 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 structure for Dataset owner info.
+--
+-- /See:/ 'newDatasetOwnerInfo' smart constructor.
+data DatasetOwnerInfo = DatasetOwnerInfo'
+  { -- | Email address for the Dataset owner.
+    email :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The name of the Dataset owner.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | Phone number for the Dataset owner.
+    phoneNumber :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DatasetOwnerInfo' 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:
+--
+-- 'email', 'datasetOwnerInfo_email' - Email address for the Dataset owner.
+--
+-- 'name', 'datasetOwnerInfo_name' - The name of the Dataset owner.
+--
+-- 'phoneNumber', 'datasetOwnerInfo_phoneNumber' - Phone number for the Dataset owner.
+newDatasetOwnerInfo ::
+  DatasetOwnerInfo
+newDatasetOwnerInfo =
+  DatasetOwnerInfo'
+    { email = Prelude.Nothing,
+      name = Prelude.Nothing,
+      phoneNumber = Prelude.Nothing
+    }
+
+-- | Email address for the Dataset owner.
+datasetOwnerInfo_email :: Lens.Lens' DatasetOwnerInfo (Prelude.Maybe Prelude.Text)
+datasetOwnerInfo_email = Lens.lens (\DatasetOwnerInfo' {email} -> email) (\s@DatasetOwnerInfo' {} a -> s {email = a} :: DatasetOwnerInfo) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The name of the Dataset owner.
+datasetOwnerInfo_name :: Lens.Lens' DatasetOwnerInfo (Prelude.Maybe Prelude.Text)
+datasetOwnerInfo_name = Lens.lens (\DatasetOwnerInfo' {name} -> name) (\s@DatasetOwnerInfo' {} a -> s {name = a} :: DatasetOwnerInfo)
+
+-- | Phone number for the Dataset owner.
+datasetOwnerInfo_phoneNumber :: Lens.Lens' DatasetOwnerInfo (Prelude.Maybe Prelude.Text)
+datasetOwnerInfo_phoneNumber = Lens.lens (\DatasetOwnerInfo' {phoneNumber} -> phoneNumber) (\s@DatasetOwnerInfo' {} a -> s {phoneNumber = a} :: DatasetOwnerInfo)
+
+instance Data.FromJSON DatasetOwnerInfo where
+  parseJSON =
+    Data.withObject
+      "DatasetOwnerInfo"
+      ( \x ->
+          DatasetOwnerInfo'
+            Prelude.<$> (x Data..:? "email")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "phoneNumber")
+      )
+
+instance Prelude.Hashable DatasetOwnerInfo where
+  hashWithSalt _salt DatasetOwnerInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` email
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` phoneNumber
+
+instance Prelude.NFData DatasetOwnerInfo where
+  rnf DatasetOwnerInfo' {..} =
+    Prelude.rnf email
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf phoneNumber
+
+instance Data.ToJSON DatasetOwnerInfo where
+  toJSON DatasetOwnerInfo' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("email" Data..=) Prelude.<$> email,
+            ("name" Data..=) Prelude.<$> name,
+            ("phoneNumber" Data..=) Prelude.<$> phoneNumber
+          ]
+      )
diff --git a/gen/Amazonka/FinSpaceData/Types/DatasetStatus.hs b/gen/Amazonka/FinSpaceData/Types/DatasetStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/DatasetStatus.hs
@@ -0,0 +1,82 @@
+{-# 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.FinSpaceData.Types.DatasetStatus
+-- 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.FinSpaceData.Types.DatasetStatus
+  ( DatasetStatus
+      ( ..,
+        DatasetStatus_FAILED,
+        DatasetStatus_PENDING,
+        DatasetStatus_RUNNING,
+        DatasetStatus_SUCCESS
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Status of the dataset process returned from scheduler service.
+newtype DatasetStatus = DatasetStatus'
+  { fromDatasetStatus ::
+      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 DatasetStatus_FAILED :: DatasetStatus
+pattern DatasetStatus_FAILED = DatasetStatus' "FAILED"
+
+pattern DatasetStatus_PENDING :: DatasetStatus
+pattern DatasetStatus_PENDING = DatasetStatus' "PENDING"
+
+pattern DatasetStatus_RUNNING :: DatasetStatus
+pattern DatasetStatus_RUNNING = DatasetStatus' "RUNNING"
+
+pattern DatasetStatus_SUCCESS :: DatasetStatus
+pattern DatasetStatus_SUCCESS = DatasetStatus' "SUCCESS"
+
+{-# COMPLETE
+  DatasetStatus_FAILED,
+  DatasetStatus_PENDING,
+  DatasetStatus_RUNNING,
+  DatasetStatus_SUCCESS,
+  DatasetStatus'
+  #-}
diff --git a/gen/Amazonka/FinSpaceData/Types/ErrorCategory.hs b/gen/Amazonka/FinSpaceData/Types/ErrorCategory.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/ErrorCategory.hs
@@ -0,0 +1,102 @@
+{-# 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.FinSpaceData.Types.ErrorCategory
+-- 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.FinSpaceData.Types.ErrorCategory
+  ( ErrorCategory
+      ( ..,
+        ErrorCategory_ACCESS_DENIED,
+        ErrorCategory_CANCELLED,
+        ErrorCategory_INTERNAL_SERVICE_EXCEPTION,
+        ErrorCategory_RESOURCE_NOT_FOUND,
+        ErrorCategory_SERVICE_QUOTA_EXCEEDED,
+        ErrorCategory_THROTTLING,
+        ErrorCategory_USER_RECOVERABLE,
+        ErrorCategory_VALIDATION
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Changeset Error Category
+newtype ErrorCategory = ErrorCategory'
+  { fromErrorCategory ::
+      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 ErrorCategory_ACCESS_DENIED :: ErrorCategory
+pattern ErrorCategory_ACCESS_DENIED = ErrorCategory' "ACCESS_DENIED"
+
+pattern ErrorCategory_CANCELLED :: ErrorCategory
+pattern ErrorCategory_CANCELLED = ErrorCategory' "CANCELLED"
+
+pattern ErrorCategory_INTERNAL_SERVICE_EXCEPTION :: ErrorCategory
+pattern ErrorCategory_INTERNAL_SERVICE_EXCEPTION = ErrorCategory' "INTERNAL_SERVICE_EXCEPTION"
+
+pattern ErrorCategory_RESOURCE_NOT_FOUND :: ErrorCategory
+pattern ErrorCategory_RESOURCE_NOT_FOUND = ErrorCategory' "RESOURCE_NOT_FOUND"
+
+pattern ErrorCategory_SERVICE_QUOTA_EXCEEDED :: ErrorCategory
+pattern ErrorCategory_SERVICE_QUOTA_EXCEEDED = ErrorCategory' "SERVICE_QUOTA_EXCEEDED"
+
+pattern ErrorCategory_THROTTLING :: ErrorCategory
+pattern ErrorCategory_THROTTLING = ErrorCategory' "THROTTLING"
+
+pattern ErrorCategory_USER_RECOVERABLE :: ErrorCategory
+pattern ErrorCategory_USER_RECOVERABLE = ErrorCategory' "USER_RECOVERABLE"
+
+pattern ErrorCategory_VALIDATION :: ErrorCategory
+pattern ErrorCategory_VALIDATION = ErrorCategory' "VALIDATION"
+
+{-# COMPLETE
+  ErrorCategory_ACCESS_DENIED,
+  ErrorCategory_CANCELLED,
+  ErrorCategory_INTERNAL_SERVICE_EXCEPTION,
+  ErrorCategory_RESOURCE_NOT_FOUND,
+  ErrorCategory_SERVICE_QUOTA_EXCEEDED,
+  ErrorCategory_THROTTLING,
+  ErrorCategory_USER_RECOVERABLE,
+  ErrorCategory_VALIDATION,
+  ErrorCategory'
+  #-}
diff --git a/gen/Amazonka/FinSpaceData/Types/ExportFileFormat.hs b/gen/Amazonka/FinSpaceData/Types/ExportFileFormat.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/ExportFileFormat.hs
@@ -0,0 +1,72 @@
+{-# 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.FinSpaceData.Types.ExportFileFormat
+-- 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.FinSpaceData.Types.ExportFileFormat
+  ( ExportFileFormat
+      ( ..,
+        ExportFileFormat_DELIMITED_TEXT,
+        ExportFileFormat_PARQUET
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Data View Export File Format
+newtype ExportFileFormat = ExportFileFormat'
+  { fromExportFileFormat ::
+      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 ExportFileFormat_DELIMITED_TEXT :: ExportFileFormat
+pattern ExportFileFormat_DELIMITED_TEXT = ExportFileFormat' "DELIMITED_TEXT"
+
+pattern ExportFileFormat_PARQUET :: ExportFileFormat
+pattern ExportFileFormat_PARQUET = ExportFileFormat' "PARQUET"
+
+{-# COMPLETE
+  ExportFileFormat_DELIMITED_TEXT,
+  ExportFileFormat_PARQUET,
+  ExportFileFormat'
+  #-}
diff --git a/gen/Amazonka/FinSpaceData/Types/IngestionStatus.hs b/gen/Amazonka/FinSpaceData/Types/IngestionStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/IngestionStatus.hs
@@ -0,0 +1,87 @@
+{-# 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.FinSpaceData.Types.IngestionStatus
+-- 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.FinSpaceData.Types.IngestionStatus
+  ( IngestionStatus
+      ( ..,
+        IngestionStatus_FAILED,
+        IngestionStatus_PENDING,
+        IngestionStatus_RUNNING,
+        IngestionStatus_STOP_REQUESTED,
+        IngestionStatus_SUCCESS
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Status of the ingestion process returned from scheduler service.
+newtype IngestionStatus = IngestionStatus'
+  { fromIngestionStatus ::
+      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 IngestionStatus_FAILED :: IngestionStatus
+pattern IngestionStatus_FAILED = IngestionStatus' "FAILED"
+
+pattern IngestionStatus_PENDING :: IngestionStatus
+pattern IngestionStatus_PENDING = IngestionStatus' "PENDING"
+
+pattern IngestionStatus_RUNNING :: IngestionStatus
+pattern IngestionStatus_RUNNING = IngestionStatus' "RUNNING"
+
+pattern IngestionStatus_STOP_REQUESTED :: IngestionStatus
+pattern IngestionStatus_STOP_REQUESTED = IngestionStatus' "STOP_REQUESTED"
+
+pattern IngestionStatus_SUCCESS :: IngestionStatus
+pattern IngestionStatus_SUCCESS = IngestionStatus' "SUCCESS"
+
+{-# COMPLETE
+  IngestionStatus_FAILED,
+  IngestionStatus_PENDING,
+  IngestionStatus_RUNNING,
+  IngestionStatus_STOP_REQUESTED,
+  IngestionStatus_SUCCESS,
+  IngestionStatus'
+  #-}
diff --git a/gen/Amazonka/FinSpaceData/Types/LocationType.hs b/gen/Amazonka/FinSpaceData/Types/LocationType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/LocationType.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.FinSpaceData.Types.LocationType
+-- 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.FinSpaceData.Types.LocationType
+  ( LocationType
+      ( ..,
+        LocationType_INGESTION,
+        LocationType_SAGEMAKER
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype LocationType = LocationType'
+  { fromLocationType ::
+      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 LocationType_INGESTION :: LocationType
+pattern LocationType_INGESTION = LocationType' "INGESTION"
+
+pattern LocationType_SAGEMAKER :: LocationType
+pattern LocationType_SAGEMAKER = LocationType' "SAGEMAKER"
+
+{-# COMPLETE
+  LocationType_INGESTION,
+  LocationType_SAGEMAKER,
+  LocationType'
+  #-}
diff --git a/gen/Amazonka/FinSpaceData/Types/PermissionGroup.hs b/gen/Amazonka/FinSpaceData/Types/PermissionGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/PermissionGroup.hs
@@ -0,0 +1,261 @@
+{-# 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.FinSpaceData.Types.PermissionGroup
+-- 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.FinSpaceData.Types.PermissionGroup where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types.ApplicationPermission
+import Amazonka.FinSpaceData.Types.PermissionGroupMembershipStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | The structure for a permission group.
+--
+-- /See:/ 'newPermissionGroup' smart constructor.
+data PermissionGroup = PermissionGroup'
+  { -- | Indicates the permissions that are granted to a specific group for
+    -- accessing the FinSpace application.
+    --
+    -- When assigning application permissions, be aware that the permission
+    -- @ManageUsersAndGroups@ allows users to grant themselves or others access
+    -- to any functionality in their FinSpace environment\'s application. It
+    -- should only be granted to trusted users.
+    --
+    -- -   @CreateDataset@ – Group members can create new datasets.
+    --
+    -- -   @ManageClusters@ – Group members can manage Apache Spark clusters
+    --     from FinSpace notebooks.
+    --
+    -- -   @ManageUsersAndGroups@ – Group members can manage users and
+    --     permission groups. This is a privileged permission that allows users
+    --     to grant themselves or others access to any functionality in the
+    --     application. It should only be granted to trusted users.
+    --
+    -- -   @ManageAttributeSets@ – Group members can manage attribute sets.
+    --
+    -- -   @ViewAuditData@ – Group members can view audit data.
+    --
+    -- -   @AccessNotebooks@ – Group members will have access to FinSpace
+    --     notebooks.
+    --
+    -- -   @GetTemporaryCredentials@ – Group members can get temporary API
+    --     credentials.
+    applicationPermissions :: Prelude.Maybe [ApplicationPermission],
+    -- | The timestamp at which the group was created in FinSpace. The value is
+    -- determined as epoch time in milliseconds.
+    createTime :: Prelude.Maybe Prelude.Integer,
+    -- | A brief description for the permission group.
+    description :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | Describes the last time the permission group was updated. The value is
+    -- determined as epoch time in milliseconds.
+    lastModifiedTime :: Prelude.Maybe Prelude.Integer,
+    -- | Indicates the status of the user account within a permission group.
+    --
+    -- -   @ADDITION_IN_PROGRESS@ – The user account is currently being added
+    --     to the permission group.
+    --
+    -- -   @ADDITION_SUCCESS@ – The user account is successfully added to the
+    --     permission group.
+    --
+    -- -   @REMOVAL_IN_PROGRESS@ – The user is currently being removed from the
+    --     permission group.
+    membershipStatus :: Prelude.Maybe PermissionGroupMembershipStatus,
+    -- | The name of the permission group.
+    name :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The unique identifier for the permission group.
+    permissionGroupId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PermissionGroup' 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:
+--
+-- 'applicationPermissions', 'permissionGroup_applicationPermissions' - Indicates the permissions that are granted to a specific group for
+-- accessing the FinSpace application.
+--
+-- When assigning application permissions, be aware that the permission
+-- @ManageUsersAndGroups@ allows users to grant themselves or others access
+-- to any functionality in their FinSpace environment\'s application. It
+-- should only be granted to trusted users.
+--
+-- -   @CreateDataset@ – Group members can create new datasets.
+--
+-- -   @ManageClusters@ – Group members can manage Apache Spark clusters
+--     from FinSpace notebooks.
+--
+-- -   @ManageUsersAndGroups@ – Group members can manage users and
+--     permission groups. This is a privileged permission that allows users
+--     to grant themselves or others access to any functionality in the
+--     application. It should only be granted to trusted users.
+--
+-- -   @ManageAttributeSets@ – Group members can manage attribute sets.
+--
+-- -   @ViewAuditData@ – Group members can view audit data.
+--
+-- -   @AccessNotebooks@ – Group members will have access to FinSpace
+--     notebooks.
+--
+-- -   @GetTemporaryCredentials@ – Group members can get temporary API
+--     credentials.
+--
+-- 'createTime', 'permissionGroup_createTime' - The timestamp at which the group was created in FinSpace. The value is
+-- determined as epoch time in milliseconds.
+--
+-- 'description', 'permissionGroup_description' - A brief description for the permission group.
+--
+-- 'lastModifiedTime', 'permissionGroup_lastModifiedTime' - Describes the last time the permission group was updated. The value is
+-- determined as epoch time in milliseconds.
+--
+-- 'membershipStatus', 'permissionGroup_membershipStatus' - Indicates the status of the user account within a permission group.
+--
+-- -   @ADDITION_IN_PROGRESS@ – The user account is currently being added
+--     to the permission group.
+--
+-- -   @ADDITION_SUCCESS@ – The user account is successfully added to the
+--     permission group.
+--
+-- -   @REMOVAL_IN_PROGRESS@ – The user is currently being removed from the
+--     permission group.
+--
+-- 'name', 'permissionGroup_name' - The name of the permission group.
+--
+-- 'permissionGroupId', 'permissionGroup_permissionGroupId' - The unique identifier for the permission group.
+newPermissionGroup ::
+  PermissionGroup
+newPermissionGroup =
+  PermissionGroup'
+    { applicationPermissions =
+        Prelude.Nothing,
+      createTime = Prelude.Nothing,
+      description = Prelude.Nothing,
+      lastModifiedTime = Prelude.Nothing,
+      membershipStatus = Prelude.Nothing,
+      name = Prelude.Nothing,
+      permissionGroupId = Prelude.Nothing
+    }
+
+-- | Indicates the permissions that are granted to a specific group for
+-- accessing the FinSpace application.
+--
+-- When assigning application permissions, be aware that the permission
+-- @ManageUsersAndGroups@ allows users to grant themselves or others access
+-- to any functionality in their FinSpace environment\'s application. It
+-- should only be granted to trusted users.
+--
+-- -   @CreateDataset@ – Group members can create new datasets.
+--
+-- -   @ManageClusters@ – Group members can manage Apache Spark clusters
+--     from FinSpace notebooks.
+--
+-- -   @ManageUsersAndGroups@ – Group members can manage users and
+--     permission groups. This is a privileged permission that allows users
+--     to grant themselves or others access to any functionality in the
+--     application. It should only be granted to trusted users.
+--
+-- -   @ManageAttributeSets@ – Group members can manage attribute sets.
+--
+-- -   @ViewAuditData@ – Group members can view audit data.
+--
+-- -   @AccessNotebooks@ – Group members will have access to FinSpace
+--     notebooks.
+--
+-- -   @GetTemporaryCredentials@ – Group members can get temporary API
+--     credentials.
+permissionGroup_applicationPermissions :: Lens.Lens' PermissionGroup (Prelude.Maybe [ApplicationPermission])
+permissionGroup_applicationPermissions = Lens.lens (\PermissionGroup' {applicationPermissions} -> applicationPermissions) (\s@PermissionGroup' {} a -> s {applicationPermissions = a} :: PermissionGroup) Prelude.. Lens.mapping Lens.coerced
+
+-- | The timestamp at which the group was created in FinSpace. The value is
+-- determined as epoch time in milliseconds.
+permissionGroup_createTime :: Lens.Lens' PermissionGroup (Prelude.Maybe Prelude.Integer)
+permissionGroup_createTime = Lens.lens (\PermissionGroup' {createTime} -> createTime) (\s@PermissionGroup' {} a -> s {createTime = a} :: PermissionGroup)
+
+-- | A brief description for the permission group.
+permissionGroup_description :: Lens.Lens' PermissionGroup (Prelude.Maybe Prelude.Text)
+permissionGroup_description = Lens.lens (\PermissionGroup' {description} -> description) (\s@PermissionGroup' {} a -> s {description = a} :: PermissionGroup) Prelude.. Lens.mapping Data._Sensitive
+
+-- | Describes the last time the permission group was updated. The value is
+-- determined as epoch time in milliseconds.
+permissionGroup_lastModifiedTime :: Lens.Lens' PermissionGroup (Prelude.Maybe Prelude.Integer)
+permissionGroup_lastModifiedTime = Lens.lens (\PermissionGroup' {lastModifiedTime} -> lastModifiedTime) (\s@PermissionGroup' {} a -> s {lastModifiedTime = a} :: PermissionGroup)
+
+-- | Indicates the status of the user account within a permission group.
+--
+-- -   @ADDITION_IN_PROGRESS@ – The user account is currently being added
+--     to the permission group.
+--
+-- -   @ADDITION_SUCCESS@ – The user account is successfully added to the
+--     permission group.
+--
+-- -   @REMOVAL_IN_PROGRESS@ – The user is currently being removed from the
+--     permission group.
+permissionGroup_membershipStatus :: Lens.Lens' PermissionGroup (Prelude.Maybe PermissionGroupMembershipStatus)
+permissionGroup_membershipStatus = Lens.lens (\PermissionGroup' {membershipStatus} -> membershipStatus) (\s@PermissionGroup' {} a -> s {membershipStatus = a} :: PermissionGroup)
+
+-- | The name of the permission group.
+permissionGroup_name :: Lens.Lens' PermissionGroup (Prelude.Maybe Prelude.Text)
+permissionGroup_name = Lens.lens (\PermissionGroup' {name} -> name) (\s@PermissionGroup' {} a -> s {name = a} :: PermissionGroup) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The unique identifier for the permission group.
+permissionGroup_permissionGroupId :: Lens.Lens' PermissionGroup (Prelude.Maybe Prelude.Text)
+permissionGroup_permissionGroupId = Lens.lens (\PermissionGroup' {permissionGroupId} -> permissionGroupId) (\s@PermissionGroup' {} a -> s {permissionGroupId = a} :: PermissionGroup)
+
+instance Data.FromJSON PermissionGroup where
+  parseJSON =
+    Data.withObject
+      "PermissionGroup"
+      ( \x ->
+          PermissionGroup'
+            Prelude.<$> ( x
+                            Data..:? "applicationPermissions"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "createTime")
+            Prelude.<*> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "lastModifiedTime")
+            Prelude.<*> (x Data..:? "membershipStatus")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "permissionGroupId")
+      )
+
+instance Prelude.Hashable PermissionGroup where
+  hashWithSalt _salt PermissionGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` applicationPermissions
+      `Prelude.hashWithSalt` createTime
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` lastModifiedTime
+      `Prelude.hashWithSalt` membershipStatus
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` permissionGroupId
+
+instance Prelude.NFData PermissionGroup where
+  rnf PermissionGroup' {..} =
+    Prelude.rnf applicationPermissions
+      `Prelude.seq` Prelude.rnf createTime
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf lastModifiedTime
+      `Prelude.seq` Prelude.rnf membershipStatus
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf permissionGroupId
diff --git a/gen/Amazonka/FinSpaceData/Types/PermissionGroupByUser.hs b/gen/Amazonka/FinSpaceData/Types/PermissionGroupByUser.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/PermissionGroupByUser.hs
@@ -0,0 +1,125 @@
+{-# 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.FinSpaceData.Types.PermissionGroupByUser
+-- 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.FinSpaceData.Types.PermissionGroupByUser where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types.PermissionGroupMembershipStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | The structure of a permission group associated with a user account.
+--
+-- /See:/ 'newPermissionGroupByUser' smart constructor.
+data PermissionGroupByUser = PermissionGroupByUser'
+  { -- | Indicates the status of the user account within a permission group.
+    --
+    -- -   @ADDITION_IN_PROGRESS@ – The user account is currently being added
+    --     to the permission group.
+    --
+    -- -   @ADDITION_SUCCESS@ – The user account is successfully added to the
+    --     permission group.
+    --
+    -- -   @REMOVAL_IN_PROGRESS@ – The user is currently being removed from the
+    --     permission group.
+    membershipStatus :: Prelude.Maybe PermissionGroupMembershipStatus,
+    -- | The name of the permission group.
+    name :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The unique identifier for the permission group.
+    permissionGroupId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PermissionGroupByUser' 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:
+--
+-- 'membershipStatus', 'permissionGroupByUser_membershipStatus' - Indicates the status of the user account within a permission group.
+--
+-- -   @ADDITION_IN_PROGRESS@ – The user account is currently being added
+--     to the permission group.
+--
+-- -   @ADDITION_SUCCESS@ – The user account is successfully added to the
+--     permission group.
+--
+-- -   @REMOVAL_IN_PROGRESS@ – The user is currently being removed from the
+--     permission group.
+--
+-- 'name', 'permissionGroupByUser_name' - The name of the permission group.
+--
+-- 'permissionGroupId', 'permissionGroupByUser_permissionGroupId' - The unique identifier for the permission group.
+newPermissionGroupByUser ::
+  PermissionGroupByUser
+newPermissionGroupByUser =
+  PermissionGroupByUser'
+    { membershipStatus =
+        Prelude.Nothing,
+      name = Prelude.Nothing,
+      permissionGroupId = Prelude.Nothing
+    }
+
+-- | Indicates the status of the user account within a permission group.
+--
+-- -   @ADDITION_IN_PROGRESS@ – The user account is currently being added
+--     to the permission group.
+--
+-- -   @ADDITION_SUCCESS@ – The user account is successfully added to the
+--     permission group.
+--
+-- -   @REMOVAL_IN_PROGRESS@ – The user is currently being removed from the
+--     permission group.
+permissionGroupByUser_membershipStatus :: Lens.Lens' PermissionGroupByUser (Prelude.Maybe PermissionGroupMembershipStatus)
+permissionGroupByUser_membershipStatus = Lens.lens (\PermissionGroupByUser' {membershipStatus} -> membershipStatus) (\s@PermissionGroupByUser' {} a -> s {membershipStatus = a} :: PermissionGroupByUser)
+
+-- | The name of the permission group.
+permissionGroupByUser_name :: Lens.Lens' PermissionGroupByUser (Prelude.Maybe Prelude.Text)
+permissionGroupByUser_name = Lens.lens (\PermissionGroupByUser' {name} -> name) (\s@PermissionGroupByUser' {} a -> s {name = a} :: PermissionGroupByUser) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The unique identifier for the permission group.
+permissionGroupByUser_permissionGroupId :: Lens.Lens' PermissionGroupByUser (Prelude.Maybe Prelude.Text)
+permissionGroupByUser_permissionGroupId = Lens.lens (\PermissionGroupByUser' {permissionGroupId} -> permissionGroupId) (\s@PermissionGroupByUser' {} a -> s {permissionGroupId = a} :: PermissionGroupByUser)
+
+instance Data.FromJSON PermissionGroupByUser where
+  parseJSON =
+    Data.withObject
+      "PermissionGroupByUser"
+      ( \x ->
+          PermissionGroupByUser'
+            Prelude.<$> (x Data..:? "membershipStatus")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "permissionGroupId")
+      )
+
+instance Prelude.Hashable PermissionGroupByUser where
+  hashWithSalt _salt PermissionGroupByUser' {..} =
+    _salt
+      `Prelude.hashWithSalt` membershipStatus
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` permissionGroupId
+
+instance Prelude.NFData PermissionGroupByUser where
+  rnf PermissionGroupByUser' {..} =
+    Prelude.rnf membershipStatus
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf permissionGroupId
diff --git a/gen/Amazonka/FinSpaceData/Types/PermissionGroupMembershipStatus.hs b/gen/Amazonka/FinSpaceData/Types/PermissionGroupMembershipStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/PermissionGroupMembershipStatus.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.FinSpaceData.Types.PermissionGroupMembershipStatus
+-- 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.FinSpaceData.Types.PermissionGroupMembershipStatus
+  ( PermissionGroupMembershipStatus
+      ( ..,
+        PermissionGroupMembershipStatus_ADDITION_IN_PROGRESS,
+        PermissionGroupMembershipStatus_ADDITION_SUCCESS,
+        PermissionGroupMembershipStatus_REMOVAL_IN_PROGRESS
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype PermissionGroupMembershipStatus = PermissionGroupMembershipStatus'
+  { fromPermissionGroupMembershipStatus ::
+      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 PermissionGroupMembershipStatus_ADDITION_IN_PROGRESS :: PermissionGroupMembershipStatus
+pattern PermissionGroupMembershipStatus_ADDITION_IN_PROGRESS = PermissionGroupMembershipStatus' "ADDITION_IN_PROGRESS"
+
+pattern PermissionGroupMembershipStatus_ADDITION_SUCCESS :: PermissionGroupMembershipStatus
+pattern PermissionGroupMembershipStatus_ADDITION_SUCCESS = PermissionGroupMembershipStatus' "ADDITION_SUCCESS"
+
+pattern PermissionGroupMembershipStatus_REMOVAL_IN_PROGRESS :: PermissionGroupMembershipStatus
+pattern PermissionGroupMembershipStatus_REMOVAL_IN_PROGRESS = PermissionGroupMembershipStatus' "REMOVAL_IN_PROGRESS"
+
+{-# COMPLETE
+  PermissionGroupMembershipStatus_ADDITION_IN_PROGRESS,
+  PermissionGroupMembershipStatus_ADDITION_SUCCESS,
+  PermissionGroupMembershipStatus_REMOVAL_IN_PROGRESS,
+  PermissionGroupMembershipStatus'
+  #-}
diff --git a/gen/Amazonka/FinSpaceData/Types/PermissionGroupParams.hs b/gen/Amazonka/FinSpaceData/Types/PermissionGroupParams.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/PermissionGroupParams.hs
@@ -0,0 +1,91 @@
+{-# 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.FinSpaceData.Types.PermissionGroupParams
+-- 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.FinSpaceData.Types.PermissionGroupParams where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types.ResourcePermission
+import qualified Amazonka.Prelude as Prelude
+
+-- | Permission group parameters for Dataset permissions.
+--
+-- Here is an example of how you could specify the @PermissionGroupParams@:
+--
+-- @ { \"permissionGroupId\": \"0r6fCRtSTUk4XPfXQe3M0g\", \"datasetPermissions\": [ {\"permission\": \"ViewDatasetDetails\"}, {\"permission\": \"AddDatasetData\"}, {\"permission\": \"EditDatasetMetadata\"}, {\"permission\": \"DeleteDataset\"} ] } @
+--
+-- /See:/ 'newPermissionGroupParams' smart constructor.
+data PermissionGroupParams = PermissionGroupParams'
+  { -- | List of resource permissions.
+    datasetPermissions :: Prelude.Maybe [ResourcePermission],
+    -- | The unique identifier for the @PermissionGroup@.
+    permissionGroupId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PermissionGroupParams' 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:
+--
+-- 'datasetPermissions', 'permissionGroupParams_datasetPermissions' - List of resource permissions.
+--
+-- 'permissionGroupId', 'permissionGroupParams_permissionGroupId' - The unique identifier for the @PermissionGroup@.
+newPermissionGroupParams ::
+  PermissionGroupParams
+newPermissionGroupParams =
+  PermissionGroupParams'
+    { datasetPermissions =
+        Prelude.Nothing,
+      permissionGroupId = Prelude.Nothing
+    }
+
+-- | List of resource permissions.
+permissionGroupParams_datasetPermissions :: Lens.Lens' PermissionGroupParams (Prelude.Maybe [ResourcePermission])
+permissionGroupParams_datasetPermissions = Lens.lens (\PermissionGroupParams' {datasetPermissions} -> datasetPermissions) (\s@PermissionGroupParams' {} a -> s {datasetPermissions = a} :: PermissionGroupParams) Prelude.. Lens.mapping Lens.coerced
+
+-- | The unique identifier for the @PermissionGroup@.
+permissionGroupParams_permissionGroupId :: Lens.Lens' PermissionGroupParams (Prelude.Maybe Prelude.Text)
+permissionGroupParams_permissionGroupId = Lens.lens (\PermissionGroupParams' {permissionGroupId} -> permissionGroupId) (\s@PermissionGroupParams' {} a -> s {permissionGroupId = a} :: PermissionGroupParams)
+
+instance Prelude.Hashable PermissionGroupParams where
+  hashWithSalt _salt PermissionGroupParams' {..} =
+    _salt
+      `Prelude.hashWithSalt` datasetPermissions
+      `Prelude.hashWithSalt` permissionGroupId
+
+instance Prelude.NFData PermissionGroupParams where
+  rnf PermissionGroupParams' {..} =
+    Prelude.rnf datasetPermissions
+      `Prelude.seq` Prelude.rnf permissionGroupId
+
+instance Data.ToJSON PermissionGroupParams where
+  toJSON PermissionGroupParams' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("datasetPermissions" Data..=)
+              Prelude.<$> datasetPermissions,
+            ("permissionGroupId" Data..=)
+              Prelude.<$> permissionGroupId
+          ]
+      )
diff --git a/gen/Amazonka/FinSpaceData/Types/ResourcePermission.hs b/gen/Amazonka/FinSpaceData/Types/ResourcePermission.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/ResourcePermission.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FinSpaceData.Types.ResourcePermission
+-- 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.FinSpaceData.Types.ResourcePermission 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
+
+-- | Resource permission for a dataset. When you create a dataset, all the
+-- other members of the same user group inherit access to the dataset. You
+-- can only create a dataset if your user group has application permission
+-- for Create Datasets.
+--
+-- The following is a list of valid dataset permissions that you can apply:
+--
+-- -   @ViewDatasetDetails@
+--
+-- -   @ReadDatasetDetails@
+--
+-- -   @AddDatasetData@
+--
+-- -   @CreateDataView@
+--
+-- -   @EditDatasetMetadata@
+--
+-- -   @DeleteDataset@
+--
+-- For more information on the dataset permissions, see
+-- <https://docs.aws.amazon.com/finspace/latest/userguide/managing-user-permissions.html#supported-dataset-permissions Supported Dataset Permissions>
+-- in the FinSpace User Guide.
+--
+-- /See:/ 'newResourcePermission' smart constructor.
+data ResourcePermission = ResourcePermission'
+  { -- | Permission for a resource.
+    permission :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ResourcePermission' 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:
+--
+-- 'permission', 'resourcePermission_permission' - Permission for a resource.
+newResourcePermission ::
+  ResourcePermission
+newResourcePermission =
+  ResourcePermission' {permission = Prelude.Nothing}
+
+-- | Permission for a resource.
+resourcePermission_permission :: Lens.Lens' ResourcePermission (Prelude.Maybe Prelude.Text)
+resourcePermission_permission = Lens.lens (\ResourcePermission' {permission} -> permission) (\s@ResourcePermission' {} a -> s {permission = a} :: ResourcePermission)
+
+instance Prelude.Hashable ResourcePermission where
+  hashWithSalt _salt ResourcePermission' {..} =
+    _salt `Prelude.hashWithSalt` permission
+
+instance Prelude.NFData ResourcePermission where
+  rnf ResourcePermission' {..} = Prelude.rnf permission
+
+instance Data.ToJSON ResourcePermission where
+  toJSON ResourcePermission' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("permission" Data..=) Prelude.<$> permission]
+      )
diff --git a/gen/Amazonka/FinSpaceData/Types/S3Location.hs b/gen/Amazonka/FinSpaceData/Types/S3Location.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/S3Location.hs
@@ -0,0 +1,84 @@
+{-# 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.FinSpaceData.Types.S3Location
+-- 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.FinSpaceData.Types.S3Location 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 location of an external Dataview in an S3 bucket.
+--
+-- /See:/ 'newS3Location' smart constructor.
+data S3Location = S3Location'
+  { -- | The name of the S3 bucket.
+    bucket :: Prelude.Text,
+    -- | The path of the folder, within the S3 bucket that contains the Dataset.
+    key :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'S3Location' 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:
+--
+-- 'bucket', 's3Location_bucket' - The name of the S3 bucket.
+--
+-- 'key', 's3Location_key' - The path of the folder, within the S3 bucket that contains the Dataset.
+newS3Location ::
+  -- | 'bucket'
+  Prelude.Text ->
+  -- | 'key'
+  Prelude.Text ->
+  S3Location
+newS3Location pBucket_ pKey_ =
+  S3Location' {bucket = pBucket_, key = pKey_}
+
+-- | The name of the S3 bucket.
+s3Location_bucket :: Lens.Lens' S3Location Prelude.Text
+s3Location_bucket = Lens.lens (\S3Location' {bucket} -> bucket) (\s@S3Location' {} a -> s {bucket = a} :: S3Location)
+
+-- | The path of the folder, within the S3 bucket that contains the Dataset.
+s3Location_key :: Lens.Lens' S3Location Prelude.Text
+s3Location_key = Lens.lens (\S3Location' {key} -> key) (\s@S3Location' {} a -> s {key = a} :: S3Location)
+
+instance Data.FromJSON S3Location where
+  parseJSON =
+    Data.withObject
+      "S3Location"
+      ( \x ->
+          S3Location'
+            Prelude.<$> (x Data..: "bucket")
+            Prelude.<*> (x Data..: "key")
+      )
+
+instance Prelude.Hashable S3Location where
+  hashWithSalt _salt S3Location' {..} =
+    _salt
+      `Prelude.hashWithSalt` bucket
+      `Prelude.hashWithSalt` key
+
+instance Prelude.NFData S3Location where
+  rnf S3Location' {..} =
+    Prelude.rnf bucket `Prelude.seq` Prelude.rnf key
diff --git a/gen/Amazonka/FinSpaceData/Types/SchemaDefinition.hs b/gen/Amazonka/FinSpaceData/Types/SchemaDefinition.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/SchemaDefinition.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.FinSpaceData.Types.SchemaDefinition
+-- 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.FinSpaceData.Types.SchemaDefinition where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types.ColumnDefinition
+import qualified Amazonka.Prelude as Prelude
+
+-- | Definition for a schema on a tabular Dataset.
+--
+-- /See:/ 'newSchemaDefinition' smart constructor.
+data SchemaDefinition = SchemaDefinition'
+  { -- | List of column definitions.
+    columns :: Prelude.Maybe [ColumnDefinition],
+    -- | List of column names used for primary key.
+    primaryKeyColumns :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SchemaDefinition' 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:
+--
+-- 'columns', 'schemaDefinition_columns' - List of column definitions.
+--
+-- 'primaryKeyColumns', 'schemaDefinition_primaryKeyColumns' - List of column names used for primary key.
+newSchemaDefinition ::
+  SchemaDefinition
+newSchemaDefinition =
+  SchemaDefinition'
+    { columns = Prelude.Nothing,
+      primaryKeyColumns = Prelude.Nothing
+    }
+
+-- | List of column definitions.
+schemaDefinition_columns :: Lens.Lens' SchemaDefinition (Prelude.Maybe [ColumnDefinition])
+schemaDefinition_columns = Lens.lens (\SchemaDefinition' {columns} -> columns) (\s@SchemaDefinition' {} a -> s {columns = a} :: SchemaDefinition) Prelude.. Lens.mapping Lens.coerced
+
+-- | List of column names used for primary key.
+schemaDefinition_primaryKeyColumns :: Lens.Lens' SchemaDefinition (Prelude.Maybe [Prelude.Text])
+schemaDefinition_primaryKeyColumns = Lens.lens (\SchemaDefinition' {primaryKeyColumns} -> primaryKeyColumns) (\s@SchemaDefinition' {} a -> s {primaryKeyColumns = a} :: SchemaDefinition) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON SchemaDefinition where
+  parseJSON =
+    Data.withObject
+      "SchemaDefinition"
+      ( \x ->
+          SchemaDefinition'
+            Prelude.<$> (x Data..:? "columns" Data..!= Prelude.mempty)
+            Prelude.<*> ( x
+                            Data..:? "primaryKeyColumns"
+                            Data..!= Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable SchemaDefinition where
+  hashWithSalt _salt SchemaDefinition' {..} =
+    _salt
+      `Prelude.hashWithSalt` columns
+      `Prelude.hashWithSalt` primaryKeyColumns
+
+instance Prelude.NFData SchemaDefinition where
+  rnf SchemaDefinition' {..} =
+    Prelude.rnf columns
+      `Prelude.seq` Prelude.rnf primaryKeyColumns
+
+instance Data.ToJSON SchemaDefinition where
+  toJSON SchemaDefinition' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("columns" Data..=) Prelude.<$> columns,
+            ("primaryKeyColumns" Data..=)
+              Prelude.<$> primaryKeyColumns
+          ]
+      )
diff --git a/gen/Amazonka/FinSpaceData/Types/SchemaUnion.hs b/gen/Amazonka/FinSpaceData/Types/SchemaUnion.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/SchemaUnion.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.FinSpaceData.Types.SchemaUnion
+-- 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.FinSpaceData.Types.SchemaUnion where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types.SchemaDefinition
+import qualified Amazonka.Prelude as Prelude
+
+-- | A union of schema types.
+--
+-- /See:/ 'newSchemaUnion' smart constructor.
+data SchemaUnion = SchemaUnion'
+  { -- | The configuration for a schema on a tabular Dataset.
+    tabularSchemaConfig :: Prelude.Maybe SchemaDefinition
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SchemaUnion' 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:
+--
+-- 'tabularSchemaConfig', 'schemaUnion_tabularSchemaConfig' - The configuration for a schema on a tabular Dataset.
+newSchemaUnion ::
+  SchemaUnion
+newSchemaUnion =
+  SchemaUnion' {tabularSchemaConfig = Prelude.Nothing}
+
+-- | The configuration for a schema on a tabular Dataset.
+schemaUnion_tabularSchemaConfig :: Lens.Lens' SchemaUnion (Prelude.Maybe SchemaDefinition)
+schemaUnion_tabularSchemaConfig = Lens.lens (\SchemaUnion' {tabularSchemaConfig} -> tabularSchemaConfig) (\s@SchemaUnion' {} a -> s {tabularSchemaConfig = a} :: SchemaUnion)
+
+instance Data.FromJSON SchemaUnion where
+  parseJSON =
+    Data.withObject
+      "SchemaUnion"
+      ( \x ->
+          SchemaUnion'
+            Prelude.<$> (x Data..:? "tabularSchemaConfig")
+      )
+
+instance Prelude.Hashable SchemaUnion where
+  hashWithSalt _salt SchemaUnion' {..} =
+    _salt `Prelude.hashWithSalt` tabularSchemaConfig
+
+instance Prelude.NFData SchemaUnion where
+  rnf SchemaUnion' {..} =
+    Prelude.rnf tabularSchemaConfig
+
+instance Data.ToJSON SchemaUnion where
+  toJSON SchemaUnion' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("tabularSchemaConfig" Data..=)
+              Prelude.<$> tabularSchemaConfig
+          ]
+      )
diff --git a/gen/Amazonka/FinSpaceData/Types/User.hs b/gen/Amazonka/FinSpaceData/Types/User.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/User.hs
@@ -0,0 +1,300 @@
+{-# 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.FinSpaceData.Types.User
+-- 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.FinSpaceData.Types.User where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types.ApiAccess
+import Amazonka.FinSpaceData.Types.UserStatus
+import Amazonka.FinSpaceData.Types.UserType
+import qualified Amazonka.Prelude as Prelude
+
+-- | The details of the user account.
+--
+-- /See:/ 'newUser' smart constructor.
+data User = User'
+  { -- | Indicates whether the user can use the
+    -- @GetProgrammaticAccessCredentials@ API to obtain credentials that can
+    -- then be used to access other FinSpace Data API operations.
+    --
+    -- -   @ENABLED@ – The user has permissions to use the APIs.
+    --
+    -- -   @DISABLED@ – The user does not have permissions to use any APIs.
+    apiAccess :: Prelude.Maybe ApiAccess,
+    -- | The ARN identifier of an AWS user or role that is allowed to call the
+    -- @GetProgrammaticAccessCredentials@ API to obtain a credentials token for
+    -- a specific FinSpace user. This must be an IAM role within your FinSpace
+    -- account.
+    apiAccessPrincipalArn :: Prelude.Maybe Prelude.Text,
+    -- | The timestamp at which the user account was created in FinSpace. The
+    -- value is determined as epoch time in milliseconds.
+    createTime :: Prelude.Maybe Prelude.Integer,
+    -- | The email address of the user. The email address serves as a uniquer
+    -- identifier for each user and cannot be changed after it\'s created.
+    emailAddress :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The first name of the user.
+    firstName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | Describes the last time the user account was disabled. The value is
+    -- determined as epoch time in milliseconds.
+    lastDisabledTime :: Prelude.Maybe Prelude.Integer,
+    -- | Describes the last time the user account was enabled. The value is
+    -- determined as epoch time in milliseconds.
+    lastEnabledTime :: Prelude.Maybe Prelude.Integer,
+    -- | Describes the last time that the user logged into their account. The
+    -- value is determined as epoch time in milliseconds.
+    lastLoginTime :: Prelude.Maybe Prelude.Integer,
+    -- | Describes the last time the user account was updated. The value is
+    -- determined as epoch time in milliseconds.
+    lastModifiedTime :: Prelude.Maybe Prelude.Integer,
+    -- | The last name of the user.
+    lastName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The current status of the user account.
+    --
+    -- -   @CREATING@ – The user account creation is in progress.
+    --
+    -- -   @ENABLED@ – The user account is created and is currently active.
+    --
+    -- -   @DISABLED@ – The user account is currently inactive.
+    status :: Prelude.Maybe UserStatus,
+    -- | Indicates the type of user.
+    --
+    -- -   @SUPER_USER@ – A user with permission to all the functionality and
+    --     data in FinSpace.
+    --
+    -- -   @APP_USER@ – A user with specific permissions in FinSpace. The users
+    --     are assigned permissions by adding them to a permission group.
+    type' :: Prelude.Maybe UserType,
+    -- | The unique identifier for the user.
+    userId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'User' 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:
+--
+-- 'apiAccess', 'user_apiAccess' - Indicates whether the user can use the
+-- @GetProgrammaticAccessCredentials@ API to obtain credentials that can
+-- then be used to access other FinSpace Data API operations.
+--
+-- -   @ENABLED@ – The user has permissions to use the APIs.
+--
+-- -   @DISABLED@ – The user does not have permissions to use any APIs.
+--
+-- 'apiAccessPrincipalArn', 'user_apiAccessPrincipalArn' - The ARN identifier of an AWS user or role that is allowed to call the
+-- @GetProgrammaticAccessCredentials@ API to obtain a credentials token for
+-- a specific FinSpace user. This must be an IAM role within your FinSpace
+-- account.
+--
+-- 'createTime', 'user_createTime' - The timestamp at which the user account was created in FinSpace. The
+-- value is determined as epoch time in milliseconds.
+--
+-- 'emailAddress', 'user_emailAddress' - The email address of the user. The email address serves as a uniquer
+-- identifier for each user and cannot be changed after it\'s created.
+--
+-- 'firstName', 'user_firstName' - The first name of the user.
+--
+-- 'lastDisabledTime', 'user_lastDisabledTime' - Describes the last time the user account was disabled. The value is
+-- determined as epoch time in milliseconds.
+--
+-- 'lastEnabledTime', 'user_lastEnabledTime' - Describes the last time the user account was enabled. The value is
+-- determined as epoch time in milliseconds.
+--
+-- 'lastLoginTime', 'user_lastLoginTime' - Describes the last time that the user logged into their account. The
+-- value is determined as epoch time in milliseconds.
+--
+-- 'lastModifiedTime', 'user_lastModifiedTime' - Describes the last time the user account was updated. The value is
+-- determined as epoch time in milliseconds.
+--
+-- 'lastName', 'user_lastName' - The last name of the user.
+--
+-- 'status', 'user_status' - The current status of the user account.
+--
+-- -   @CREATING@ – The user account creation is in progress.
+--
+-- -   @ENABLED@ – The user account is created and is currently active.
+--
+-- -   @DISABLED@ – The user account is currently inactive.
+--
+-- 'type'', 'user_type' - Indicates the type of user.
+--
+-- -   @SUPER_USER@ – A user with permission to all the functionality and
+--     data in FinSpace.
+--
+-- -   @APP_USER@ – A user with specific permissions in FinSpace. The users
+--     are assigned permissions by adding them to a permission group.
+--
+-- 'userId', 'user_userId' - The unique identifier for the user.
+newUser ::
+  User
+newUser =
+  User'
+    { apiAccess = Prelude.Nothing,
+      apiAccessPrincipalArn = Prelude.Nothing,
+      createTime = Prelude.Nothing,
+      emailAddress = Prelude.Nothing,
+      firstName = Prelude.Nothing,
+      lastDisabledTime = Prelude.Nothing,
+      lastEnabledTime = Prelude.Nothing,
+      lastLoginTime = Prelude.Nothing,
+      lastModifiedTime = Prelude.Nothing,
+      lastName = Prelude.Nothing,
+      status = Prelude.Nothing,
+      type' = Prelude.Nothing,
+      userId = Prelude.Nothing
+    }
+
+-- | Indicates whether the user can use the
+-- @GetProgrammaticAccessCredentials@ API to obtain credentials that can
+-- then be used to access other FinSpace Data API operations.
+--
+-- -   @ENABLED@ – The user has permissions to use the APIs.
+--
+-- -   @DISABLED@ – The user does not have permissions to use any APIs.
+user_apiAccess :: Lens.Lens' User (Prelude.Maybe ApiAccess)
+user_apiAccess = Lens.lens (\User' {apiAccess} -> apiAccess) (\s@User' {} a -> s {apiAccess = a} :: User)
+
+-- | The ARN identifier of an AWS user or role that is allowed to call the
+-- @GetProgrammaticAccessCredentials@ API to obtain a credentials token for
+-- a specific FinSpace user. This must be an IAM role within your FinSpace
+-- account.
+user_apiAccessPrincipalArn :: Lens.Lens' User (Prelude.Maybe Prelude.Text)
+user_apiAccessPrincipalArn = Lens.lens (\User' {apiAccessPrincipalArn} -> apiAccessPrincipalArn) (\s@User' {} a -> s {apiAccessPrincipalArn = a} :: User)
+
+-- | The timestamp at which the user account was created in FinSpace. The
+-- value is determined as epoch time in milliseconds.
+user_createTime :: Lens.Lens' User (Prelude.Maybe Prelude.Integer)
+user_createTime = Lens.lens (\User' {createTime} -> createTime) (\s@User' {} a -> s {createTime = a} :: User)
+
+-- | The email address of the user. The email address serves as a uniquer
+-- identifier for each user and cannot be changed after it\'s created.
+user_emailAddress :: Lens.Lens' User (Prelude.Maybe Prelude.Text)
+user_emailAddress = Lens.lens (\User' {emailAddress} -> emailAddress) (\s@User' {} a -> s {emailAddress = a} :: User) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The first name of the user.
+user_firstName :: Lens.Lens' User (Prelude.Maybe Prelude.Text)
+user_firstName = Lens.lens (\User' {firstName} -> firstName) (\s@User' {} a -> s {firstName = a} :: User) Prelude.. Lens.mapping Data._Sensitive
+
+-- | Describes the last time the user account was disabled. The value is
+-- determined as epoch time in milliseconds.
+user_lastDisabledTime :: Lens.Lens' User (Prelude.Maybe Prelude.Integer)
+user_lastDisabledTime = Lens.lens (\User' {lastDisabledTime} -> lastDisabledTime) (\s@User' {} a -> s {lastDisabledTime = a} :: User)
+
+-- | Describes the last time the user account was enabled. The value is
+-- determined as epoch time in milliseconds.
+user_lastEnabledTime :: Lens.Lens' User (Prelude.Maybe Prelude.Integer)
+user_lastEnabledTime = Lens.lens (\User' {lastEnabledTime} -> lastEnabledTime) (\s@User' {} a -> s {lastEnabledTime = a} :: User)
+
+-- | Describes the last time that the user logged into their account. The
+-- value is determined as epoch time in milliseconds.
+user_lastLoginTime :: Lens.Lens' User (Prelude.Maybe Prelude.Integer)
+user_lastLoginTime = Lens.lens (\User' {lastLoginTime} -> lastLoginTime) (\s@User' {} a -> s {lastLoginTime = a} :: User)
+
+-- | Describes the last time the user account was updated. The value is
+-- determined as epoch time in milliseconds.
+user_lastModifiedTime :: Lens.Lens' User (Prelude.Maybe Prelude.Integer)
+user_lastModifiedTime = Lens.lens (\User' {lastModifiedTime} -> lastModifiedTime) (\s@User' {} a -> s {lastModifiedTime = a} :: User)
+
+-- | The last name of the user.
+user_lastName :: Lens.Lens' User (Prelude.Maybe Prelude.Text)
+user_lastName = Lens.lens (\User' {lastName} -> lastName) (\s@User' {} a -> s {lastName = a} :: User) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The current status of the user account.
+--
+-- -   @CREATING@ – The user account creation is in progress.
+--
+-- -   @ENABLED@ – The user account is created and is currently active.
+--
+-- -   @DISABLED@ – The user account is currently inactive.
+user_status :: Lens.Lens' User (Prelude.Maybe UserStatus)
+user_status = Lens.lens (\User' {status} -> status) (\s@User' {} a -> s {status = a} :: User)
+
+-- | Indicates the type of user.
+--
+-- -   @SUPER_USER@ – A user with permission to all the functionality and
+--     data in FinSpace.
+--
+-- -   @APP_USER@ – A user with specific permissions in FinSpace. The users
+--     are assigned permissions by adding them to a permission group.
+user_type :: Lens.Lens' User (Prelude.Maybe UserType)
+user_type = Lens.lens (\User' {type'} -> type') (\s@User' {} a -> s {type' = a} :: User)
+
+-- | The unique identifier for the user.
+user_userId :: Lens.Lens' User (Prelude.Maybe Prelude.Text)
+user_userId = Lens.lens (\User' {userId} -> userId) (\s@User' {} a -> s {userId = a} :: User)
+
+instance Data.FromJSON User where
+  parseJSON =
+    Data.withObject
+      "User"
+      ( \x ->
+          User'
+            Prelude.<$> (x Data..:? "apiAccess")
+            Prelude.<*> (x Data..:? "apiAccessPrincipalArn")
+            Prelude.<*> (x Data..:? "createTime")
+            Prelude.<*> (x Data..:? "emailAddress")
+            Prelude.<*> (x Data..:? "firstName")
+            Prelude.<*> (x Data..:? "lastDisabledTime")
+            Prelude.<*> (x Data..:? "lastEnabledTime")
+            Prelude.<*> (x Data..:? "lastLoginTime")
+            Prelude.<*> (x Data..:? "lastModifiedTime")
+            Prelude.<*> (x Data..:? "lastName")
+            Prelude.<*> (x Data..:? "status")
+            Prelude.<*> (x Data..:? "type")
+            Prelude.<*> (x Data..:? "userId")
+      )
+
+instance Prelude.Hashable User where
+  hashWithSalt _salt User' {..} =
+    _salt
+      `Prelude.hashWithSalt` apiAccess
+      `Prelude.hashWithSalt` apiAccessPrincipalArn
+      `Prelude.hashWithSalt` createTime
+      `Prelude.hashWithSalt` emailAddress
+      `Prelude.hashWithSalt` firstName
+      `Prelude.hashWithSalt` lastDisabledTime
+      `Prelude.hashWithSalt` lastEnabledTime
+      `Prelude.hashWithSalt` lastLoginTime
+      `Prelude.hashWithSalt` lastModifiedTime
+      `Prelude.hashWithSalt` lastName
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` type'
+      `Prelude.hashWithSalt` userId
+
+instance Prelude.NFData User where
+  rnf User' {..} =
+    Prelude.rnf apiAccess
+      `Prelude.seq` Prelude.rnf apiAccessPrincipalArn
+      `Prelude.seq` Prelude.rnf createTime
+      `Prelude.seq` Prelude.rnf emailAddress
+      `Prelude.seq` Prelude.rnf firstName
+      `Prelude.seq` Prelude.rnf lastDisabledTime
+      `Prelude.seq` Prelude.rnf lastEnabledTime
+      `Prelude.seq` Prelude.rnf lastLoginTime
+      `Prelude.seq` Prelude.rnf lastModifiedTime
+      `Prelude.seq` Prelude.rnf lastName
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf type'
+      `Prelude.seq` Prelude.rnf userId
diff --git a/gen/Amazonka/FinSpaceData/Types/UserByPermissionGroup.hs b/gen/Amazonka/FinSpaceData/Types/UserByPermissionGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/UserByPermissionGroup.hs
@@ -0,0 +1,253 @@
+{-# 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.FinSpaceData.Types.UserByPermissionGroup
+-- 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.FinSpaceData.Types.UserByPermissionGroup where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types.ApiAccess
+import Amazonka.FinSpaceData.Types.PermissionGroupMembershipStatus
+import Amazonka.FinSpaceData.Types.UserStatus
+import Amazonka.FinSpaceData.Types.UserType
+import qualified Amazonka.Prelude as Prelude
+
+-- | The structure of a user account associated with a permission group.
+--
+-- /See:/ 'newUserByPermissionGroup' smart constructor.
+data UserByPermissionGroup = UserByPermissionGroup'
+  { -- | Indicates whether the user can access FinSpace API operations.
+    --
+    -- -   @ENABLED@ – The user has permissions to use the API operations.
+    --
+    -- -   @DISABLED@ – The user does not have permissions to use any API
+    --     operations.
+    apiAccess :: Prelude.Maybe ApiAccess,
+    -- | The IAM ARN identifier that is attached to FinSpace API calls.
+    apiAccessPrincipalArn :: Prelude.Maybe Prelude.Text,
+    -- | The email address of the user. The email address serves as a unique
+    -- identifier for each user and cannot be changed after it\'s created.
+    emailAddress :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The first name of the user.
+    firstName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The last name of the user.
+    lastName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | Indicates the status of the user account within a permission group.
+    --
+    -- -   @ADDITION_IN_PROGRESS@ – The user account is currently being added
+    --     to the permission group.
+    --
+    -- -   @ADDITION_SUCCESS@ – The user account is successfully added to the
+    --     permission group.
+    --
+    -- -   @REMOVAL_IN_PROGRESS@ – The user is currently being removed from the
+    --     permission group.
+    membershipStatus :: Prelude.Maybe PermissionGroupMembershipStatus,
+    -- | The current status of the user account.
+    --
+    -- -   @CREATING@ – The user account creation is in progress.
+    --
+    -- -   @ENABLED@ – The user account is created and is currently active.
+    --
+    -- -   @DISABLED@ – The user account is currently inactive.
+    status :: Prelude.Maybe UserStatus,
+    -- | Indicates the type of user.
+    --
+    -- -   @SUPER_USER@ – A user with permission to all the functionality and
+    --     data in FinSpace.
+    --
+    -- -   @APP_USER@ – A user with specific permissions in FinSpace. The users
+    --     are assigned permissions by adding them to a permission group.
+    type' :: Prelude.Maybe UserType,
+    -- | The unique identifier for the user.
+    userId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UserByPermissionGroup' 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:
+--
+-- 'apiAccess', 'userByPermissionGroup_apiAccess' - Indicates whether the user can access FinSpace API operations.
+--
+-- -   @ENABLED@ – The user has permissions to use the API operations.
+--
+-- -   @DISABLED@ – The user does not have permissions to use any API
+--     operations.
+--
+-- 'apiAccessPrincipalArn', 'userByPermissionGroup_apiAccessPrincipalArn' - The IAM ARN identifier that is attached to FinSpace API calls.
+--
+-- 'emailAddress', 'userByPermissionGroup_emailAddress' - The email address of the user. The email address serves as a unique
+-- identifier for each user and cannot be changed after it\'s created.
+--
+-- 'firstName', 'userByPermissionGroup_firstName' - The first name of the user.
+--
+-- 'lastName', 'userByPermissionGroup_lastName' - The last name of the user.
+--
+-- 'membershipStatus', 'userByPermissionGroup_membershipStatus' - Indicates the status of the user account within a permission group.
+--
+-- -   @ADDITION_IN_PROGRESS@ – The user account is currently being added
+--     to the permission group.
+--
+-- -   @ADDITION_SUCCESS@ – The user account is successfully added to the
+--     permission group.
+--
+-- -   @REMOVAL_IN_PROGRESS@ – The user is currently being removed from the
+--     permission group.
+--
+-- 'status', 'userByPermissionGroup_status' - The current status of the user account.
+--
+-- -   @CREATING@ – The user account creation is in progress.
+--
+-- -   @ENABLED@ – The user account is created and is currently active.
+--
+-- -   @DISABLED@ – The user account is currently inactive.
+--
+-- 'type'', 'userByPermissionGroup_type' - Indicates the type of user.
+--
+-- -   @SUPER_USER@ – A user with permission to all the functionality and
+--     data in FinSpace.
+--
+-- -   @APP_USER@ – A user with specific permissions in FinSpace. The users
+--     are assigned permissions by adding them to a permission group.
+--
+-- 'userId', 'userByPermissionGroup_userId' - The unique identifier for the user.
+newUserByPermissionGroup ::
+  UserByPermissionGroup
+newUserByPermissionGroup =
+  UserByPermissionGroup'
+    { apiAccess = Prelude.Nothing,
+      apiAccessPrincipalArn = Prelude.Nothing,
+      emailAddress = Prelude.Nothing,
+      firstName = Prelude.Nothing,
+      lastName = Prelude.Nothing,
+      membershipStatus = Prelude.Nothing,
+      status = Prelude.Nothing,
+      type' = Prelude.Nothing,
+      userId = Prelude.Nothing
+    }
+
+-- | Indicates whether the user can access FinSpace API operations.
+--
+-- -   @ENABLED@ – The user has permissions to use the API operations.
+--
+-- -   @DISABLED@ – The user does not have permissions to use any API
+--     operations.
+userByPermissionGroup_apiAccess :: Lens.Lens' UserByPermissionGroup (Prelude.Maybe ApiAccess)
+userByPermissionGroup_apiAccess = Lens.lens (\UserByPermissionGroup' {apiAccess} -> apiAccess) (\s@UserByPermissionGroup' {} a -> s {apiAccess = a} :: UserByPermissionGroup)
+
+-- | The IAM ARN identifier that is attached to FinSpace API calls.
+userByPermissionGroup_apiAccessPrincipalArn :: Lens.Lens' UserByPermissionGroup (Prelude.Maybe Prelude.Text)
+userByPermissionGroup_apiAccessPrincipalArn = Lens.lens (\UserByPermissionGroup' {apiAccessPrincipalArn} -> apiAccessPrincipalArn) (\s@UserByPermissionGroup' {} a -> s {apiAccessPrincipalArn = a} :: UserByPermissionGroup)
+
+-- | The email address of the user. The email address serves as a unique
+-- identifier for each user and cannot be changed after it\'s created.
+userByPermissionGroup_emailAddress :: Lens.Lens' UserByPermissionGroup (Prelude.Maybe Prelude.Text)
+userByPermissionGroup_emailAddress = Lens.lens (\UserByPermissionGroup' {emailAddress} -> emailAddress) (\s@UserByPermissionGroup' {} a -> s {emailAddress = a} :: UserByPermissionGroup) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The first name of the user.
+userByPermissionGroup_firstName :: Lens.Lens' UserByPermissionGroup (Prelude.Maybe Prelude.Text)
+userByPermissionGroup_firstName = Lens.lens (\UserByPermissionGroup' {firstName} -> firstName) (\s@UserByPermissionGroup' {} a -> s {firstName = a} :: UserByPermissionGroup) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The last name of the user.
+userByPermissionGroup_lastName :: Lens.Lens' UserByPermissionGroup (Prelude.Maybe Prelude.Text)
+userByPermissionGroup_lastName = Lens.lens (\UserByPermissionGroup' {lastName} -> lastName) (\s@UserByPermissionGroup' {} a -> s {lastName = a} :: UserByPermissionGroup) Prelude.. Lens.mapping Data._Sensitive
+
+-- | Indicates the status of the user account within a permission group.
+--
+-- -   @ADDITION_IN_PROGRESS@ – The user account is currently being added
+--     to the permission group.
+--
+-- -   @ADDITION_SUCCESS@ – The user account is successfully added to the
+--     permission group.
+--
+-- -   @REMOVAL_IN_PROGRESS@ – The user is currently being removed from the
+--     permission group.
+userByPermissionGroup_membershipStatus :: Lens.Lens' UserByPermissionGroup (Prelude.Maybe PermissionGroupMembershipStatus)
+userByPermissionGroup_membershipStatus = Lens.lens (\UserByPermissionGroup' {membershipStatus} -> membershipStatus) (\s@UserByPermissionGroup' {} a -> s {membershipStatus = a} :: UserByPermissionGroup)
+
+-- | The current status of the user account.
+--
+-- -   @CREATING@ – The user account creation is in progress.
+--
+-- -   @ENABLED@ – The user account is created and is currently active.
+--
+-- -   @DISABLED@ – The user account is currently inactive.
+userByPermissionGroup_status :: Lens.Lens' UserByPermissionGroup (Prelude.Maybe UserStatus)
+userByPermissionGroup_status = Lens.lens (\UserByPermissionGroup' {status} -> status) (\s@UserByPermissionGroup' {} a -> s {status = a} :: UserByPermissionGroup)
+
+-- | Indicates the type of user.
+--
+-- -   @SUPER_USER@ – A user with permission to all the functionality and
+--     data in FinSpace.
+--
+-- -   @APP_USER@ – A user with specific permissions in FinSpace. The users
+--     are assigned permissions by adding them to a permission group.
+userByPermissionGroup_type :: Lens.Lens' UserByPermissionGroup (Prelude.Maybe UserType)
+userByPermissionGroup_type = Lens.lens (\UserByPermissionGroup' {type'} -> type') (\s@UserByPermissionGroup' {} a -> s {type' = a} :: UserByPermissionGroup)
+
+-- | The unique identifier for the user.
+userByPermissionGroup_userId :: Lens.Lens' UserByPermissionGroup (Prelude.Maybe Prelude.Text)
+userByPermissionGroup_userId = Lens.lens (\UserByPermissionGroup' {userId} -> userId) (\s@UserByPermissionGroup' {} a -> s {userId = a} :: UserByPermissionGroup)
+
+instance Data.FromJSON UserByPermissionGroup where
+  parseJSON =
+    Data.withObject
+      "UserByPermissionGroup"
+      ( \x ->
+          UserByPermissionGroup'
+            Prelude.<$> (x Data..:? "apiAccess")
+            Prelude.<*> (x Data..:? "apiAccessPrincipalArn")
+            Prelude.<*> (x Data..:? "emailAddress")
+            Prelude.<*> (x Data..:? "firstName")
+            Prelude.<*> (x Data..:? "lastName")
+            Prelude.<*> (x Data..:? "membershipStatus")
+            Prelude.<*> (x Data..:? "status")
+            Prelude.<*> (x Data..:? "type")
+            Prelude.<*> (x Data..:? "userId")
+      )
+
+instance Prelude.Hashable UserByPermissionGroup where
+  hashWithSalt _salt UserByPermissionGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` apiAccess
+      `Prelude.hashWithSalt` apiAccessPrincipalArn
+      `Prelude.hashWithSalt` emailAddress
+      `Prelude.hashWithSalt` firstName
+      `Prelude.hashWithSalt` lastName
+      `Prelude.hashWithSalt` membershipStatus
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` type'
+      `Prelude.hashWithSalt` userId
+
+instance Prelude.NFData UserByPermissionGroup where
+  rnf UserByPermissionGroup' {..} =
+    Prelude.rnf apiAccess
+      `Prelude.seq` Prelude.rnf apiAccessPrincipalArn
+      `Prelude.seq` Prelude.rnf emailAddress
+      `Prelude.seq` Prelude.rnf firstName
+      `Prelude.seq` Prelude.rnf lastName
+      `Prelude.seq` Prelude.rnf membershipStatus
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf type'
+      `Prelude.seq` Prelude.rnf userId
diff --git a/gen/Amazonka/FinSpaceData/Types/UserStatus.hs b/gen/Amazonka/FinSpaceData/Types/UserStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/UserStatus.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.FinSpaceData.Types.UserStatus
+-- 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.FinSpaceData.Types.UserStatus
+  ( UserStatus
+      ( ..,
+        UserStatus_CREATING,
+        UserStatus_DISABLED,
+        UserStatus_ENABLED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype UserStatus = UserStatus'
+  { fromUserStatus ::
+      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 UserStatus_CREATING :: UserStatus
+pattern UserStatus_CREATING = UserStatus' "CREATING"
+
+pattern UserStatus_DISABLED :: UserStatus
+pattern UserStatus_DISABLED = UserStatus' "DISABLED"
+
+pattern UserStatus_ENABLED :: UserStatus
+pattern UserStatus_ENABLED = UserStatus' "ENABLED"
+
+{-# COMPLETE
+  UserStatus_CREATING,
+  UserStatus_DISABLED,
+  UserStatus_ENABLED,
+  UserStatus'
+  #-}
diff --git a/gen/Amazonka/FinSpaceData/Types/UserType.hs b/gen/Amazonka/FinSpaceData/Types/UserType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/Types/UserType.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.FinSpaceData.Types.UserType
+-- 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.FinSpaceData.Types.UserType
+  ( UserType
+      ( ..,
+        UserType_APP_USER,
+        UserType_SUPER_USER
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype UserType = UserType'
+  { fromUserType ::
+      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 UserType_APP_USER :: UserType
+pattern UserType_APP_USER = UserType' "APP_USER"
+
+pattern UserType_SUPER_USER :: UserType
+pattern UserType_SUPER_USER = UserType' "SUPER_USER"
+
+{-# COMPLETE
+  UserType_APP_USER,
+  UserType_SUPER_USER,
+  UserType'
+  #-}
diff --git a/gen/Amazonka/FinSpaceData/UpdateChangeset.hs b/gen/Amazonka/FinSpaceData/UpdateChangeset.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/UpdateChangeset.hs
@@ -0,0 +1,360 @@
+{-# 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.FinSpaceData.UpdateChangeset
+-- 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 FinSpace Changeset.
+module Amazonka.FinSpaceData.UpdateChangeset
+  ( -- * Creating a Request
+    UpdateChangeset (..),
+    newUpdateChangeset,
+
+    -- * Request Lenses
+    updateChangeset_clientToken,
+    updateChangeset_datasetId,
+    updateChangeset_changesetId,
+    updateChangeset_sourceParams,
+    updateChangeset_formatParams,
+
+    -- * Destructuring the Response
+    UpdateChangesetResponse (..),
+    newUpdateChangesetResponse,
+
+    -- * Response Lenses
+    updateChangesetResponse_changesetId,
+    updateChangesetResponse_datasetId,
+    updateChangesetResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Request to update an existing changeset.
+--
+-- /See:/ 'newUpdateChangeset' smart constructor.
+data UpdateChangeset = UpdateChangeset'
+  { -- | A token that ensures idempotency. This token expires in 10 minutes.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier for the FinSpace Dataset in which the Changeset is
+    -- created.
+    datasetId :: Prelude.Text,
+    -- | The unique identifier for the Changeset to update.
+    changesetId :: Prelude.Text,
+    -- | Options that define the location of the data being ingested
+    -- (@s3SourcePath@) and the source of the changeset (@sourceType@).
+    --
+    -- Both @s3SourcePath@ and @sourceType@ are required attributes.
+    --
+    -- Here is an example of how you could specify the @sourceParams@:
+    --
+    -- @ \"sourceParams\": { \"s3SourcePath\": \"s3:\/\/finspace-landing-us-east-2-bk7gcfvitndqa6ebnvys4d\/scratch\/wr5hh8pwkpqqkxa4sxrmcw\/ingestion\/equity.csv\", \"sourceType\": \"S3\" } @
+    --
+    -- The S3 path that you specify must allow the FinSpace role access. To do
+    -- that, you first need to configure the IAM policy on S3 bucket. For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/finspace/latest/data-api/fs-using-the-finspace-api.html#access-s3-buckets Loading data from an Amazon S3 Bucket using the FinSpace API>section.
+    sourceParams :: Prelude.HashMap Prelude.Text Prelude.Text,
+    -- | Options that define the structure of the source file(s) including the
+    -- format type (@formatType@), header row (@withHeader@), data separation
+    -- character (@separator@) and the type of compression (@compression@).
+    --
+    -- @formatType@ is a required attribute and can have the following values:
+    --
+    -- -   @PARQUET@ – Parquet source file format.
+    --
+    -- -   @CSV@ – CSV source file format.
+    --
+    -- -   @JSON@ – JSON source file format.
+    --
+    -- -   @XML@ – XML source file format.
+    --
+    -- Here is an example of how you could specify the @formatParams@:
+    --
+    -- @ \"formatParams\": { \"formatType\": \"CSV\", \"withHeader\": \"true\", \"separator\": \",\", \"compression\":\"None\" } @
+    --
+    -- Note that if you only provide @formatType@ as @CSV@, the rest of the
+    -- attributes will automatically default to CSV values as following:
+    --
+    -- @ { \"withHeader\": \"true\", \"separator\": \",\" } @
+    --
+    -- For more information about supported file formats, see
+    -- <https://docs.aws.amazon.com/finspace/latest/userguide/supported-data-types.html Supported Data Types and File Formats>
+    -- in the FinSpace User Guide.
+    formatParams :: Prelude.HashMap Prelude.Text Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateChangeset' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'updateChangeset_clientToken' - A token that ensures idempotency. This token expires in 10 minutes.
+--
+-- 'datasetId', 'updateChangeset_datasetId' - The unique identifier for the FinSpace Dataset in which the Changeset is
+-- created.
+--
+-- 'changesetId', 'updateChangeset_changesetId' - The unique identifier for the Changeset to update.
+--
+-- 'sourceParams', 'updateChangeset_sourceParams' - Options that define the location of the data being ingested
+-- (@s3SourcePath@) and the source of the changeset (@sourceType@).
+--
+-- Both @s3SourcePath@ and @sourceType@ are required attributes.
+--
+-- Here is an example of how you could specify the @sourceParams@:
+--
+-- @ \"sourceParams\": { \"s3SourcePath\": \"s3:\/\/finspace-landing-us-east-2-bk7gcfvitndqa6ebnvys4d\/scratch\/wr5hh8pwkpqqkxa4sxrmcw\/ingestion\/equity.csv\", \"sourceType\": \"S3\" } @
+--
+-- The S3 path that you specify must allow the FinSpace role access. To do
+-- that, you first need to configure the IAM policy on S3 bucket. For more
+-- information, see
+-- <https://docs.aws.amazon.com/finspace/latest/data-api/fs-using-the-finspace-api.html#access-s3-buckets Loading data from an Amazon S3 Bucket using the FinSpace API>section.
+--
+-- 'formatParams', 'updateChangeset_formatParams' - Options that define the structure of the source file(s) including the
+-- format type (@formatType@), header row (@withHeader@), data separation
+-- character (@separator@) and the type of compression (@compression@).
+--
+-- @formatType@ is a required attribute and can have the following values:
+--
+-- -   @PARQUET@ – Parquet source file format.
+--
+-- -   @CSV@ – CSV source file format.
+--
+-- -   @JSON@ – JSON source file format.
+--
+-- -   @XML@ – XML source file format.
+--
+-- Here is an example of how you could specify the @formatParams@:
+--
+-- @ \"formatParams\": { \"formatType\": \"CSV\", \"withHeader\": \"true\", \"separator\": \",\", \"compression\":\"None\" } @
+--
+-- Note that if you only provide @formatType@ as @CSV@, the rest of the
+-- attributes will automatically default to CSV values as following:
+--
+-- @ { \"withHeader\": \"true\", \"separator\": \",\" } @
+--
+-- For more information about supported file formats, see
+-- <https://docs.aws.amazon.com/finspace/latest/userguide/supported-data-types.html Supported Data Types and File Formats>
+-- in the FinSpace User Guide.
+newUpdateChangeset ::
+  -- | 'datasetId'
+  Prelude.Text ->
+  -- | 'changesetId'
+  Prelude.Text ->
+  UpdateChangeset
+newUpdateChangeset pDatasetId_ pChangesetId_ =
+  UpdateChangeset'
+    { clientToken = Prelude.Nothing,
+      datasetId = pDatasetId_,
+      changesetId = pChangesetId_,
+      sourceParams = Prelude.mempty,
+      formatParams = Prelude.mempty
+    }
+
+-- | A token that ensures idempotency. This token expires in 10 minutes.
+updateChangeset_clientToken :: Lens.Lens' UpdateChangeset (Prelude.Maybe Prelude.Text)
+updateChangeset_clientToken = Lens.lens (\UpdateChangeset' {clientToken} -> clientToken) (\s@UpdateChangeset' {} a -> s {clientToken = a} :: UpdateChangeset)
+
+-- | The unique identifier for the FinSpace Dataset in which the Changeset is
+-- created.
+updateChangeset_datasetId :: Lens.Lens' UpdateChangeset Prelude.Text
+updateChangeset_datasetId = Lens.lens (\UpdateChangeset' {datasetId} -> datasetId) (\s@UpdateChangeset' {} a -> s {datasetId = a} :: UpdateChangeset)
+
+-- | The unique identifier for the Changeset to update.
+updateChangeset_changesetId :: Lens.Lens' UpdateChangeset Prelude.Text
+updateChangeset_changesetId = Lens.lens (\UpdateChangeset' {changesetId} -> changesetId) (\s@UpdateChangeset' {} a -> s {changesetId = a} :: UpdateChangeset)
+
+-- | Options that define the location of the data being ingested
+-- (@s3SourcePath@) and the source of the changeset (@sourceType@).
+--
+-- Both @s3SourcePath@ and @sourceType@ are required attributes.
+--
+-- Here is an example of how you could specify the @sourceParams@:
+--
+-- @ \"sourceParams\": { \"s3SourcePath\": \"s3:\/\/finspace-landing-us-east-2-bk7gcfvitndqa6ebnvys4d\/scratch\/wr5hh8pwkpqqkxa4sxrmcw\/ingestion\/equity.csv\", \"sourceType\": \"S3\" } @
+--
+-- The S3 path that you specify must allow the FinSpace role access. To do
+-- that, you first need to configure the IAM policy on S3 bucket. For more
+-- information, see
+-- <https://docs.aws.amazon.com/finspace/latest/data-api/fs-using-the-finspace-api.html#access-s3-buckets Loading data from an Amazon S3 Bucket using the FinSpace API>section.
+updateChangeset_sourceParams :: Lens.Lens' UpdateChangeset (Prelude.HashMap Prelude.Text Prelude.Text)
+updateChangeset_sourceParams = Lens.lens (\UpdateChangeset' {sourceParams} -> sourceParams) (\s@UpdateChangeset' {} a -> s {sourceParams = a} :: UpdateChangeset) Prelude.. Lens.coerced
+
+-- | Options that define the structure of the source file(s) including the
+-- format type (@formatType@), header row (@withHeader@), data separation
+-- character (@separator@) and the type of compression (@compression@).
+--
+-- @formatType@ is a required attribute and can have the following values:
+--
+-- -   @PARQUET@ – Parquet source file format.
+--
+-- -   @CSV@ – CSV source file format.
+--
+-- -   @JSON@ – JSON source file format.
+--
+-- -   @XML@ – XML source file format.
+--
+-- Here is an example of how you could specify the @formatParams@:
+--
+-- @ \"formatParams\": { \"formatType\": \"CSV\", \"withHeader\": \"true\", \"separator\": \",\", \"compression\":\"None\" } @
+--
+-- Note that if you only provide @formatType@ as @CSV@, the rest of the
+-- attributes will automatically default to CSV values as following:
+--
+-- @ { \"withHeader\": \"true\", \"separator\": \",\" } @
+--
+-- For more information about supported file formats, see
+-- <https://docs.aws.amazon.com/finspace/latest/userguide/supported-data-types.html Supported Data Types and File Formats>
+-- in the FinSpace User Guide.
+updateChangeset_formatParams :: Lens.Lens' UpdateChangeset (Prelude.HashMap Prelude.Text Prelude.Text)
+updateChangeset_formatParams = Lens.lens (\UpdateChangeset' {formatParams} -> formatParams) (\s@UpdateChangeset' {} a -> s {formatParams = a} :: UpdateChangeset) Prelude.. Lens.coerced
+
+instance Core.AWSRequest UpdateChangeset where
+  type
+    AWSResponse UpdateChangeset =
+      UpdateChangesetResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateChangesetResponse'
+            Prelude.<$> (x Data..?> "changesetId")
+            Prelude.<*> (x Data..?> "datasetId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateChangeset where
+  hashWithSalt _salt UpdateChangeset' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` datasetId
+      `Prelude.hashWithSalt` changesetId
+      `Prelude.hashWithSalt` sourceParams
+      `Prelude.hashWithSalt` formatParams
+
+instance Prelude.NFData UpdateChangeset where
+  rnf UpdateChangeset' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf datasetId
+      `Prelude.seq` Prelude.rnf changesetId
+      `Prelude.seq` Prelude.rnf sourceParams
+      `Prelude.seq` Prelude.rnf formatParams
+
+instance Data.ToHeaders UpdateChangeset where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateChangeset where
+  toJSON UpdateChangeset' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            Prelude.Just ("sourceParams" Data..= sourceParams),
+            Prelude.Just ("formatParams" Data..= formatParams)
+          ]
+      )
+
+instance Data.ToPath UpdateChangeset where
+  toPath UpdateChangeset' {..} =
+    Prelude.mconcat
+      [ "/datasets/",
+        Data.toBS datasetId,
+        "/changesetsv2/",
+        Data.toBS changesetId
+      ]
+
+instance Data.ToQuery UpdateChangeset where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | The response from a update changeset operation.
+--
+-- /See:/ 'newUpdateChangesetResponse' smart constructor.
+data UpdateChangesetResponse = UpdateChangesetResponse'
+  { -- | The unique identifier for the Changeset to update.
+    changesetId :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier for the FinSpace Dataset in which the Changeset is
+    -- created.
+    datasetId :: 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 'UpdateChangesetResponse' 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:
+--
+-- 'changesetId', 'updateChangesetResponse_changesetId' - The unique identifier for the Changeset to update.
+--
+-- 'datasetId', 'updateChangesetResponse_datasetId' - The unique identifier for the FinSpace Dataset in which the Changeset is
+-- created.
+--
+-- 'httpStatus', 'updateChangesetResponse_httpStatus' - The response's http status code.
+newUpdateChangesetResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateChangesetResponse
+newUpdateChangesetResponse pHttpStatus_ =
+  UpdateChangesetResponse'
+    { changesetId =
+        Prelude.Nothing,
+      datasetId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The unique identifier for the Changeset to update.
+updateChangesetResponse_changesetId :: Lens.Lens' UpdateChangesetResponse (Prelude.Maybe Prelude.Text)
+updateChangesetResponse_changesetId = Lens.lens (\UpdateChangesetResponse' {changesetId} -> changesetId) (\s@UpdateChangesetResponse' {} a -> s {changesetId = a} :: UpdateChangesetResponse)
+
+-- | The unique identifier for the FinSpace Dataset in which the Changeset is
+-- created.
+updateChangesetResponse_datasetId :: Lens.Lens' UpdateChangesetResponse (Prelude.Maybe Prelude.Text)
+updateChangesetResponse_datasetId = Lens.lens (\UpdateChangesetResponse' {datasetId} -> datasetId) (\s@UpdateChangesetResponse' {} a -> s {datasetId = a} :: UpdateChangesetResponse)
+
+-- | The response's http status code.
+updateChangesetResponse_httpStatus :: Lens.Lens' UpdateChangesetResponse Prelude.Int
+updateChangesetResponse_httpStatus = Lens.lens (\UpdateChangesetResponse' {httpStatus} -> httpStatus) (\s@UpdateChangesetResponse' {} a -> s {httpStatus = a} :: UpdateChangesetResponse)
+
+instance Prelude.NFData UpdateChangesetResponse where
+  rnf UpdateChangesetResponse' {..} =
+    Prelude.rnf changesetId
+      `Prelude.seq` Prelude.rnf datasetId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/UpdateDataset.hs b/gen/Amazonka/FinSpaceData/UpdateDataset.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/UpdateDataset.hs
@@ -0,0 +1,269 @@
+{-# 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.FinSpaceData.UpdateDataset
+-- 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 FinSpace Dataset.
+module Amazonka.FinSpaceData.UpdateDataset
+  ( -- * Creating a Request
+    UpdateDataset (..),
+    newUpdateDataset,
+
+    -- * Request Lenses
+    updateDataset_alias,
+    updateDataset_clientToken,
+    updateDataset_datasetDescription,
+    updateDataset_schemaDefinition,
+    updateDataset_datasetId,
+    updateDataset_datasetTitle,
+    updateDataset_kind,
+
+    -- * Destructuring the Response
+    UpdateDatasetResponse (..),
+    newUpdateDatasetResponse,
+
+    -- * Response Lenses
+    updateDatasetResponse_datasetId,
+    updateDatasetResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The request for an UpdateDataset operation
+--
+-- /See:/ 'newUpdateDataset' smart constructor.
+data UpdateDataset = UpdateDataset'
+  { -- | The unique resource identifier for a Dataset.
+    alias :: Prelude.Maybe Prelude.Text,
+    -- | A token that ensures idempotency. This token expires in 10 minutes.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | A description for the Dataset.
+    datasetDescription :: Prelude.Maybe Prelude.Text,
+    -- | Definition for a schema on a tabular Dataset.
+    schemaDefinition :: Prelude.Maybe SchemaUnion,
+    -- | The unique identifier for the Dataset to update.
+    datasetId :: Prelude.Text,
+    -- | A display title for the Dataset.
+    datasetTitle :: Prelude.Text,
+    -- | The format in which the Dataset data is structured.
+    --
+    -- -   @TABULAR@ – Data is structured in a tabular format.
+    --
+    -- -   @NON_TABULAR@ – Data is structured in a non-tabular format.
+    kind :: DatasetKind
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateDataset' 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:
+--
+-- 'alias', 'updateDataset_alias' - The unique resource identifier for a Dataset.
+--
+-- 'clientToken', 'updateDataset_clientToken' - A token that ensures idempotency. This token expires in 10 minutes.
+--
+-- 'datasetDescription', 'updateDataset_datasetDescription' - A description for the Dataset.
+--
+-- 'schemaDefinition', 'updateDataset_schemaDefinition' - Definition for a schema on a tabular Dataset.
+--
+-- 'datasetId', 'updateDataset_datasetId' - The unique identifier for the Dataset to update.
+--
+-- 'datasetTitle', 'updateDataset_datasetTitle' - A display title for the Dataset.
+--
+-- 'kind', 'updateDataset_kind' - The format in which the Dataset data is structured.
+--
+-- -   @TABULAR@ – Data is structured in a tabular format.
+--
+-- -   @NON_TABULAR@ – Data is structured in a non-tabular format.
+newUpdateDataset ::
+  -- | 'datasetId'
+  Prelude.Text ->
+  -- | 'datasetTitle'
+  Prelude.Text ->
+  -- | 'kind'
+  DatasetKind ->
+  UpdateDataset
+newUpdateDataset pDatasetId_ pDatasetTitle_ pKind_ =
+  UpdateDataset'
+    { alias = Prelude.Nothing,
+      clientToken = Prelude.Nothing,
+      datasetDescription = Prelude.Nothing,
+      schemaDefinition = Prelude.Nothing,
+      datasetId = pDatasetId_,
+      datasetTitle = pDatasetTitle_,
+      kind = pKind_
+    }
+
+-- | The unique resource identifier for a Dataset.
+updateDataset_alias :: Lens.Lens' UpdateDataset (Prelude.Maybe Prelude.Text)
+updateDataset_alias = Lens.lens (\UpdateDataset' {alias} -> alias) (\s@UpdateDataset' {} a -> s {alias = a} :: UpdateDataset)
+
+-- | A token that ensures idempotency. This token expires in 10 minutes.
+updateDataset_clientToken :: Lens.Lens' UpdateDataset (Prelude.Maybe Prelude.Text)
+updateDataset_clientToken = Lens.lens (\UpdateDataset' {clientToken} -> clientToken) (\s@UpdateDataset' {} a -> s {clientToken = a} :: UpdateDataset)
+
+-- | A description for the Dataset.
+updateDataset_datasetDescription :: Lens.Lens' UpdateDataset (Prelude.Maybe Prelude.Text)
+updateDataset_datasetDescription = Lens.lens (\UpdateDataset' {datasetDescription} -> datasetDescription) (\s@UpdateDataset' {} a -> s {datasetDescription = a} :: UpdateDataset)
+
+-- | Definition for a schema on a tabular Dataset.
+updateDataset_schemaDefinition :: Lens.Lens' UpdateDataset (Prelude.Maybe SchemaUnion)
+updateDataset_schemaDefinition = Lens.lens (\UpdateDataset' {schemaDefinition} -> schemaDefinition) (\s@UpdateDataset' {} a -> s {schemaDefinition = a} :: UpdateDataset)
+
+-- | The unique identifier for the Dataset to update.
+updateDataset_datasetId :: Lens.Lens' UpdateDataset Prelude.Text
+updateDataset_datasetId = Lens.lens (\UpdateDataset' {datasetId} -> datasetId) (\s@UpdateDataset' {} a -> s {datasetId = a} :: UpdateDataset)
+
+-- | A display title for the Dataset.
+updateDataset_datasetTitle :: Lens.Lens' UpdateDataset Prelude.Text
+updateDataset_datasetTitle = Lens.lens (\UpdateDataset' {datasetTitle} -> datasetTitle) (\s@UpdateDataset' {} a -> s {datasetTitle = a} :: UpdateDataset)
+
+-- | The format in which the Dataset data is structured.
+--
+-- -   @TABULAR@ – Data is structured in a tabular format.
+--
+-- -   @NON_TABULAR@ – Data is structured in a non-tabular format.
+updateDataset_kind :: Lens.Lens' UpdateDataset DatasetKind
+updateDataset_kind = Lens.lens (\UpdateDataset' {kind} -> kind) (\s@UpdateDataset' {} a -> s {kind = a} :: UpdateDataset)
+
+instance Core.AWSRequest UpdateDataset where
+  type
+    AWSResponse UpdateDataset =
+      UpdateDatasetResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateDatasetResponse'
+            Prelude.<$> (x Data..?> "datasetId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateDataset where
+  hashWithSalt _salt UpdateDataset' {..} =
+    _salt
+      `Prelude.hashWithSalt` alias
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` datasetDescription
+      `Prelude.hashWithSalt` schemaDefinition
+      `Prelude.hashWithSalt` datasetId
+      `Prelude.hashWithSalt` datasetTitle
+      `Prelude.hashWithSalt` kind
+
+instance Prelude.NFData UpdateDataset where
+  rnf UpdateDataset' {..} =
+    Prelude.rnf alias
+      `Prelude.seq` Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf datasetDescription
+      `Prelude.seq` Prelude.rnf schemaDefinition
+      `Prelude.seq` Prelude.rnf datasetId
+      `Prelude.seq` Prelude.rnf datasetTitle
+      `Prelude.seq` Prelude.rnf kind
+
+instance Data.ToHeaders UpdateDataset where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateDataset where
+  toJSON UpdateDataset' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("alias" Data..=) Prelude.<$> alias,
+            ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("datasetDescription" Data..=)
+              Prelude.<$> datasetDescription,
+            ("schemaDefinition" Data..=)
+              Prelude.<$> schemaDefinition,
+            Prelude.Just ("datasetTitle" Data..= datasetTitle),
+            Prelude.Just ("kind" Data..= kind)
+          ]
+      )
+
+instance Data.ToPath UpdateDataset where
+  toPath UpdateDataset' {..} =
+    Prelude.mconcat
+      ["/datasetsv2/", Data.toBS datasetId]
+
+instance Data.ToQuery UpdateDataset where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | The response from an UpdateDataset operation
+--
+-- /See:/ 'newUpdateDatasetResponse' smart constructor.
+data UpdateDatasetResponse = UpdateDatasetResponse'
+  { -- | The unique identifier for updated Dataset.
+    datasetId :: 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 'UpdateDatasetResponse' 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:
+--
+-- 'datasetId', 'updateDatasetResponse_datasetId' - The unique identifier for updated Dataset.
+--
+-- 'httpStatus', 'updateDatasetResponse_httpStatus' - The response's http status code.
+newUpdateDatasetResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateDatasetResponse
+newUpdateDatasetResponse pHttpStatus_ =
+  UpdateDatasetResponse'
+    { datasetId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The unique identifier for updated Dataset.
+updateDatasetResponse_datasetId :: Lens.Lens' UpdateDatasetResponse (Prelude.Maybe Prelude.Text)
+updateDatasetResponse_datasetId = Lens.lens (\UpdateDatasetResponse' {datasetId} -> datasetId) (\s@UpdateDatasetResponse' {} a -> s {datasetId = a} :: UpdateDatasetResponse)
+
+-- | The response's http status code.
+updateDatasetResponse_httpStatus :: Lens.Lens' UpdateDatasetResponse Prelude.Int
+updateDatasetResponse_httpStatus = Lens.lens (\UpdateDatasetResponse' {httpStatus} -> httpStatus) (\s@UpdateDatasetResponse' {} a -> s {httpStatus = a} :: UpdateDatasetResponse)
+
+instance Prelude.NFData UpdateDatasetResponse where
+  rnf UpdateDatasetResponse' {..} =
+    Prelude.rnf datasetId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/UpdatePermissionGroup.hs b/gen/Amazonka/FinSpaceData/UpdatePermissionGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/UpdatePermissionGroup.hs
@@ -0,0 +1,303 @@
+{-# 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.FinSpaceData.UpdatePermissionGroup
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Modifies the details of a permission group. You cannot modify a
+-- @permissionGroupID@.
+module Amazonka.FinSpaceData.UpdatePermissionGroup
+  ( -- * Creating a Request
+    UpdatePermissionGroup (..),
+    newUpdatePermissionGroup,
+
+    -- * Request Lenses
+    updatePermissionGroup_applicationPermissions,
+    updatePermissionGroup_clientToken,
+    updatePermissionGroup_description,
+    updatePermissionGroup_name,
+    updatePermissionGroup_permissionGroupId,
+
+    -- * Destructuring the Response
+    UpdatePermissionGroupResponse (..),
+    newUpdatePermissionGroupResponse,
+
+    -- * Response Lenses
+    updatePermissionGroupResponse_permissionGroupId,
+    updatePermissionGroupResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdatePermissionGroup' smart constructor.
+data UpdatePermissionGroup = UpdatePermissionGroup'
+  { -- | The permissions that are granted to a specific group for accessing the
+    -- FinSpace application.
+    --
+    -- When assigning application permissions, be aware that the permission
+    -- @ManageUsersAndGroups@ allows users to grant themselves or others access
+    -- to any functionality in their FinSpace environment\'s application. It
+    -- should only be granted to trusted users.
+    --
+    -- -   @CreateDataset@ – Group members can create new datasets.
+    --
+    -- -   @ManageClusters@ – Group members can manage Apache Spark clusters
+    --     from FinSpace notebooks.
+    --
+    -- -   @ManageUsersAndGroups@ – Group members can manage users and
+    --     permission groups. This is a privileged permission that allows users
+    --     to grant themselves or others access to any functionality in the
+    --     application. It should only be granted to trusted users.
+    --
+    -- -   @ManageAttributeSets@ – Group members can manage attribute sets.
+    --
+    -- -   @ViewAuditData@ – Group members can view audit data.
+    --
+    -- -   @AccessNotebooks@ – Group members will have access to FinSpace
+    --     notebooks.
+    --
+    -- -   @GetTemporaryCredentials@ – Group members can get temporary API
+    --     credentials.
+    applicationPermissions :: Prelude.Maybe [ApplicationPermission],
+    -- | A token that ensures idempotency. This token expires in 10 minutes.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | A brief description for the permission group.
+    description :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The name of the permission group.
+    name :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The unique identifier for the permission group to update.
+    permissionGroupId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdatePermissionGroup' 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:
+--
+-- 'applicationPermissions', 'updatePermissionGroup_applicationPermissions' - The permissions that are granted to a specific group for accessing the
+-- FinSpace application.
+--
+-- When assigning application permissions, be aware that the permission
+-- @ManageUsersAndGroups@ allows users to grant themselves or others access
+-- to any functionality in their FinSpace environment\'s application. It
+-- should only be granted to trusted users.
+--
+-- -   @CreateDataset@ – Group members can create new datasets.
+--
+-- -   @ManageClusters@ – Group members can manage Apache Spark clusters
+--     from FinSpace notebooks.
+--
+-- -   @ManageUsersAndGroups@ – Group members can manage users and
+--     permission groups. This is a privileged permission that allows users
+--     to grant themselves or others access to any functionality in the
+--     application. It should only be granted to trusted users.
+--
+-- -   @ManageAttributeSets@ – Group members can manage attribute sets.
+--
+-- -   @ViewAuditData@ – Group members can view audit data.
+--
+-- -   @AccessNotebooks@ – Group members will have access to FinSpace
+--     notebooks.
+--
+-- -   @GetTemporaryCredentials@ – Group members can get temporary API
+--     credentials.
+--
+-- 'clientToken', 'updatePermissionGroup_clientToken' - A token that ensures idempotency. This token expires in 10 minutes.
+--
+-- 'description', 'updatePermissionGroup_description' - A brief description for the permission group.
+--
+-- 'name', 'updatePermissionGroup_name' - The name of the permission group.
+--
+-- 'permissionGroupId', 'updatePermissionGroup_permissionGroupId' - The unique identifier for the permission group to update.
+newUpdatePermissionGroup ::
+  -- | 'permissionGroupId'
+  Prelude.Text ->
+  UpdatePermissionGroup
+newUpdatePermissionGroup pPermissionGroupId_ =
+  UpdatePermissionGroup'
+    { applicationPermissions =
+        Prelude.Nothing,
+      clientToken = Prelude.Nothing,
+      description = Prelude.Nothing,
+      name = Prelude.Nothing,
+      permissionGroupId = pPermissionGroupId_
+    }
+
+-- | The permissions that are granted to a specific group for accessing the
+-- FinSpace application.
+--
+-- When assigning application permissions, be aware that the permission
+-- @ManageUsersAndGroups@ allows users to grant themselves or others access
+-- to any functionality in their FinSpace environment\'s application. It
+-- should only be granted to trusted users.
+--
+-- -   @CreateDataset@ – Group members can create new datasets.
+--
+-- -   @ManageClusters@ – Group members can manage Apache Spark clusters
+--     from FinSpace notebooks.
+--
+-- -   @ManageUsersAndGroups@ – Group members can manage users and
+--     permission groups. This is a privileged permission that allows users
+--     to grant themselves or others access to any functionality in the
+--     application. It should only be granted to trusted users.
+--
+-- -   @ManageAttributeSets@ – Group members can manage attribute sets.
+--
+-- -   @ViewAuditData@ – Group members can view audit data.
+--
+-- -   @AccessNotebooks@ – Group members will have access to FinSpace
+--     notebooks.
+--
+-- -   @GetTemporaryCredentials@ – Group members can get temporary API
+--     credentials.
+updatePermissionGroup_applicationPermissions :: Lens.Lens' UpdatePermissionGroup (Prelude.Maybe [ApplicationPermission])
+updatePermissionGroup_applicationPermissions = Lens.lens (\UpdatePermissionGroup' {applicationPermissions} -> applicationPermissions) (\s@UpdatePermissionGroup' {} a -> s {applicationPermissions = a} :: UpdatePermissionGroup) Prelude.. Lens.mapping Lens.coerced
+
+-- | A token that ensures idempotency. This token expires in 10 minutes.
+updatePermissionGroup_clientToken :: Lens.Lens' UpdatePermissionGroup (Prelude.Maybe Prelude.Text)
+updatePermissionGroup_clientToken = Lens.lens (\UpdatePermissionGroup' {clientToken} -> clientToken) (\s@UpdatePermissionGroup' {} a -> s {clientToken = a} :: UpdatePermissionGroup)
+
+-- | A brief description for the permission group.
+updatePermissionGroup_description :: Lens.Lens' UpdatePermissionGroup (Prelude.Maybe Prelude.Text)
+updatePermissionGroup_description = Lens.lens (\UpdatePermissionGroup' {description} -> description) (\s@UpdatePermissionGroup' {} a -> s {description = a} :: UpdatePermissionGroup) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The name of the permission group.
+updatePermissionGroup_name :: Lens.Lens' UpdatePermissionGroup (Prelude.Maybe Prelude.Text)
+updatePermissionGroup_name = Lens.lens (\UpdatePermissionGroup' {name} -> name) (\s@UpdatePermissionGroup' {} a -> s {name = a} :: UpdatePermissionGroup) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The unique identifier for the permission group to update.
+updatePermissionGroup_permissionGroupId :: Lens.Lens' UpdatePermissionGroup Prelude.Text
+updatePermissionGroup_permissionGroupId = Lens.lens (\UpdatePermissionGroup' {permissionGroupId} -> permissionGroupId) (\s@UpdatePermissionGroup' {} a -> s {permissionGroupId = a} :: UpdatePermissionGroup)
+
+instance Core.AWSRequest UpdatePermissionGroup where
+  type
+    AWSResponse UpdatePermissionGroup =
+      UpdatePermissionGroupResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdatePermissionGroupResponse'
+            Prelude.<$> (x Data..?> "permissionGroupId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdatePermissionGroup where
+  hashWithSalt _salt UpdatePermissionGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` applicationPermissions
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` permissionGroupId
+
+instance Prelude.NFData UpdatePermissionGroup where
+  rnf UpdatePermissionGroup' {..} =
+    Prelude.rnf applicationPermissions
+      `Prelude.seq` Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf permissionGroupId
+
+instance Data.ToHeaders UpdatePermissionGroup where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdatePermissionGroup where
+  toJSON UpdatePermissionGroup' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("applicationPermissions" Data..=)
+              Prelude.<$> applicationPermissions,
+            ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("description" Data..=) Prelude.<$> description,
+            ("name" Data..=) Prelude.<$> name
+          ]
+      )
+
+instance Data.ToPath UpdatePermissionGroup where
+  toPath UpdatePermissionGroup' {..} =
+    Prelude.mconcat
+      ["/permission-group/", Data.toBS permissionGroupId]
+
+instance Data.ToQuery UpdatePermissionGroup where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdatePermissionGroupResponse' smart constructor.
+data UpdatePermissionGroupResponse = UpdatePermissionGroupResponse'
+  { -- | The unique identifier for the updated permission group.
+    permissionGroupId :: 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 'UpdatePermissionGroupResponse' 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:
+--
+-- 'permissionGroupId', 'updatePermissionGroupResponse_permissionGroupId' - The unique identifier for the updated permission group.
+--
+-- 'httpStatus', 'updatePermissionGroupResponse_httpStatus' - The response's http status code.
+newUpdatePermissionGroupResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdatePermissionGroupResponse
+newUpdatePermissionGroupResponse pHttpStatus_ =
+  UpdatePermissionGroupResponse'
+    { permissionGroupId =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The unique identifier for the updated permission group.
+updatePermissionGroupResponse_permissionGroupId :: Lens.Lens' UpdatePermissionGroupResponse (Prelude.Maybe Prelude.Text)
+updatePermissionGroupResponse_permissionGroupId = Lens.lens (\UpdatePermissionGroupResponse' {permissionGroupId} -> permissionGroupId) (\s@UpdatePermissionGroupResponse' {} a -> s {permissionGroupId = a} :: UpdatePermissionGroupResponse)
+
+-- | The response's http status code.
+updatePermissionGroupResponse_httpStatus :: Lens.Lens' UpdatePermissionGroupResponse Prelude.Int
+updatePermissionGroupResponse_httpStatus = Lens.lens (\UpdatePermissionGroupResponse' {httpStatus} -> httpStatus) (\s@UpdatePermissionGroupResponse' {} a -> s {httpStatus = a} :: UpdatePermissionGroupResponse)
+
+instance Prelude.NFData UpdatePermissionGroupResponse where
+  rnf UpdatePermissionGroupResponse' {..} =
+    Prelude.rnf permissionGroupId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/UpdateUser.hs b/gen/Amazonka/FinSpaceData/UpdateUser.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/UpdateUser.hs
@@ -0,0 +1,291 @@
+{-# 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.FinSpaceData.UpdateUser
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Modifies the details of the specified user account. You cannot update
+-- the @userId@ for a user.
+module Amazonka.FinSpaceData.UpdateUser
+  ( -- * Creating a Request
+    UpdateUser (..),
+    newUpdateUser,
+
+    -- * Request Lenses
+    updateUser_apiAccess,
+    updateUser_apiAccessPrincipalArn,
+    updateUser_clientToken,
+    updateUser_firstName,
+    updateUser_lastName,
+    updateUser_type,
+    updateUser_userId,
+
+    -- * Destructuring the Response
+    UpdateUserResponse (..),
+    newUpdateUserResponse,
+
+    -- * Response Lenses
+    updateUserResponse_userId,
+    updateUserResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateUser' smart constructor.
+data UpdateUser = UpdateUser'
+  { -- | The option to indicate whether the user can use the
+    -- @GetProgrammaticAccessCredentials@ API to obtain credentials that can
+    -- then be used to access other FinSpace Data API operations.
+    --
+    -- -   @ENABLED@ – The user has permissions to use the APIs.
+    --
+    -- -   @DISABLED@ – The user does not have permissions to use any APIs.
+    apiAccess :: Prelude.Maybe ApiAccess,
+    -- | The ARN identifier of an AWS user or role that is allowed to call the
+    -- @GetProgrammaticAccessCredentials@ API to obtain a credentials token for
+    -- a specific FinSpace user. This must be an IAM role within your FinSpace
+    -- account.
+    apiAccessPrincipalArn :: Prelude.Maybe Prelude.Text,
+    -- | A token that ensures idempotency. This token expires in 10 minutes.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The first name of the user.
+    firstName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The last name of the user.
+    lastName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The option to indicate the type of user.
+    --
+    -- -   @SUPER_USER@– A user with permission to all the functionality and
+    --     data in FinSpace.
+    --
+    -- -   @APP_USER@ – A user with specific permissions in FinSpace. The users
+    --     are assigned permissions by adding them to a permission group.
+    type' :: Prelude.Maybe UserType,
+    -- | The unique identifier for the user account to update.
+    userId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateUser' 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:
+--
+-- 'apiAccess', 'updateUser_apiAccess' - The option to indicate whether the user can use the
+-- @GetProgrammaticAccessCredentials@ API to obtain credentials that can
+-- then be used to access other FinSpace Data API operations.
+--
+-- -   @ENABLED@ – The user has permissions to use the APIs.
+--
+-- -   @DISABLED@ – The user does not have permissions to use any APIs.
+--
+-- 'apiAccessPrincipalArn', 'updateUser_apiAccessPrincipalArn' - The ARN identifier of an AWS user or role that is allowed to call the
+-- @GetProgrammaticAccessCredentials@ API to obtain a credentials token for
+-- a specific FinSpace user. This must be an IAM role within your FinSpace
+-- account.
+--
+-- 'clientToken', 'updateUser_clientToken' - A token that ensures idempotency. This token expires in 10 minutes.
+--
+-- 'firstName', 'updateUser_firstName' - The first name of the user.
+--
+-- 'lastName', 'updateUser_lastName' - The last name of the user.
+--
+-- 'type'', 'updateUser_type' - The option to indicate the type of user.
+--
+-- -   @SUPER_USER@– A user with permission to all the functionality and
+--     data in FinSpace.
+--
+-- -   @APP_USER@ – A user with specific permissions in FinSpace. The users
+--     are assigned permissions by adding them to a permission group.
+--
+-- 'userId', 'updateUser_userId' - The unique identifier for the user account to update.
+newUpdateUser ::
+  -- | 'userId'
+  Prelude.Text ->
+  UpdateUser
+newUpdateUser pUserId_ =
+  UpdateUser'
+    { apiAccess = Prelude.Nothing,
+      apiAccessPrincipalArn = Prelude.Nothing,
+      clientToken = Prelude.Nothing,
+      firstName = Prelude.Nothing,
+      lastName = Prelude.Nothing,
+      type' = Prelude.Nothing,
+      userId = pUserId_
+    }
+
+-- | The option to indicate whether the user can use the
+-- @GetProgrammaticAccessCredentials@ API to obtain credentials that can
+-- then be used to access other FinSpace Data API operations.
+--
+-- -   @ENABLED@ – The user has permissions to use the APIs.
+--
+-- -   @DISABLED@ – The user does not have permissions to use any APIs.
+updateUser_apiAccess :: Lens.Lens' UpdateUser (Prelude.Maybe ApiAccess)
+updateUser_apiAccess = Lens.lens (\UpdateUser' {apiAccess} -> apiAccess) (\s@UpdateUser' {} a -> s {apiAccess = a} :: UpdateUser)
+
+-- | The ARN identifier of an AWS user or role that is allowed to call the
+-- @GetProgrammaticAccessCredentials@ API to obtain a credentials token for
+-- a specific FinSpace user. This must be an IAM role within your FinSpace
+-- account.
+updateUser_apiAccessPrincipalArn :: Lens.Lens' UpdateUser (Prelude.Maybe Prelude.Text)
+updateUser_apiAccessPrincipalArn = Lens.lens (\UpdateUser' {apiAccessPrincipalArn} -> apiAccessPrincipalArn) (\s@UpdateUser' {} a -> s {apiAccessPrincipalArn = a} :: UpdateUser)
+
+-- | A token that ensures idempotency. This token expires in 10 minutes.
+updateUser_clientToken :: Lens.Lens' UpdateUser (Prelude.Maybe Prelude.Text)
+updateUser_clientToken = Lens.lens (\UpdateUser' {clientToken} -> clientToken) (\s@UpdateUser' {} a -> s {clientToken = a} :: UpdateUser)
+
+-- | The first name of the user.
+updateUser_firstName :: Lens.Lens' UpdateUser (Prelude.Maybe Prelude.Text)
+updateUser_firstName = Lens.lens (\UpdateUser' {firstName} -> firstName) (\s@UpdateUser' {} a -> s {firstName = a} :: UpdateUser) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The last name of the user.
+updateUser_lastName :: Lens.Lens' UpdateUser (Prelude.Maybe Prelude.Text)
+updateUser_lastName = Lens.lens (\UpdateUser' {lastName} -> lastName) (\s@UpdateUser' {} a -> s {lastName = a} :: UpdateUser) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The option to indicate the type of user.
+--
+-- -   @SUPER_USER@– A user with permission to all the functionality and
+--     data in FinSpace.
+--
+-- -   @APP_USER@ – A user with specific permissions in FinSpace. The users
+--     are assigned permissions by adding them to a permission group.
+updateUser_type :: Lens.Lens' UpdateUser (Prelude.Maybe UserType)
+updateUser_type = Lens.lens (\UpdateUser' {type'} -> type') (\s@UpdateUser' {} a -> s {type' = a} :: UpdateUser)
+
+-- | The unique identifier for the user account to update.
+updateUser_userId :: Lens.Lens' UpdateUser Prelude.Text
+updateUser_userId = Lens.lens (\UpdateUser' {userId} -> userId) (\s@UpdateUser' {} a -> s {userId = a} :: UpdateUser)
+
+instance Core.AWSRequest UpdateUser where
+  type AWSResponse UpdateUser = UpdateUserResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateUserResponse'
+            Prelude.<$> (x Data..?> "userId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateUser where
+  hashWithSalt _salt UpdateUser' {..} =
+    _salt
+      `Prelude.hashWithSalt` apiAccess
+      `Prelude.hashWithSalt` apiAccessPrincipalArn
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` firstName
+      `Prelude.hashWithSalt` lastName
+      `Prelude.hashWithSalt` type'
+      `Prelude.hashWithSalt` userId
+
+instance Prelude.NFData UpdateUser where
+  rnf UpdateUser' {..} =
+    Prelude.rnf apiAccess
+      `Prelude.seq` Prelude.rnf apiAccessPrincipalArn
+      `Prelude.seq` Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf firstName
+      `Prelude.seq` Prelude.rnf lastName
+      `Prelude.seq` Prelude.rnf type'
+      `Prelude.seq` Prelude.rnf userId
+
+instance Data.ToHeaders UpdateUser where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateUser where
+  toJSON UpdateUser' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("apiAccess" Data..=) Prelude.<$> apiAccess,
+            ("apiAccessPrincipalArn" Data..=)
+              Prelude.<$> apiAccessPrincipalArn,
+            ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("firstName" Data..=) Prelude.<$> firstName,
+            ("lastName" Data..=) Prelude.<$> lastName,
+            ("type" Data..=) Prelude.<$> type'
+          ]
+      )
+
+instance Data.ToPath UpdateUser where
+  toPath UpdateUser' {..} =
+    Prelude.mconcat ["/user/", Data.toBS userId]
+
+instance Data.ToQuery UpdateUser where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateUserResponse' smart constructor.
+data UpdateUserResponse = UpdateUserResponse'
+  { -- | The unique identifier of the updated user account.
+    userId :: 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 'UpdateUserResponse' 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:
+--
+-- 'userId', 'updateUserResponse_userId' - The unique identifier of the updated user account.
+--
+-- 'httpStatus', 'updateUserResponse_httpStatus' - The response's http status code.
+newUpdateUserResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateUserResponse
+newUpdateUserResponse pHttpStatus_ =
+  UpdateUserResponse'
+    { userId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The unique identifier of the updated user account.
+updateUserResponse_userId :: Lens.Lens' UpdateUserResponse (Prelude.Maybe Prelude.Text)
+updateUserResponse_userId = Lens.lens (\UpdateUserResponse' {userId} -> userId) (\s@UpdateUserResponse' {} a -> s {userId = a} :: UpdateUserResponse)
+
+-- | The response's http status code.
+updateUserResponse_httpStatus :: Lens.Lens' UpdateUserResponse Prelude.Int
+updateUserResponse_httpStatus = Lens.lens (\UpdateUserResponse' {httpStatus} -> httpStatus) (\s@UpdateUserResponse' {} a -> s {httpStatus = a} :: UpdateUserResponse)
+
+instance Prelude.NFData UpdateUserResponse where
+  rnf UpdateUserResponse' {..} =
+    Prelude.rnf userId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpaceData/Waiters.hs b/gen/Amazonka/FinSpaceData/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpaceData/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.FinSpaceData.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.FinSpaceData.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpaceData.Lens
+import Amazonka.FinSpaceData.Types
+import qualified Amazonka.Prelude as Prelude
diff --git a/src/.gitkeep b/src/.gitkeep
new file mode 100644
--- /dev/null
+++ b/src/.gitkeep
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,23 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Main
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Main (main) where
+
+import Test.Amazonka.FinSpaceData
+import Test.Amazonka.FinSpaceData.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "FinSpaceData"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/FinSpaceData.hs b/test/Test/Amazonka/FinSpaceData.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/FinSpaceData.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.FinSpaceData
+-- 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.FinSpaceData
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/FinSpaceData/Internal.hs b/test/Test/Amazonka/FinSpaceData/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/FinSpaceData/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.FinSpaceData.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.FinSpaceData.Internal where
diff --git a/test/Test/Amazonka/Gen/FinSpaceData.hs b/test/Test/Amazonka/Gen/FinSpaceData.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/FinSpaceData.hs
@@ -0,0 +1,658 @@
+{-# 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.FinSpaceData
+-- 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.FinSpaceData where
+
+import Amazonka.FinSpaceData
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.FinSpaceData.Internal
+import Test.Amazonka.Fixture
+import Test.Amazonka.Prelude
+import Test.Tasty
+
+-- Auto-generated: the actual test selection needs to be manually placed into
+-- the top-level so that real test data can be incrementally added.
+--
+-- This commented snippet is what the entire set should look like:
+
+-- fixtures :: TestTree
+-- fixtures =
+--     [ testGroup "request"
+--         [ requestAssociateUserToPermissionGroup $
+--             newAssociateUserToPermissionGroup
+--
+--         , requestCreateChangeset $
+--             newCreateChangeset
+--
+--         , requestCreateDataView $
+--             newCreateDataView
+--
+--         , requestCreateDataset $
+--             newCreateDataset
+--
+--         , requestCreatePermissionGroup $
+--             newCreatePermissionGroup
+--
+--         , requestCreateUser $
+--             newCreateUser
+--
+--         , requestDeleteDataset $
+--             newDeleteDataset
+--
+--         , requestDeletePermissionGroup $
+--             newDeletePermissionGroup
+--
+--         , requestDisableUser $
+--             newDisableUser
+--
+--         , requestDisassociateUserFromPermissionGroup $
+--             newDisassociateUserFromPermissionGroup
+--
+--         , requestEnableUser $
+--             newEnableUser
+--
+--         , requestGetChangeset $
+--             newGetChangeset
+--
+--         , requestGetDataView $
+--             newGetDataView
+--
+--         , requestGetDataset $
+--             newGetDataset
+--
+--         , requestGetExternalDataViewAccessDetails $
+--             newGetExternalDataViewAccessDetails
+--
+--         , requestGetPermissionGroup $
+--             newGetPermissionGroup
+--
+--         , requestGetProgrammaticAccessCredentials $
+--             newGetProgrammaticAccessCredentials
+--
+--         , requestGetUser $
+--             newGetUser
+--
+--         , requestGetWorkingLocation $
+--             newGetWorkingLocation
+--
+--         , requestListChangesets $
+--             newListChangesets
+--
+--         , requestListDataViews $
+--             newListDataViews
+--
+--         , requestListDatasets $
+--             newListDatasets
+--
+--         , requestListPermissionGroups $
+--             newListPermissionGroups
+--
+--         , requestListPermissionGroupsByUser $
+--             newListPermissionGroupsByUser
+--
+--         , requestListUsers $
+--             newListUsers
+--
+--         , requestListUsersByPermissionGroup $
+--             newListUsersByPermissionGroup
+--
+--         , requestResetUserPassword $
+--             newResetUserPassword
+--
+--         , requestUpdateChangeset $
+--             newUpdateChangeset
+--
+--         , requestUpdateDataset $
+--             newUpdateDataset
+--
+--         , requestUpdatePermissionGroup $
+--             newUpdatePermissionGroup
+--
+--         , requestUpdateUser $
+--             newUpdateUser
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseAssociateUserToPermissionGroup $
+--             newAssociateUserToPermissionGroupResponse
+--
+--         , responseCreateChangeset $
+--             newCreateChangesetResponse
+--
+--         , responseCreateDataView $
+--             newCreateDataViewResponse
+--
+--         , responseCreateDataset $
+--             newCreateDatasetResponse
+--
+--         , responseCreatePermissionGroup $
+--             newCreatePermissionGroupResponse
+--
+--         , responseCreateUser $
+--             newCreateUserResponse
+--
+--         , responseDeleteDataset $
+--             newDeleteDatasetResponse
+--
+--         , responseDeletePermissionGroup $
+--             newDeletePermissionGroupResponse
+--
+--         , responseDisableUser $
+--             newDisableUserResponse
+--
+--         , responseDisassociateUserFromPermissionGroup $
+--             newDisassociateUserFromPermissionGroupResponse
+--
+--         , responseEnableUser $
+--             newEnableUserResponse
+--
+--         , responseGetChangeset $
+--             newGetChangesetResponse
+--
+--         , responseGetDataView $
+--             newGetDataViewResponse
+--
+--         , responseGetDataset $
+--             newGetDatasetResponse
+--
+--         , responseGetExternalDataViewAccessDetails $
+--             newGetExternalDataViewAccessDetailsResponse
+--
+--         , responseGetPermissionGroup $
+--             newGetPermissionGroupResponse
+--
+--         , responseGetProgrammaticAccessCredentials $
+--             newGetProgrammaticAccessCredentialsResponse
+--
+--         , responseGetUser $
+--             newGetUserResponse
+--
+--         , responseGetWorkingLocation $
+--             newGetWorkingLocationResponse
+--
+--         , responseListChangesets $
+--             newListChangesetsResponse
+--
+--         , responseListDataViews $
+--             newListDataViewsResponse
+--
+--         , responseListDatasets $
+--             newListDatasetsResponse
+--
+--         , responseListPermissionGroups $
+--             newListPermissionGroupsResponse
+--
+--         , responseListPermissionGroupsByUser $
+--             newListPermissionGroupsByUserResponse
+--
+--         , responseListUsers $
+--             newListUsersResponse
+--
+--         , responseListUsersByPermissionGroup $
+--             newListUsersByPermissionGroupResponse
+--
+--         , responseResetUserPassword $
+--             newResetUserPasswordResponse
+--
+--         , responseUpdateChangeset $
+--             newUpdateChangesetResponse
+--
+--         , responseUpdateDataset $
+--             newUpdateDatasetResponse
+--
+--         , responseUpdatePermissionGroup $
+--             newUpdatePermissionGroupResponse
+--
+--         , responseUpdateUser $
+--             newUpdateUserResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestAssociateUserToPermissionGroup :: AssociateUserToPermissionGroup -> TestTree
+requestAssociateUserToPermissionGroup =
+  req
+    "AssociateUserToPermissionGroup"
+    "fixture/AssociateUserToPermissionGroup.yaml"
+
+requestCreateChangeset :: CreateChangeset -> TestTree
+requestCreateChangeset =
+  req
+    "CreateChangeset"
+    "fixture/CreateChangeset.yaml"
+
+requestCreateDataView :: CreateDataView -> TestTree
+requestCreateDataView =
+  req
+    "CreateDataView"
+    "fixture/CreateDataView.yaml"
+
+requestCreateDataset :: CreateDataset -> TestTree
+requestCreateDataset =
+  req
+    "CreateDataset"
+    "fixture/CreateDataset.yaml"
+
+requestCreatePermissionGroup :: CreatePermissionGroup -> TestTree
+requestCreatePermissionGroup =
+  req
+    "CreatePermissionGroup"
+    "fixture/CreatePermissionGroup.yaml"
+
+requestCreateUser :: CreateUser -> TestTree
+requestCreateUser =
+  req
+    "CreateUser"
+    "fixture/CreateUser.yaml"
+
+requestDeleteDataset :: DeleteDataset -> TestTree
+requestDeleteDataset =
+  req
+    "DeleteDataset"
+    "fixture/DeleteDataset.yaml"
+
+requestDeletePermissionGroup :: DeletePermissionGroup -> TestTree
+requestDeletePermissionGroup =
+  req
+    "DeletePermissionGroup"
+    "fixture/DeletePermissionGroup.yaml"
+
+requestDisableUser :: DisableUser -> TestTree
+requestDisableUser =
+  req
+    "DisableUser"
+    "fixture/DisableUser.yaml"
+
+requestDisassociateUserFromPermissionGroup :: DisassociateUserFromPermissionGroup -> TestTree
+requestDisassociateUserFromPermissionGroup =
+  req
+    "DisassociateUserFromPermissionGroup"
+    "fixture/DisassociateUserFromPermissionGroup.yaml"
+
+requestEnableUser :: EnableUser -> TestTree
+requestEnableUser =
+  req
+    "EnableUser"
+    "fixture/EnableUser.yaml"
+
+requestGetChangeset :: GetChangeset -> TestTree
+requestGetChangeset =
+  req
+    "GetChangeset"
+    "fixture/GetChangeset.yaml"
+
+requestGetDataView :: GetDataView -> TestTree
+requestGetDataView =
+  req
+    "GetDataView"
+    "fixture/GetDataView.yaml"
+
+requestGetDataset :: GetDataset -> TestTree
+requestGetDataset =
+  req
+    "GetDataset"
+    "fixture/GetDataset.yaml"
+
+requestGetExternalDataViewAccessDetails :: GetExternalDataViewAccessDetails -> TestTree
+requestGetExternalDataViewAccessDetails =
+  req
+    "GetExternalDataViewAccessDetails"
+    "fixture/GetExternalDataViewAccessDetails.yaml"
+
+requestGetPermissionGroup :: GetPermissionGroup -> TestTree
+requestGetPermissionGroup =
+  req
+    "GetPermissionGroup"
+    "fixture/GetPermissionGroup.yaml"
+
+requestGetProgrammaticAccessCredentials :: GetProgrammaticAccessCredentials -> TestTree
+requestGetProgrammaticAccessCredentials =
+  req
+    "GetProgrammaticAccessCredentials"
+    "fixture/GetProgrammaticAccessCredentials.yaml"
+
+requestGetUser :: GetUser -> TestTree
+requestGetUser =
+  req
+    "GetUser"
+    "fixture/GetUser.yaml"
+
+requestGetWorkingLocation :: GetWorkingLocation -> TestTree
+requestGetWorkingLocation =
+  req
+    "GetWorkingLocation"
+    "fixture/GetWorkingLocation.yaml"
+
+requestListChangesets :: ListChangesets -> TestTree
+requestListChangesets =
+  req
+    "ListChangesets"
+    "fixture/ListChangesets.yaml"
+
+requestListDataViews :: ListDataViews -> TestTree
+requestListDataViews =
+  req
+    "ListDataViews"
+    "fixture/ListDataViews.yaml"
+
+requestListDatasets :: ListDatasets -> TestTree
+requestListDatasets =
+  req
+    "ListDatasets"
+    "fixture/ListDatasets.yaml"
+
+requestListPermissionGroups :: ListPermissionGroups -> TestTree
+requestListPermissionGroups =
+  req
+    "ListPermissionGroups"
+    "fixture/ListPermissionGroups.yaml"
+
+requestListPermissionGroupsByUser :: ListPermissionGroupsByUser -> TestTree
+requestListPermissionGroupsByUser =
+  req
+    "ListPermissionGroupsByUser"
+    "fixture/ListPermissionGroupsByUser.yaml"
+
+requestListUsers :: ListUsers -> TestTree
+requestListUsers =
+  req
+    "ListUsers"
+    "fixture/ListUsers.yaml"
+
+requestListUsersByPermissionGroup :: ListUsersByPermissionGroup -> TestTree
+requestListUsersByPermissionGroup =
+  req
+    "ListUsersByPermissionGroup"
+    "fixture/ListUsersByPermissionGroup.yaml"
+
+requestResetUserPassword :: ResetUserPassword -> TestTree
+requestResetUserPassword =
+  req
+    "ResetUserPassword"
+    "fixture/ResetUserPassword.yaml"
+
+requestUpdateChangeset :: UpdateChangeset -> TestTree
+requestUpdateChangeset =
+  req
+    "UpdateChangeset"
+    "fixture/UpdateChangeset.yaml"
+
+requestUpdateDataset :: UpdateDataset -> TestTree
+requestUpdateDataset =
+  req
+    "UpdateDataset"
+    "fixture/UpdateDataset.yaml"
+
+requestUpdatePermissionGroup :: UpdatePermissionGroup -> TestTree
+requestUpdatePermissionGroup =
+  req
+    "UpdatePermissionGroup"
+    "fixture/UpdatePermissionGroup.yaml"
+
+requestUpdateUser :: UpdateUser -> TestTree
+requestUpdateUser =
+  req
+    "UpdateUser"
+    "fixture/UpdateUser.yaml"
+
+-- Responses
+
+responseAssociateUserToPermissionGroup :: AssociateUserToPermissionGroupResponse -> TestTree
+responseAssociateUserToPermissionGroup =
+  res
+    "AssociateUserToPermissionGroupResponse"
+    "fixture/AssociateUserToPermissionGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy AssociateUserToPermissionGroup)
+
+responseCreateChangeset :: CreateChangesetResponse -> TestTree
+responseCreateChangeset =
+  res
+    "CreateChangesetResponse"
+    "fixture/CreateChangesetResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateChangeset)
+
+responseCreateDataView :: CreateDataViewResponse -> TestTree
+responseCreateDataView =
+  res
+    "CreateDataViewResponse"
+    "fixture/CreateDataViewResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateDataView)
+
+responseCreateDataset :: CreateDatasetResponse -> TestTree
+responseCreateDataset =
+  res
+    "CreateDatasetResponse"
+    "fixture/CreateDatasetResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateDataset)
+
+responseCreatePermissionGroup :: CreatePermissionGroupResponse -> TestTree
+responseCreatePermissionGroup =
+  res
+    "CreatePermissionGroupResponse"
+    "fixture/CreatePermissionGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreatePermissionGroup)
+
+responseCreateUser :: CreateUserResponse -> TestTree
+responseCreateUser =
+  res
+    "CreateUserResponse"
+    "fixture/CreateUserResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateUser)
+
+responseDeleteDataset :: DeleteDatasetResponse -> TestTree
+responseDeleteDataset =
+  res
+    "DeleteDatasetResponse"
+    "fixture/DeleteDatasetResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteDataset)
+
+responseDeletePermissionGroup :: DeletePermissionGroupResponse -> TestTree
+responseDeletePermissionGroup =
+  res
+    "DeletePermissionGroupResponse"
+    "fixture/DeletePermissionGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeletePermissionGroup)
+
+responseDisableUser :: DisableUserResponse -> TestTree
+responseDisableUser =
+  res
+    "DisableUserResponse"
+    "fixture/DisableUserResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DisableUser)
+
+responseDisassociateUserFromPermissionGroup :: DisassociateUserFromPermissionGroupResponse -> TestTree
+responseDisassociateUserFromPermissionGroup =
+  res
+    "DisassociateUserFromPermissionGroupResponse"
+    "fixture/DisassociateUserFromPermissionGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DisassociateUserFromPermissionGroup)
+
+responseEnableUser :: EnableUserResponse -> TestTree
+responseEnableUser =
+  res
+    "EnableUserResponse"
+    "fixture/EnableUserResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy EnableUser)
+
+responseGetChangeset :: GetChangesetResponse -> TestTree
+responseGetChangeset =
+  res
+    "GetChangesetResponse"
+    "fixture/GetChangesetResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetChangeset)
+
+responseGetDataView :: GetDataViewResponse -> TestTree
+responseGetDataView =
+  res
+    "GetDataViewResponse"
+    "fixture/GetDataViewResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetDataView)
+
+responseGetDataset :: GetDatasetResponse -> TestTree
+responseGetDataset =
+  res
+    "GetDatasetResponse"
+    "fixture/GetDatasetResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetDataset)
+
+responseGetExternalDataViewAccessDetails :: GetExternalDataViewAccessDetailsResponse -> TestTree
+responseGetExternalDataViewAccessDetails =
+  res
+    "GetExternalDataViewAccessDetailsResponse"
+    "fixture/GetExternalDataViewAccessDetailsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetExternalDataViewAccessDetails)
+
+responseGetPermissionGroup :: GetPermissionGroupResponse -> TestTree
+responseGetPermissionGroup =
+  res
+    "GetPermissionGroupResponse"
+    "fixture/GetPermissionGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetPermissionGroup)
+
+responseGetProgrammaticAccessCredentials :: GetProgrammaticAccessCredentialsResponse -> TestTree
+responseGetProgrammaticAccessCredentials =
+  res
+    "GetProgrammaticAccessCredentialsResponse"
+    "fixture/GetProgrammaticAccessCredentialsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetProgrammaticAccessCredentials)
+
+responseGetUser :: GetUserResponse -> TestTree
+responseGetUser =
+  res
+    "GetUserResponse"
+    "fixture/GetUserResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetUser)
+
+responseGetWorkingLocation :: GetWorkingLocationResponse -> TestTree
+responseGetWorkingLocation =
+  res
+    "GetWorkingLocationResponse"
+    "fixture/GetWorkingLocationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetWorkingLocation)
+
+responseListChangesets :: ListChangesetsResponse -> TestTree
+responseListChangesets =
+  res
+    "ListChangesetsResponse"
+    "fixture/ListChangesetsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListChangesets)
+
+responseListDataViews :: ListDataViewsResponse -> TestTree
+responseListDataViews =
+  res
+    "ListDataViewsResponse"
+    "fixture/ListDataViewsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListDataViews)
+
+responseListDatasets :: ListDatasetsResponse -> TestTree
+responseListDatasets =
+  res
+    "ListDatasetsResponse"
+    "fixture/ListDatasetsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListDatasets)
+
+responseListPermissionGroups :: ListPermissionGroupsResponse -> TestTree
+responseListPermissionGroups =
+  res
+    "ListPermissionGroupsResponse"
+    "fixture/ListPermissionGroupsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListPermissionGroups)
+
+responseListPermissionGroupsByUser :: ListPermissionGroupsByUserResponse -> TestTree
+responseListPermissionGroupsByUser =
+  res
+    "ListPermissionGroupsByUserResponse"
+    "fixture/ListPermissionGroupsByUserResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListPermissionGroupsByUser)
+
+responseListUsers :: ListUsersResponse -> TestTree
+responseListUsers =
+  res
+    "ListUsersResponse"
+    "fixture/ListUsersResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListUsers)
+
+responseListUsersByPermissionGroup :: ListUsersByPermissionGroupResponse -> TestTree
+responseListUsersByPermissionGroup =
+  res
+    "ListUsersByPermissionGroupResponse"
+    "fixture/ListUsersByPermissionGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListUsersByPermissionGroup)
+
+responseResetUserPassword :: ResetUserPasswordResponse -> TestTree
+responseResetUserPassword =
+  res
+    "ResetUserPasswordResponse"
+    "fixture/ResetUserPasswordResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ResetUserPassword)
+
+responseUpdateChangeset :: UpdateChangesetResponse -> TestTree
+responseUpdateChangeset =
+  res
+    "UpdateChangesetResponse"
+    "fixture/UpdateChangesetResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateChangeset)
+
+responseUpdateDataset :: UpdateDatasetResponse -> TestTree
+responseUpdateDataset =
+  res
+    "UpdateDatasetResponse"
+    "fixture/UpdateDatasetResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateDataset)
+
+responseUpdatePermissionGroup :: UpdatePermissionGroupResponse -> TestTree
+responseUpdatePermissionGroup =
+  res
+    "UpdatePermissionGroupResponse"
+    "fixture/UpdatePermissionGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdatePermissionGroup)
+
+responseUpdateUser :: UpdateUserResponse -> TestTree
+responseUpdateUser =
+  res
+    "UpdateUserResponse"
+    "fixture/UpdateUserResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateUser)
