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 Honeycode SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2020-03-01@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-honeycode)
+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.HoneyCode](http://hackage.haskell.org/package/amazonka-honeycode/docs/Amazonka-HoneyCode.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-honeycode` 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-honeycode.cabal b/amazonka-honeycode.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-honeycode.cabal
@@ -0,0 +1,128 @@
+cabal-version:      2.2
+name:               amazonka-honeycode
+version:            2.0
+synopsis:           Amazon Honeycode 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-03-01@ 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.HoneyCode.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.HoneyCode" 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-honeycode
+
+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.HoneyCode
+    Amazonka.HoneyCode.BatchCreateTableRows
+    Amazonka.HoneyCode.BatchDeleteTableRows
+    Amazonka.HoneyCode.BatchUpdateTableRows
+    Amazonka.HoneyCode.BatchUpsertTableRows
+    Amazonka.HoneyCode.DescribeTableDataImportJob
+    Amazonka.HoneyCode.GetScreenData
+    Amazonka.HoneyCode.InvokeScreenAutomation
+    Amazonka.HoneyCode.Lens
+    Amazonka.HoneyCode.ListTableColumns
+    Amazonka.HoneyCode.ListTableRows
+    Amazonka.HoneyCode.ListTables
+    Amazonka.HoneyCode.ListTagsForResource
+    Amazonka.HoneyCode.QueryTableRows
+    Amazonka.HoneyCode.StartTableDataImportJob
+    Amazonka.HoneyCode.TagResource
+    Amazonka.HoneyCode.Types
+    Amazonka.HoneyCode.Types.Cell
+    Amazonka.HoneyCode.Types.CellInput
+    Amazonka.HoneyCode.Types.ColumnMetadata
+    Amazonka.HoneyCode.Types.CreateRowData
+    Amazonka.HoneyCode.Types.DataItem
+    Amazonka.HoneyCode.Types.DelimitedTextImportOptions
+    Amazonka.HoneyCode.Types.DestinationOptions
+    Amazonka.HoneyCode.Types.ErrorCode
+    Amazonka.HoneyCode.Types.FailedBatchItem
+    Amazonka.HoneyCode.Types.Filter
+    Amazonka.HoneyCode.Types.Format
+    Amazonka.HoneyCode.Types.ImportDataCharacterEncoding
+    Amazonka.HoneyCode.Types.ImportDataSource
+    Amazonka.HoneyCode.Types.ImportDataSourceConfig
+    Amazonka.HoneyCode.Types.ImportJobSubmitter
+    Amazonka.HoneyCode.Types.ImportOptions
+    Amazonka.HoneyCode.Types.ImportSourceDataFormat
+    Amazonka.HoneyCode.Types.ResultRow
+    Amazonka.HoneyCode.Types.ResultSet
+    Amazonka.HoneyCode.Types.SourceDataColumnProperties
+    Amazonka.HoneyCode.Types.Table
+    Amazonka.HoneyCode.Types.TableColumn
+    Amazonka.HoneyCode.Types.TableDataImportJobMetadata
+    Amazonka.HoneyCode.Types.TableDataImportJobStatus
+    Amazonka.HoneyCode.Types.TableRow
+    Amazonka.HoneyCode.Types.UpdateRowData
+    Amazonka.HoneyCode.Types.UpsertAction
+    Amazonka.HoneyCode.Types.UpsertRowData
+    Amazonka.HoneyCode.Types.UpsertRowsResult
+    Amazonka.HoneyCode.Types.VariableValue
+    Amazonka.HoneyCode.UntagResource
+    Amazonka.HoneyCode.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-honeycode-test
+  type:             exitcode-stdio-1.0
+  default-language: Haskell2010
+  hs-source-dirs:   test
+  main-is:          Main.hs
+  ghc-options:      -Wall -threaded
+
+  -- This section is encoded by the template and any modules added by
+  -- hand outside these namespaces will not correctly be added to the
+  -- distribution package.
+  other-modules:
+    Test.Amazonka.Gen.HoneyCode
+    Test.Amazonka.HoneyCode
+    Test.Amazonka.HoneyCode.Internal
+
+  build-depends:
+    , amazonka-core         >=2.0 && <2.1
+    , amazonka-honeycode
+    , amazonka-test         >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/BatchCreateTableRows.yaml b/fixture/BatchCreateTableRows.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchCreateTableRows.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/honeycode/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  honeycode.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/BatchCreateTableRowsResponse.proto b/fixture/BatchCreateTableRowsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchCreateTableRowsResponse.proto
diff --git a/fixture/BatchDeleteTableRows.yaml b/fixture/BatchDeleteTableRows.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchDeleteTableRows.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/honeycode/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  honeycode.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/BatchDeleteTableRowsResponse.proto b/fixture/BatchDeleteTableRowsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchDeleteTableRowsResponse.proto
diff --git a/fixture/BatchUpdateTableRows.yaml b/fixture/BatchUpdateTableRows.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchUpdateTableRows.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/honeycode/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  honeycode.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/BatchUpdateTableRowsResponse.proto b/fixture/BatchUpdateTableRowsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchUpdateTableRowsResponse.proto
diff --git a/fixture/BatchUpsertTableRows.yaml b/fixture/BatchUpsertTableRows.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchUpsertTableRows.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/honeycode/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  honeycode.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/BatchUpsertTableRowsResponse.proto b/fixture/BatchUpsertTableRowsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchUpsertTableRowsResponse.proto
diff --git a/fixture/DescribeTableDataImportJob.yaml b/fixture/DescribeTableDataImportJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeTableDataImportJob.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/honeycode/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  honeycode.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/DescribeTableDataImportJobResponse.proto b/fixture/DescribeTableDataImportJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeTableDataImportJobResponse.proto
diff --git a/fixture/GetScreenData.yaml b/fixture/GetScreenData.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetScreenData.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/honeycode/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  honeycode.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/GetScreenDataResponse.proto b/fixture/GetScreenDataResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetScreenDataResponse.proto
diff --git a/fixture/InvokeScreenAutomation.yaml b/fixture/InvokeScreenAutomation.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/InvokeScreenAutomation.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/honeycode/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  honeycode.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/InvokeScreenAutomationResponse.proto b/fixture/InvokeScreenAutomationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/InvokeScreenAutomationResponse.proto
diff --git a/fixture/ListTableColumns.yaml b/fixture/ListTableColumns.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTableColumns.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/honeycode/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  honeycode.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/ListTableColumnsResponse.proto b/fixture/ListTableColumnsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListTableColumnsResponse.proto
diff --git a/fixture/ListTableRows.yaml b/fixture/ListTableRows.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTableRows.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/honeycode/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  honeycode.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/ListTableRowsResponse.proto b/fixture/ListTableRowsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListTableRowsResponse.proto
diff --git a/fixture/ListTables.yaml b/fixture/ListTables.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTables.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/honeycode/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  honeycode.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/ListTablesResponse.proto b/fixture/ListTablesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListTablesResponse.proto
diff --git a/fixture/ListTagsForResource.yaml b/fixture/ListTagsForResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResource.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/honeycode/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  honeycode.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListTagsForResourceResponse.proto b/fixture/ListTagsForResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResourceResponse.proto
diff --git a/fixture/QueryTableRows.yaml b/fixture/QueryTableRows.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/QueryTableRows.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/honeycode/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  honeycode.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/QueryTableRowsResponse.proto b/fixture/QueryTableRowsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/QueryTableRowsResponse.proto
diff --git a/fixture/StartTableDataImportJob.yaml b/fixture/StartTableDataImportJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StartTableDataImportJob.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/honeycode/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  honeycode.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/StartTableDataImportJobResponse.proto b/fixture/StartTableDataImportJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StartTableDataImportJobResponse.proto
diff --git a/fixture/TagResource.yaml b/fixture/TagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/TagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/honeycode/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  honeycode.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/TagResourceResponse.proto b/fixture/TagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/TagResourceResponse.proto
diff --git a/fixture/UntagResource.yaml b/fixture/UntagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/honeycode/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  honeycode.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UntagResourceResponse.proto b/fixture/UntagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResourceResponse.proto
diff --git a/gen/Amazonka/HoneyCode.hs b/gen/Amazonka/HoneyCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode.hs
@@ -0,0 +1,313 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.HoneyCode
+-- 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-03-01@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- Amazon Honeycode is a fully managed service that allows you to quickly
+-- build mobile and web apps for teams—without programming. Build Honeycode
+-- apps for managing almost anything, like projects, customers, operations,
+-- approvals, resources, and even your team.
+module Amazonka.HoneyCode
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** AccessDeniedException
+    _AccessDeniedException,
+
+    -- ** AutomationExecutionException
+    _AutomationExecutionException,
+
+    -- ** AutomationExecutionTimeoutException
+    _AutomationExecutionTimeoutException,
+
+    -- ** InternalServerException
+    _InternalServerException,
+
+    -- ** RequestTimeoutException
+    _RequestTimeoutException,
+
+    -- ** ResourceNotFoundException
+    _ResourceNotFoundException,
+
+    -- ** ServiceQuotaExceededException
+    _ServiceQuotaExceededException,
+
+    -- ** ServiceUnavailableException
+    _ServiceUnavailableException,
+
+    -- ** ThrottlingException
+    _ThrottlingException,
+
+    -- ** ValidationException
+    _ValidationException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** BatchCreateTableRows
+    BatchCreateTableRows (BatchCreateTableRows'),
+    newBatchCreateTableRows,
+    BatchCreateTableRowsResponse (BatchCreateTableRowsResponse'),
+    newBatchCreateTableRowsResponse,
+
+    -- ** BatchDeleteTableRows
+    BatchDeleteTableRows (BatchDeleteTableRows'),
+    newBatchDeleteTableRows,
+    BatchDeleteTableRowsResponse (BatchDeleteTableRowsResponse'),
+    newBatchDeleteTableRowsResponse,
+
+    -- ** BatchUpdateTableRows
+    BatchUpdateTableRows (BatchUpdateTableRows'),
+    newBatchUpdateTableRows,
+    BatchUpdateTableRowsResponse (BatchUpdateTableRowsResponse'),
+    newBatchUpdateTableRowsResponse,
+
+    -- ** BatchUpsertTableRows
+    BatchUpsertTableRows (BatchUpsertTableRows'),
+    newBatchUpsertTableRows,
+    BatchUpsertTableRowsResponse (BatchUpsertTableRowsResponse'),
+    newBatchUpsertTableRowsResponse,
+
+    -- ** DescribeTableDataImportJob
+    DescribeTableDataImportJob (DescribeTableDataImportJob'),
+    newDescribeTableDataImportJob,
+    DescribeTableDataImportJobResponse (DescribeTableDataImportJobResponse'),
+    newDescribeTableDataImportJobResponse,
+
+    -- ** GetScreenData
+    GetScreenData (GetScreenData'),
+    newGetScreenData,
+    GetScreenDataResponse (GetScreenDataResponse'),
+    newGetScreenDataResponse,
+
+    -- ** InvokeScreenAutomation
+    InvokeScreenAutomation (InvokeScreenAutomation'),
+    newInvokeScreenAutomation,
+    InvokeScreenAutomationResponse (InvokeScreenAutomationResponse'),
+    newInvokeScreenAutomationResponse,
+
+    -- ** ListTableColumns (Paginated)
+    ListTableColumns (ListTableColumns'),
+    newListTableColumns,
+    ListTableColumnsResponse (ListTableColumnsResponse'),
+    newListTableColumnsResponse,
+
+    -- ** ListTableRows (Paginated)
+    ListTableRows (ListTableRows'),
+    newListTableRows,
+    ListTableRowsResponse (ListTableRowsResponse'),
+    newListTableRowsResponse,
+
+    -- ** ListTables (Paginated)
+    ListTables (ListTables'),
+    newListTables,
+    ListTablesResponse (ListTablesResponse'),
+    newListTablesResponse,
+
+    -- ** ListTagsForResource
+    ListTagsForResource (ListTagsForResource'),
+    newListTagsForResource,
+    ListTagsForResourceResponse (ListTagsForResourceResponse'),
+    newListTagsForResourceResponse,
+
+    -- ** QueryTableRows (Paginated)
+    QueryTableRows (QueryTableRows'),
+    newQueryTableRows,
+    QueryTableRowsResponse (QueryTableRowsResponse'),
+    newQueryTableRowsResponse,
+
+    -- ** StartTableDataImportJob
+    StartTableDataImportJob (StartTableDataImportJob'),
+    newStartTableDataImportJob,
+    StartTableDataImportJobResponse (StartTableDataImportJobResponse'),
+    newStartTableDataImportJobResponse,
+
+    -- ** TagResource
+    TagResource (TagResource'),
+    newTagResource,
+    TagResourceResponse (TagResourceResponse'),
+    newTagResourceResponse,
+
+    -- ** UntagResource
+    UntagResource (UntagResource'),
+    newUntagResource,
+    UntagResourceResponse (UntagResourceResponse'),
+    newUntagResourceResponse,
+
+    -- * Types
+
+    -- ** ErrorCode
+    ErrorCode (..),
+
+    -- ** Format
+    Format (..),
+
+    -- ** ImportDataCharacterEncoding
+    ImportDataCharacterEncoding (..),
+
+    -- ** ImportSourceDataFormat
+    ImportSourceDataFormat (..),
+
+    -- ** TableDataImportJobStatus
+    TableDataImportJobStatus (..),
+
+    -- ** UpsertAction
+    UpsertAction (..),
+
+    -- ** Cell
+    Cell (Cell'),
+    newCell,
+
+    -- ** CellInput
+    CellInput (CellInput'),
+    newCellInput,
+
+    -- ** ColumnMetadata
+    ColumnMetadata (ColumnMetadata'),
+    newColumnMetadata,
+
+    -- ** CreateRowData
+    CreateRowData (CreateRowData'),
+    newCreateRowData,
+
+    -- ** DataItem
+    DataItem (DataItem'),
+    newDataItem,
+
+    -- ** DelimitedTextImportOptions
+    DelimitedTextImportOptions (DelimitedTextImportOptions'),
+    newDelimitedTextImportOptions,
+
+    -- ** DestinationOptions
+    DestinationOptions (DestinationOptions'),
+    newDestinationOptions,
+
+    -- ** FailedBatchItem
+    FailedBatchItem (FailedBatchItem'),
+    newFailedBatchItem,
+
+    -- ** Filter
+    Filter (Filter'),
+    newFilter,
+
+    -- ** ImportDataSource
+    ImportDataSource (ImportDataSource'),
+    newImportDataSource,
+
+    -- ** ImportDataSourceConfig
+    ImportDataSourceConfig (ImportDataSourceConfig'),
+    newImportDataSourceConfig,
+
+    -- ** ImportJobSubmitter
+    ImportJobSubmitter (ImportJobSubmitter'),
+    newImportJobSubmitter,
+
+    -- ** ImportOptions
+    ImportOptions (ImportOptions'),
+    newImportOptions,
+
+    -- ** ResultRow
+    ResultRow (ResultRow'),
+    newResultRow,
+
+    -- ** ResultSet
+    ResultSet (ResultSet'),
+    newResultSet,
+
+    -- ** SourceDataColumnProperties
+    SourceDataColumnProperties (SourceDataColumnProperties'),
+    newSourceDataColumnProperties,
+
+    -- ** Table
+    Table (Table'),
+    newTable,
+
+    -- ** TableColumn
+    TableColumn (TableColumn'),
+    newTableColumn,
+
+    -- ** TableDataImportJobMetadata
+    TableDataImportJobMetadata (TableDataImportJobMetadata'),
+    newTableDataImportJobMetadata,
+
+    -- ** TableRow
+    TableRow (TableRow'),
+    newTableRow,
+
+    -- ** UpdateRowData
+    UpdateRowData (UpdateRowData'),
+    newUpdateRowData,
+
+    -- ** UpsertRowData
+    UpsertRowData (UpsertRowData'),
+    newUpsertRowData,
+
+    -- ** UpsertRowsResult
+    UpsertRowsResult (UpsertRowsResult'),
+    newUpsertRowsResult,
+
+    -- ** VariableValue
+    VariableValue (VariableValue'),
+    newVariableValue,
+  )
+where
+
+import Amazonka.HoneyCode.BatchCreateTableRows
+import Amazonka.HoneyCode.BatchDeleteTableRows
+import Amazonka.HoneyCode.BatchUpdateTableRows
+import Amazonka.HoneyCode.BatchUpsertTableRows
+import Amazonka.HoneyCode.DescribeTableDataImportJob
+import Amazonka.HoneyCode.GetScreenData
+import Amazonka.HoneyCode.InvokeScreenAutomation
+import Amazonka.HoneyCode.Lens
+import Amazonka.HoneyCode.ListTableColumns
+import Amazonka.HoneyCode.ListTableRows
+import Amazonka.HoneyCode.ListTables
+import Amazonka.HoneyCode.ListTagsForResource
+import Amazonka.HoneyCode.QueryTableRows
+import Amazonka.HoneyCode.StartTableDataImportJob
+import Amazonka.HoneyCode.TagResource
+import Amazonka.HoneyCode.Types
+import Amazonka.HoneyCode.UntagResource
+import Amazonka.HoneyCode.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 'HoneyCode'.
+
+-- $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/HoneyCode/BatchCreateTableRows.hs b/gen/Amazonka/HoneyCode/BatchCreateTableRows.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/BatchCreateTableRows.hs
@@ -0,0 +1,337 @@
+{-# 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.HoneyCode.BatchCreateTableRows
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- The BatchCreateTableRows API allows you to create one or more rows at
+-- the end of a table in a workbook. The API allows you to specify the
+-- values to set in some or all of the columns in the new rows.
+--
+-- If a column is not explicitly set in a specific row, then the column
+-- level formula specified in the table will be applied to the new row. If
+-- there is no column level formula but the last row of the table has a
+-- formula, then that formula will be copied down to the new row. If there
+-- is no column level formula and no formula in the last row of the table,
+-- then that column will be left blank for the new rows.
+module Amazonka.HoneyCode.BatchCreateTableRows
+  ( -- * Creating a Request
+    BatchCreateTableRows (..),
+    newBatchCreateTableRows,
+
+    -- * Request Lenses
+    batchCreateTableRows_clientRequestToken,
+    batchCreateTableRows_workbookId,
+    batchCreateTableRows_tableId,
+    batchCreateTableRows_rowsToCreate,
+
+    -- * Destructuring the Response
+    BatchCreateTableRowsResponse (..),
+    newBatchCreateTableRowsResponse,
+
+    -- * Response Lenses
+    batchCreateTableRowsResponse_failedBatchItems,
+    batchCreateTableRowsResponse_httpStatus,
+    batchCreateTableRowsResponse_workbookCursor,
+    batchCreateTableRowsResponse_createdRows,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newBatchCreateTableRows' smart constructor.
+data BatchCreateTableRows = BatchCreateTableRows'
+  { -- | The request token for performing the batch create operation. Request
+    -- tokens help to identify duplicate requests. If a call times out or fails
+    -- due to a transient error like a failed network connection, you can retry
+    -- the call with the same request token. The service ensures that if the
+    -- first call using that request token is successfully performed, the
+    -- second call will not perform the operation again.
+    --
+    -- Note that request tokens are valid only for a few minutes. You cannot
+    -- use request tokens to dedupe requests spanning hours or days.
+    clientRequestToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the workbook where the new rows are being added.
+    --
+    -- If a workbook with the specified ID could not be found, this API throws
+    -- ResourceNotFoundException.
+    workbookId :: Prelude.Text,
+    -- | The ID of the table where the new rows are being added.
+    --
+    -- If a table with the specified ID could not be found, this API throws
+    -- ResourceNotFoundException.
+    tableId :: Prelude.Text,
+    -- | The list of rows to create at the end of the table. Each item in this
+    -- list needs to have a batch item id to uniquely identify the element in
+    -- the request and the cells to create for that row. You need to specify at
+    -- least one item in this list.
+    --
+    -- Note that if one of the column ids in any of the rows in the request
+    -- does not exist in the table, then the request fails and no updates are
+    -- made to the table.
+    rowsToCreate :: Prelude.NonEmpty CreateRowData
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchCreateTableRows' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientRequestToken', 'batchCreateTableRows_clientRequestToken' - The request token for performing the batch create operation. Request
+-- tokens help to identify duplicate requests. If a call times out or fails
+-- due to a transient error like a failed network connection, you can retry
+-- the call with the same request token. The service ensures that if the
+-- first call using that request token is successfully performed, the
+-- second call will not perform the operation again.
+--
+-- Note that request tokens are valid only for a few minutes. You cannot
+-- use request tokens to dedupe requests spanning hours or days.
+--
+-- 'workbookId', 'batchCreateTableRows_workbookId' - The ID of the workbook where the new rows are being added.
+--
+-- If a workbook with the specified ID could not be found, this API throws
+-- ResourceNotFoundException.
+--
+-- 'tableId', 'batchCreateTableRows_tableId' - The ID of the table where the new rows are being added.
+--
+-- If a table with the specified ID could not be found, this API throws
+-- ResourceNotFoundException.
+--
+-- 'rowsToCreate', 'batchCreateTableRows_rowsToCreate' - The list of rows to create at the end of the table. Each item in this
+-- list needs to have a batch item id to uniquely identify the element in
+-- the request and the cells to create for that row. You need to specify at
+-- least one item in this list.
+--
+-- Note that if one of the column ids in any of the rows in the request
+-- does not exist in the table, then the request fails and no updates are
+-- made to the table.
+newBatchCreateTableRows ::
+  -- | 'workbookId'
+  Prelude.Text ->
+  -- | 'tableId'
+  Prelude.Text ->
+  -- | 'rowsToCreate'
+  Prelude.NonEmpty CreateRowData ->
+  BatchCreateTableRows
+newBatchCreateTableRows
+  pWorkbookId_
+  pTableId_
+  pRowsToCreate_ =
+    BatchCreateTableRows'
+      { clientRequestToken =
+          Prelude.Nothing,
+        workbookId = pWorkbookId_,
+        tableId = pTableId_,
+        rowsToCreate = Lens.coerced Lens.# pRowsToCreate_
+      }
+
+-- | The request token for performing the batch create operation. Request
+-- tokens help to identify duplicate requests. If a call times out or fails
+-- due to a transient error like a failed network connection, you can retry
+-- the call with the same request token. The service ensures that if the
+-- first call using that request token is successfully performed, the
+-- second call will not perform the operation again.
+--
+-- Note that request tokens are valid only for a few minutes. You cannot
+-- use request tokens to dedupe requests spanning hours or days.
+batchCreateTableRows_clientRequestToken :: Lens.Lens' BatchCreateTableRows (Prelude.Maybe Prelude.Text)
+batchCreateTableRows_clientRequestToken = Lens.lens (\BatchCreateTableRows' {clientRequestToken} -> clientRequestToken) (\s@BatchCreateTableRows' {} a -> s {clientRequestToken = a} :: BatchCreateTableRows)
+
+-- | The ID of the workbook where the new rows are being added.
+--
+-- If a workbook with the specified ID could not be found, this API throws
+-- ResourceNotFoundException.
+batchCreateTableRows_workbookId :: Lens.Lens' BatchCreateTableRows Prelude.Text
+batchCreateTableRows_workbookId = Lens.lens (\BatchCreateTableRows' {workbookId} -> workbookId) (\s@BatchCreateTableRows' {} a -> s {workbookId = a} :: BatchCreateTableRows)
+
+-- | The ID of the table where the new rows are being added.
+--
+-- If a table with the specified ID could not be found, this API throws
+-- ResourceNotFoundException.
+batchCreateTableRows_tableId :: Lens.Lens' BatchCreateTableRows Prelude.Text
+batchCreateTableRows_tableId = Lens.lens (\BatchCreateTableRows' {tableId} -> tableId) (\s@BatchCreateTableRows' {} a -> s {tableId = a} :: BatchCreateTableRows)
+
+-- | The list of rows to create at the end of the table. Each item in this
+-- list needs to have a batch item id to uniquely identify the element in
+-- the request and the cells to create for that row. You need to specify at
+-- least one item in this list.
+--
+-- Note that if one of the column ids in any of the rows in the request
+-- does not exist in the table, then the request fails and no updates are
+-- made to the table.
+batchCreateTableRows_rowsToCreate :: Lens.Lens' BatchCreateTableRows (Prelude.NonEmpty CreateRowData)
+batchCreateTableRows_rowsToCreate = Lens.lens (\BatchCreateTableRows' {rowsToCreate} -> rowsToCreate) (\s@BatchCreateTableRows' {} a -> s {rowsToCreate = a} :: BatchCreateTableRows) Prelude.. Lens.coerced
+
+instance Core.AWSRequest BatchCreateTableRows where
+  type
+    AWSResponse BatchCreateTableRows =
+      BatchCreateTableRowsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchCreateTableRowsResponse'
+            Prelude.<$> ( x
+                            Data..?> "failedBatchItems"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "workbookCursor")
+            Prelude.<*> (x Data..?> "createdRows" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable BatchCreateTableRows where
+  hashWithSalt _salt BatchCreateTableRows' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientRequestToken
+      `Prelude.hashWithSalt` workbookId
+      `Prelude.hashWithSalt` tableId
+      `Prelude.hashWithSalt` rowsToCreate
+
+instance Prelude.NFData BatchCreateTableRows where
+  rnf BatchCreateTableRows' {..} =
+    Prelude.rnf clientRequestToken
+      `Prelude.seq` Prelude.rnf workbookId
+      `Prelude.seq` Prelude.rnf tableId
+      `Prelude.seq` Prelude.rnf rowsToCreate
+
+instance Data.ToHeaders BatchCreateTableRows where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON BatchCreateTableRows where
+  toJSON BatchCreateTableRows' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientRequestToken" Data..=)
+              Prelude.<$> clientRequestToken,
+            Prelude.Just ("rowsToCreate" Data..= rowsToCreate)
+          ]
+      )
+
+instance Data.ToPath BatchCreateTableRows where
+  toPath BatchCreateTableRows' {..} =
+    Prelude.mconcat
+      [ "/workbooks/",
+        Data.toBS workbookId,
+        "/tables/",
+        Data.toBS tableId,
+        "/rows/batchcreate"
+      ]
+
+instance Data.ToQuery BatchCreateTableRows where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchCreateTableRowsResponse' smart constructor.
+data BatchCreateTableRowsResponse = BatchCreateTableRowsResponse'
+  { -- | The list of batch items in the request that could not be added to the
+    -- table. Each element in this list contains one item from the request that
+    -- could not be added to the table along with the reason why that item
+    -- could not be added.
+    failedBatchItems :: Prelude.Maybe [FailedBatchItem],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The updated workbook cursor after adding the new rows at the end of the
+    -- table.
+    workbookCursor :: Prelude.Integer,
+    -- | The map of batch item id to the row id that was created for that item.
+    createdRows :: Prelude.HashMap Prelude.Text Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchCreateTableRowsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'failedBatchItems', 'batchCreateTableRowsResponse_failedBatchItems' - The list of batch items in the request that could not be added to the
+-- table. Each element in this list contains one item from the request that
+-- could not be added to the table along with the reason why that item
+-- could not be added.
+--
+-- 'httpStatus', 'batchCreateTableRowsResponse_httpStatus' - The response's http status code.
+--
+-- 'workbookCursor', 'batchCreateTableRowsResponse_workbookCursor' - The updated workbook cursor after adding the new rows at the end of the
+-- table.
+--
+-- 'createdRows', 'batchCreateTableRowsResponse_createdRows' - The map of batch item id to the row id that was created for that item.
+newBatchCreateTableRowsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'workbookCursor'
+  Prelude.Integer ->
+  BatchCreateTableRowsResponse
+newBatchCreateTableRowsResponse
+  pHttpStatus_
+  pWorkbookCursor_ =
+    BatchCreateTableRowsResponse'
+      { failedBatchItems =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        workbookCursor = pWorkbookCursor_,
+        createdRows = Prelude.mempty
+      }
+
+-- | The list of batch items in the request that could not be added to the
+-- table. Each element in this list contains one item from the request that
+-- could not be added to the table along with the reason why that item
+-- could not be added.
+batchCreateTableRowsResponse_failedBatchItems :: Lens.Lens' BatchCreateTableRowsResponse (Prelude.Maybe [FailedBatchItem])
+batchCreateTableRowsResponse_failedBatchItems = Lens.lens (\BatchCreateTableRowsResponse' {failedBatchItems} -> failedBatchItems) (\s@BatchCreateTableRowsResponse' {} a -> s {failedBatchItems = a} :: BatchCreateTableRowsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+batchCreateTableRowsResponse_httpStatus :: Lens.Lens' BatchCreateTableRowsResponse Prelude.Int
+batchCreateTableRowsResponse_httpStatus = Lens.lens (\BatchCreateTableRowsResponse' {httpStatus} -> httpStatus) (\s@BatchCreateTableRowsResponse' {} a -> s {httpStatus = a} :: BatchCreateTableRowsResponse)
+
+-- | The updated workbook cursor after adding the new rows at the end of the
+-- table.
+batchCreateTableRowsResponse_workbookCursor :: Lens.Lens' BatchCreateTableRowsResponse Prelude.Integer
+batchCreateTableRowsResponse_workbookCursor = Lens.lens (\BatchCreateTableRowsResponse' {workbookCursor} -> workbookCursor) (\s@BatchCreateTableRowsResponse' {} a -> s {workbookCursor = a} :: BatchCreateTableRowsResponse)
+
+-- | The map of batch item id to the row id that was created for that item.
+batchCreateTableRowsResponse_createdRows :: Lens.Lens' BatchCreateTableRowsResponse (Prelude.HashMap Prelude.Text Prelude.Text)
+batchCreateTableRowsResponse_createdRows = Lens.lens (\BatchCreateTableRowsResponse' {createdRows} -> createdRows) (\s@BatchCreateTableRowsResponse' {} a -> s {createdRows = a} :: BatchCreateTableRowsResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData BatchCreateTableRowsResponse where
+  rnf BatchCreateTableRowsResponse' {..} =
+    Prelude.rnf failedBatchItems
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf workbookCursor
+      `Prelude.seq` Prelude.rnf createdRows
diff --git a/gen/Amazonka/HoneyCode/BatchDeleteTableRows.hs b/gen/Amazonka/HoneyCode/BatchDeleteTableRows.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/BatchDeleteTableRows.hs
@@ -0,0 +1,309 @@
+{-# 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.HoneyCode.BatchDeleteTableRows
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- The BatchDeleteTableRows API allows you to delete one or more rows from
+-- a table in a workbook. You need to specify the ids of the rows that you
+-- want to delete from the table.
+module Amazonka.HoneyCode.BatchDeleteTableRows
+  ( -- * Creating a Request
+    BatchDeleteTableRows (..),
+    newBatchDeleteTableRows,
+
+    -- * Request Lenses
+    batchDeleteTableRows_clientRequestToken,
+    batchDeleteTableRows_workbookId,
+    batchDeleteTableRows_tableId,
+    batchDeleteTableRows_rowIds,
+
+    -- * Destructuring the Response
+    BatchDeleteTableRowsResponse (..),
+    newBatchDeleteTableRowsResponse,
+
+    -- * Response Lenses
+    batchDeleteTableRowsResponse_failedBatchItems,
+    batchDeleteTableRowsResponse_httpStatus,
+    batchDeleteTableRowsResponse_workbookCursor,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newBatchDeleteTableRows' smart constructor.
+data BatchDeleteTableRows = BatchDeleteTableRows'
+  { -- | The request token for performing the delete action. Request tokens help
+    -- to identify duplicate requests. If a call times out or fails due to a
+    -- transient error like a failed network connection, you can retry the call
+    -- with the same request token. The service ensures that if the first call
+    -- using that request token is successfully performed, the second call will
+    -- not perform the action again.
+    --
+    -- Note that request tokens are valid only for a few minutes. You cannot
+    -- use request tokens to dedupe requests spanning hours or days.
+    clientRequestToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the workbook where the rows are being deleted.
+    --
+    -- If a workbook with the specified id could not be found, this API throws
+    -- ResourceNotFoundException.
+    workbookId :: Prelude.Text,
+    -- | The ID of the table where the rows are being deleted.
+    --
+    -- If a table with the specified id could not be found, this API throws
+    -- ResourceNotFoundException.
+    tableId :: Prelude.Text,
+    -- | The list of row ids to delete from the table. You need to specify at
+    -- least one row id in this list.
+    --
+    -- Note that if one of the row ids provided in the request does not exist
+    -- in the table, then the request fails and no rows are deleted from the
+    -- table.
+    rowIds :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchDeleteTableRows' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientRequestToken', 'batchDeleteTableRows_clientRequestToken' - The request token for performing the delete action. Request tokens help
+-- to identify duplicate requests. If a call times out or fails due to a
+-- transient error like a failed network connection, you can retry the call
+-- with the same request token. The service ensures that if the first call
+-- using that request token is successfully performed, the second call will
+-- not perform the action again.
+--
+-- Note that request tokens are valid only for a few minutes. You cannot
+-- use request tokens to dedupe requests spanning hours or days.
+--
+-- 'workbookId', 'batchDeleteTableRows_workbookId' - The ID of the workbook where the rows are being deleted.
+--
+-- If a workbook with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+--
+-- 'tableId', 'batchDeleteTableRows_tableId' - The ID of the table where the rows are being deleted.
+--
+-- If a table with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+--
+-- 'rowIds', 'batchDeleteTableRows_rowIds' - The list of row ids to delete from the table. You need to specify at
+-- least one row id in this list.
+--
+-- Note that if one of the row ids provided in the request does not exist
+-- in the table, then the request fails and no rows are deleted from the
+-- table.
+newBatchDeleteTableRows ::
+  -- | 'workbookId'
+  Prelude.Text ->
+  -- | 'tableId'
+  Prelude.Text ->
+  -- | 'rowIds'
+  Prelude.NonEmpty Prelude.Text ->
+  BatchDeleteTableRows
+newBatchDeleteTableRows
+  pWorkbookId_
+  pTableId_
+  pRowIds_ =
+    BatchDeleteTableRows'
+      { clientRequestToken =
+          Prelude.Nothing,
+        workbookId = pWorkbookId_,
+        tableId = pTableId_,
+        rowIds = Lens.coerced Lens.# pRowIds_
+      }
+
+-- | The request token for performing the delete action. Request tokens help
+-- to identify duplicate requests. If a call times out or fails due to a
+-- transient error like a failed network connection, you can retry the call
+-- with the same request token. The service ensures that if the first call
+-- using that request token is successfully performed, the second call will
+-- not perform the action again.
+--
+-- Note that request tokens are valid only for a few minutes. You cannot
+-- use request tokens to dedupe requests spanning hours or days.
+batchDeleteTableRows_clientRequestToken :: Lens.Lens' BatchDeleteTableRows (Prelude.Maybe Prelude.Text)
+batchDeleteTableRows_clientRequestToken = Lens.lens (\BatchDeleteTableRows' {clientRequestToken} -> clientRequestToken) (\s@BatchDeleteTableRows' {} a -> s {clientRequestToken = a} :: BatchDeleteTableRows)
+
+-- | The ID of the workbook where the rows are being deleted.
+--
+-- If a workbook with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+batchDeleteTableRows_workbookId :: Lens.Lens' BatchDeleteTableRows Prelude.Text
+batchDeleteTableRows_workbookId = Lens.lens (\BatchDeleteTableRows' {workbookId} -> workbookId) (\s@BatchDeleteTableRows' {} a -> s {workbookId = a} :: BatchDeleteTableRows)
+
+-- | The ID of the table where the rows are being deleted.
+--
+-- If a table with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+batchDeleteTableRows_tableId :: Lens.Lens' BatchDeleteTableRows Prelude.Text
+batchDeleteTableRows_tableId = Lens.lens (\BatchDeleteTableRows' {tableId} -> tableId) (\s@BatchDeleteTableRows' {} a -> s {tableId = a} :: BatchDeleteTableRows)
+
+-- | The list of row ids to delete from the table. You need to specify at
+-- least one row id in this list.
+--
+-- Note that if one of the row ids provided in the request does not exist
+-- in the table, then the request fails and no rows are deleted from the
+-- table.
+batchDeleteTableRows_rowIds :: Lens.Lens' BatchDeleteTableRows (Prelude.NonEmpty Prelude.Text)
+batchDeleteTableRows_rowIds = Lens.lens (\BatchDeleteTableRows' {rowIds} -> rowIds) (\s@BatchDeleteTableRows' {} a -> s {rowIds = a} :: BatchDeleteTableRows) Prelude.. Lens.coerced
+
+instance Core.AWSRequest BatchDeleteTableRows where
+  type
+    AWSResponse BatchDeleteTableRows =
+      BatchDeleteTableRowsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchDeleteTableRowsResponse'
+            Prelude.<$> ( x
+                            Data..?> "failedBatchItems"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "workbookCursor")
+      )
+
+instance Prelude.Hashable BatchDeleteTableRows where
+  hashWithSalt _salt BatchDeleteTableRows' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientRequestToken
+      `Prelude.hashWithSalt` workbookId
+      `Prelude.hashWithSalt` tableId
+      `Prelude.hashWithSalt` rowIds
+
+instance Prelude.NFData BatchDeleteTableRows where
+  rnf BatchDeleteTableRows' {..} =
+    Prelude.rnf clientRequestToken
+      `Prelude.seq` Prelude.rnf workbookId
+      `Prelude.seq` Prelude.rnf tableId
+      `Prelude.seq` Prelude.rnf rowIds
+
+instance Data.ToHeaders BatchDeleteTableRows where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON BatchDeleteTableRows where
+  toJSON BatchDeleteTableRows' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientRequestToken" Data..=)
+              Prelude.<$> clientRequestToken,
+            Prelude.Just ("rowIds" Data..= rowIds)
+          ]
+      )
+
+instance Data.ToPath BatchDeleteTableRows where
+  toPath BatchDeleteTableRows' {..} =
+    Prelude.mconcat
+      [ "/workbooks/",
+        Data.toBS workbookId,
+        "/tables/",
+        Data.toBS tableId,
+        "/rows/batchdelete"
+      ]
+
+instance Data.ToQuery BatchDeleteTableRows where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchDeleteTableRowsResponse' smart constructor.
+data BatchDeleteTableRowsResponse = BatchDeleteTableRowsResponse'
+  { -- | The list of row ids in the request that could not be deleted from the
+    -- table. Each element in this list contains one row id from the request
+    -- that could not be deleted along with the reason why that item could not
+    -- be deleted.
+    failedBatchItems :: Prelude.Maybe [FailedBatchItem],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The updated workbook cursor after deleting the rows from the table.
+    workbookCursor :: Prelude.Integer
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchDeleteTableRowsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'failedBatchItems', 'batchDeleteTableRowsResponse_failedBatchItems' - The list of row ids in the request that could not be deleted from the
+-- table. Each element in this list contains one row id from the request
+-- that could not be deleted along with the reason why that item could not
+-- be deleted.
+--
+-- 'httpStatus', 'batchDeleteTableRowsResponse_httpStatus' - The response's http status code.
+--
+-- 'workbookCursor', 'batchDeleteTableRowsResponse_workbookCursor' - The updated workbook cursor after deleting the rows from the table.
+newBatchDeleteTableRowsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'workbookCursor'
+  Prelude.Integer ->
+  BatchDeleteTableRowsResponse
+newBatchDeleteTableRowsResponse
+  pHttpStatus_
+  pWorkbookCursor_ =
+    BatchDeleteTableRowsResponse'
+      { failedBatchItems =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        workbookCursor = pWorkbookCursor_
+      }
+
+-- | The list of row ids in the request that could not be deleted from the
+-- table. Each element in this list contains one row id from the request
+-- that could not be deleted along with the reason why that item could not
+-- be deleted.
+batchDeleteTableRowsResponse_failedBatchItems :: Lens.Lens' BatchDeleteTableRowsResponse (Prelude.Maybe [FailedBatchItem])
+batchDeleteTableRowsResponse_failedBatchItems = Lens.lens (\BatchDeleteTableRowsResponse' {failedBatchItems} -> failedBatchItems) (\s@BatchDeleteTableRowsResponse' {} a -> s {failedBatchItems = a} :: BatchDeleteTableRowsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+batchDeleteTableRowsResponse_httpStatus :: Lens.Lens' BatchDeleteTableRowsResponse Prelude.Int
+batchDeleteTableRowsResponse_httpStatus = Lens.lens (\BatchDeleteTableRowsResponse' {httpStatus} -> httpStatus) (\s@BatchDeleteTableRowsResponse' {} a -> s {httpStatus = a} :: BatchDeleteTableRowsResponse)
+
+-- | The updated workbook cursor after deleting the rows from the table.
+batchDeleteTableRowsResponse_workbookCursor :: Lens.Lens' BatchDeleteTableRowsResponse Prelude.Integer
+batchDeleteTableRowsResponse_workbookCursor = Lens.lens (\BatchDeleteTableRowsResponse' {workbookCursor} -> workbookCursor) (\s@BatchDeleteTableRowsResponse' {} a -> s {workbookCursor = a} :: BatchDeleteTableRowsResponse)
+
+instance Prelude.NFData BatchDeleteTableRowsResponse where
+  rnf BatchDeleteTableRowsResponse' {..} =
+    Prelude.rnf failedBatchItems
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf workbookCursor
diff --git a/gen/Amazonka/HoneyCode/BatchUpdateTableRows.hs b/gen/Amazonka/HoneyCode/BatchUpdateTableRows.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/BatchUpdateTableRows.hs
@@ -0,0 +1,326 @@
+{-# 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.HoneyCode.BatchUpdateTableRows
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- The BatchUpdateTableRows API allows you to update one or more rows in a
+-- table in a workbook.
+--
+-- You can specify the values to set in some or all of the columns in the
+-- table for the specified rows. If a column is not explicitly specified in
+-- a particular row, then that column will not be updated for that row. To
+-- clear out the data in a specific cell, you need to set the value as an
+-- empty string (\"\").
+module Amazonka.HoneyCode.BatchUpdateTableRows
+  ( -- * Creating a Request
+    BatchUpdateTableRows (..),
+    newBatchUpdateTableRows,
+
+    -- * Request Lenses
+    batchUpdateTableRows_clientRequestToken,
+    batchUpdateTableRows_workbookId,
+    batchUpdateTableRows_tableId,
+    batchUpdateTableRows_rowsToUpdate,
+
+    -- * Destructuring the Response
+    BatchUpdateTableRowsResponse (..),
+    newBatchUpdateTableRowsResponse,
+
+    -- * Response Lenses
+    batchUpdateTableRowsResponse_failedBatchItems,
+    batchUpdateTableRowsResponse_httpStatus,
+    batchUpdateTableRowsResponse_workbookCursor,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newBatchUpdateTableRows' smart constructor.
+data BatchUpdateTableRows = BatchUpdateTableRows'
+  { -- | The request token for performing the update action. Request tokens help
+    -- to identify duplicate requests. If a call times out or fails due to a
+    -- transient error like a failed network connection, you can retry the call
+    -- with the same request token. The service ensures that if the first call
+    -- using that request token is successfully performed, the second call will
+    -- not perform the action again.
+    --
+    -- Note that request tokens are valid only for a few minutes. You cannot
+    -- use request tokens to dedupe requests spanning hours or days.
+    clientRequestToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the workbook where the rows are being updated.
+    --
+    -- If a workbook with the specified id could not be found, this API throws
+    -- ResourceNotFoundException.
+    workbookId :: Prelude.Text,
+    -- | The ID of the table where the rows are being updated.
+    --
+    -- If a table with the specified id could not be found, this API throws
+    -- ResourceNotFoundException.
+    tableId :: Prelude.Text,
+    -- | The list of rows to update in the table. Each item in this list needs to
+    -- contain the row id to update along with the map of column id to cell
+    -- values for each column in that row that needs to be updated. You need to
+    -- specify at least one row in this list, and for each row, you need to
+    -- specify at least one column to update.
+    --
+    -- Note that if one of the row or column ids in the request does not exist
+    -- in the table, then the request fails and no updates are made to the
+    -- table.
+    rowsToUpdate :: Prelude.NonEmpty UpdateRowData
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchUpdateTableRows' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientRequestToken', 'batchUpdateTableRows_clientRequestToken' - The request token for performing the update action. Request tokens help
+-- to identify duplicate requests. If a call times out or fails due to a
+-- transient error like a failed network connection, you can retry the call
+-- with the same request token. The service ensures that if the first call
+-- using that request token is successfully performed, the second call will
+-- not perform the action again.
+--
+-- Note that request tokens are valid only for a few minutes. You cannot
+-- use request tokens to dedupe requests spanning hours or days.
+--
+-- 'workbookId', 'batchUpdateTableRows_workbookId' - The ID of the workbook where the rows are being updated.
+--
+-- If a workbook with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+--
+-- 'tableId', 'batchUpdateTableRows_tableId' - The ID of the table where the rows are being updated.
+--
+-- If a table with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+--
+-- 'rowsToUpdate', 'batchUpdateTableRows_rowsToUpdate' - The list of rows to update in the table. Each item in this list needs to
+-- contain the row id to update along with the map of column id to cell
+-- values for each column in that row that needs to be updated. You need to
+-- specify at least one row in this list, and for each row, you need to
+-- specify at least one column to update.
+--
+-- Note that if one of the row or column ids in the request does not exist
+-- in the table, then the request fails and no updates are made to the
+-- table.
+newBatchUpdateTableRows ::
+  -- | 'workbookId'
+  Prelude.Text ->
+  -- | 'tableId'
+  Prelude.Text ->
+  -- | 'rowsToUpdate'
+  Prelude.NonEmpty UpdateRowData ->
+  BatchUpdateTableRows
+newBatchUpdateTableRows
+  pWorkbookId_
+  pTableId_
+  pRowsToUpdate_ =
+    BatchUpdateTableRows'
+      { clientRequestToken =
+          Prelude.Nothing,
+        workbookId = pWorkbookId_,
+        tableId = pTableId_,
+        rowsToUpdate = Lens.coerced Lens.# pRowsToUpdate_
+      }
+
+-- | The request token for performing the update action. Request tokens help
+-- to identify duplicate requests. If a call times out or fails due to a
+-- transient error like a failed network connection, you can retry the call
+-- with the same request token. The service ensures that if the first call
+-- using that request token is successfully performed, the second call will
+-- not perform the action again.
+--
+-- Note that request tokens are valid only for a few minutes. You cannot
+-- use request tokens to dedupe requests spanning hours or days.
+batchUpdateTableRows_clientRequestToken :: Lens.Lens' BatchUpdateTableRows (Prelude.Maybe Prelude.Text)
+batchUpdateTableRows_clientRequestToken = Lens.lens (\BatchUpdateTableRows' {clientRequestToken} -> clientRequestToken) (\s@BatchUpdateTableRows' {} a -> s {clientRequestToken = a} :: BatchUpdateTableRows)
+
+-- | The ID of the workbook where the rows are being updated.
+--
+-- If a workbook with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+batchUpdateTableRows_workbookId :: Lens.Lens' BatchUpdateTableRows Prelude.Text
+batchUpdateTableRows_workbookId = Lens.lens (\BatchUpdateTableRows' {workbookId} -> workbookId) (\s@BatchUpdateTableRows' {} a -> s {workbookId = a} :: BatchUpdateTableRows)
+
+-- | The ID of the table where the rows are being updated.
+--
+-- If a table with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+batchUpdateTableRows_tableId :: Lens.Lens' BatchUpdateTableRows Prelude.Text
+batchUpdateTableRows_tableId = Lens.lens (\BatchUpdateTableRows' {tableId} -> tableId) (\s@BatchUpdateTableRows' {} a -> s {tableId = a} :: BatchUpdateTableRows)
+
+-- | The list of rows to update in the table. Each item in this list needs to
+-- contain the row id to update along with the map of column id to cell
+-- values for each column in that row that needs to be updated. You need to
+-- specify at least one row in this list, and for each row, you need to
+-- specify at least one column to update.
+--
+-- Note that if one of the row or column ids in the request does not exist
+-- in the table, then the request fails and no updates are made to the
+-- table.
+batchUpdateTableRows_rowsToUpdate :: Lens.Lens' BatchUpdateTableRows (Prelude.NonEmpty UpdateRowData)
+batchUpdateTableRows_rowsToUpdate = Lens.lens (\BatchUpdateTableRows' {rowsToUpdate} -> rowsToUpdate) (\s@BatchUpdateTableRows' {} a -> s {rowsToUpdate = a} :: BatchUpdateTableRows) Prelude.. Lens.coerced
+
+instance Core.AWSRequest BatchUpdateTableRows where
+  type
+    AWSResponse BatchUpdateTableRows =
+      BatchUpdateTableRowsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchUpdateTableRowsResponse'
+            Prelude.<$> ( x
+                            Data..?> "failedBatchItems"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "workbookCursor")
+      )
+
+instance Prelude.Hashable BatchUpdateTableRows where
+  hashWithSalt _salt BatchUpdateTableRows' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientRequestToken
+      `Prelude.hashWithSalt` workbookId
+      `Prelude.hashWithSalt` tableId
+      `Prelude.hashWithSalt` rowsToUpdate
+
+instance Prelude.NFData BatchUpdateTableRows where
+  rnf BatchUpdateTableRows' {..} =
+    Prelude.rnf clientRequestToken
+      `Prelude.seq` Prelude.rnf workbookId
+      `Prelude.seq` Prelude.rnf tableId
+      `Prelude.seq` Prelude.rnf rowsToUpdate
+
+instance Data.ToHeaders BatchUpdateTableRows where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON BatchUpdateTableRows where
+  toJSON BatchUpdateTableRows' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientRequestToken" Data..=)
+              Prelude.<$> clientRequestToken,
+            Prelude.Just ("rowsToUpdate" Data..= rowsToUpdate)
+          ]
+      )
+
+instance Data.ToPath BatchUpdateTableRows where
+  toPath BatchUpdateTableRows' {..} =
+    Prelude.mconcat
+      [ "/workbooks/",
+        Data.toBS workbookId,
+        "/tables/",
+        Data.toBS tableId,
+        "/rows/batchupdate"
+      ]
+
+instance Data.ToQuery BatchUpdateTableRows where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchUpdateTableRowsResponse' smart constructor.
+data BatchUpdateTableRowsResponse = BatchUpdateTableRowsResponse'
+  { -- | The list of batch items in the request that could not be updated in the
+    -- table. Each element in this list contains one item from the request that
+    -- could not be updated in the table along with the reason why that item
+    -- could not be updated.
+    failedBatchItems :: Prelude.Maybe [FailedBatchItem],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The updated workbook cursor after adding the new rows at the end of the
+    -- table.
+    workbookCursor :: Prelude.Integer
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchUpdateTableRowsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'failedBatchItems', 'batchUpdateTableRowsResponse_failedBatchItems' - The list of batch items in the request that could not be updated in the
+-- table. Each element in this list contains one item from the request that
+-- could not be updated in the table along with the reason why that item
+-- could not be updated.
+--
+-- 'httpStatus', 'batchUpdateTableRowsResponse_httpStatus' - The response's http status code.
+--
+-- 'workbookCursor', 'batchUpdateTableRowsResponse_workbookCursor' - The updated workbook cursor after adding the new rows at the end of the
+-- table.
+newBatchUpdateTableRowsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'workbookCursor'
+  Prelude.Integer ->
+  BatchUpdateTableRowsResponse
+newBatchUpdateTableRowsResponse
+  pHttpStatus_
+  pWorkbookCursor_ =
+    BatchUpdateTableRowsResponse'
+      { failedBatchItems =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        workbookCursor = pWorkbookCursor_
+      }
+
+-- | The list of batch items in the request that could not be updated in the
+-- table. Each element in this list contains one item from the request that
+-- could not be updated in the table along with the reason why that item
+-- could not be updated.
+batchUpdateTableRowsResponse_failedBatchItems :: Lens.Lens' BatchUpdateTableRowsResponse (Prelude.Maybe [FailedBatchItem])
+batchUpdateTableRowsResponse_failedBatchItems = Lens.lens (\BatchUpdateTableRowsResponse' {failedBatchItems} -> failedBatchItems) (\s@BatchUpdateTableRowsResponse' {} a -> s {failedBatchItems = a} :: BatchUpdateTableRowsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+batchUpdateTableRowsResponse_httpStatus :: Lens.Lens' BatchUpdateTableRowsResponse Prelude.Int
+batchUpdateTableRowsResponse_httpStatus = Lens.lens (\BatchUpdateTableRowsResponse' {httpStatus} -> httpStatus) (\s@BatchUpdateTableRowsResponse' {} a -> s {httpStatus = a} :: BatchUpdateTableRowsResponse)
+
+-- | The updated workbook cursor after adding the new rows at the end of the
+-- table.
+batchUpdateTableRowsResponse_workbookCursor :: Lens.Lens' BatchUpdateTableRowsResponse Prelude.Integer
+batchUpdateTableRowsResponse_workbookCursor = Lens.lens (\BatchUpdateTableRowsResponse' {workbookCursor} -> workbookCursor) (\s@BatchUpdateTableRowsResponse' {} a -> s {workbookCursor = a} :: BatchUpdateTableRowsResponse)
+
+instance Prelude.NFData BatchUpdateTableRowsResponse where
+  rnf BatchUpdateTableRowsResponse' {..} =
+    Prelude.rnf failedBatchItems
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf workbookCursor
diff --git a/gen/Amazonka/HoneyCode/BatchUpsertTableRows.hs b/gen/Amazonka/HoneyCode/BatchUpsertTableRows.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/BatchUpsertTableRows.hs
@@ -0,0 +1,350 @@
+{-# 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.HoneyCode.BatchUpsertTableRows
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- The BatchUpsertTableRows API allows you to upsert one or more rows in a
+-- table. The upsert operation takes a filter expression as input and
+-- evaluates it to find matching rows on the destination table. If matching
+-- rows are found, it will update the cells in the matching rows to new
+-- values specified in the request. If no matching rows are found, a new
+-- row is added at the end of the table and the cells in that row are set
+-- to the new values specified in the request.
+--
+-- You can specify the values to set in some or all of the columns in the
+-- table for the matching or newly appended rows. If a column is not
+-- explicitly specified for a particular row, then that column will not be
+-- updated for that row. To clear out the data in a specific cell, you need
+-- to set the value as an empty string (\"\").
+module Amazonka.HoneyCode.BatchUpsertTableRows
+  ( -- * Creating a Request
+    BatchUpsertTableRows (..),
+    newBatchUpsertTableRows,
+
+    -- * Request Lenses
+    batchUpsertTableRows_clientRequestToken,
+    batchUpsertTableRows_workbookId,
+    batchUpsertTableRows_tableId,
+    batchUpsertTableRows_rowsToUpsert,
+
+    -- * Destructuring the Response
+    BatchUpsertTableRowsResponse (..),
+    newBatchUpsertTableRowsResponse,
+
+    -- * Response Lenses
+    batchUpsertTableRowsResponse_failedBatchItems,
+    batchUpsertTableRowsResponse_httpStatus,
+    batchUpsertTableRowsResponse_rows,
+    batchUpsertTableRowsResponse_workbookCursor,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newBatchUpsertTableRows' smart constructor.
+data BatchUpsertTableRows = BatchUpsertTableRows'
+  { -- | The request token for performing the update action. Request tokens help
+    -- to identify duplicate requests. If a call times out or fails due to a
+    -- transient error like a failed network connection, you can retry the call
+    -- with the same request token. The service ensures that if the first call
+    -- using that request token is successfully performed, the second call will
+    -- not perform the action again.
+    --
+    -- Note that request tokens are valid only for a few minutes. You cannot
+    -- use request tokens to dedupe requests spanning hours or days.
+    clientRequestToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the workbook where the rows are being upserted.
+    --
+    -- If a workbook with the specified id could not be found, this API throws
+    -- ResourceNotFoundException.
+    workbookId :: Prelude.Text,
+    -- | The ID of the table where the rows are being upserted.
+    --
+    -- If a table with the specified id could not be found, this API throws
+    -- ResourceNotFoundException.
+    tableId :: Prelude.Text,
+    -- | The list of rows to upsert in the table. Each item in this list needs to
+    -- have a batch item id to uniquely identify the element in the request, a
+    -- filter expression to find the rows to update for that element and the
+    -- cell values to set for each column in the upserted rows. You need to
+    -- specify at least one item in this list.
+    --
+    -- Note that if one of the filter formulas in the request fails to evaluate
+    -- because of an error or one of the column ids in any of the rows does not
+    -- exist in the table, then the request fails and no updates are made to
+    -- the table.
+    rowsToUpsert :: [UpsertRowData]
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchUpsertTableRows' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientRequestToken', 'batchUpsertTableRows_clientRequestToken' - The request token for performing the update action. Request tokens help
+-- to identify duplicate requests. If a call times out or fails due to a
+-- transient error like a failed network connection, you can retry the call
+-- with the same request token. The service ensures that if the first call
+-- using that request token is successfully performed, the second call will
+-- not perform the action again.
+--
+-- Note that request tokens are valid only for a few minutes. You cannot
+-- use request tokens to dedupe requests spanning hours or days.
+--
+-- 'workbookId', 'batchUpsertTableRows_workbookId' - The ID of the workbook where the rows are being upserted.
+--
+-- If a workbook with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+--
+-- 'tableId', 'batchUpsertTableRows_tableId' - The ID of the table where the rows are being upserted.
+--
+-- If a table with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+--
+-- 'rowsToUpsert', 'batchUpsertTableRows_rowsToUpsert' - The list of rows to upsert in the table. Each item in this list needs to
+-- have a batch item id to uniquely identify the element in the request, a
+-- filter expression to find the rows to update for that element and the
+-- cell values to set for each column in the upserted rows. You need to
+-- specify at least one item in this list.
+--
+-- Note that if one of the filter formulas in the request fails to evaluate
+-- because of an error or one of the column ids in any of the rows does not
+-- exist in the table, then the request fails and no updates are made to
+-- the table.
+newBatchUpsertTableRows ::
+  -- | 'workbookId'
+  Prelude.Text ->
+  -- | 'tableId'
+  Prelude.Text ->
+  BatchUpsertTableRows
+newBatchUpsertTableRows pWorkbookId_ pTableId_ =
+  BatchUpsertTableRows'
+    { clientRequestToken =
+        Prelude.Nothing,
+      workbookId = pWorkbookId_,
+      tableId = pTableId_,
+      rowsToUpsert = Prelude.mempty
+    }
+
+-- | The request token for performing the update action. Request tokens help
+-- to identify duplicate requests. If a call times out or fails due to a
+-- transient error like a failed network connection, you can retry the call
+-- with the same request token. The service ensures that if the first call
+-- using that request token is successfully performed, the second call will
+-- not perform the action again.
+--
+-- Note that request tokens are valid only for a few minutes. You cannot
+-- use request tokens to dedupe requests spanning hours or days.
+batchUpsertTableRows_clientRequestToken :: Lens.Lens' BatchUpsertTableRows (Prelude.Maybe Prelude.Text)
+batchUpsertTableRows_clientRequestToken = Lens.lens (\BatchUpsertTableRows' {clientRequestToken} -> clientRequestToken) (\s@BatchUpsertTableRows' {} a -> s {clientRequestToken = a} :: BatchUpsertTableRows)
+
+-- | The ID of the workbook where the rows are being upserted.
+--
+-- If a workbook with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+batchUpsertTableRows_workbookId :: Lens.Lens' BatchUpsertTableRows Prelude.Text
+batchUpsertTableRows_workbookId = Lens.lens (\BatchUpsertTableRows' {workbookId} -> workbookId) (\s@BatchUpsertTableRows' {} a -> s {workbookId = a} :: BatchUpsertTableRows)
+
+-- | The ID of the table where the rows are being upserted.
+--
+-- If a table with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+batchUpsertTableRows_tableId :: Lens.Lens' BatchUpsertTableRows Prelude.Text
+batchUpsertTableRows_tableId = Lens.lens (\BatchUpsertTableRows' {tableId} -> tableId) (\s@BatchUpsertTableRows' {} a -> s {tableId = a} :: BatchUpsertTableRows)
+
+-- | The list of rows to upsert in the table. Each item in this list needs to
+-- have a batch item id to uniquely identify the element in the request, a
+-- filter expression to find the rows to update for that element and the
+-- cell values to set for each column in the upserted rows. You need to
+-- specify at least one item in this list.
+--
+-- Note that if one of the filter formulas in the request fails to evaluate
+-- because of an error or one of the column ids in any of the rows does not
+-- exist in the table, then the request fails and no updates are made to
+-- the table.
+batchUpsertTableRows_rowsToUpsert :: Lens.Lens' BatchUpsertTableRows [UpsertRowData]
+batchUpsertTableRows_rowsToUpsert = Lens.lens (\BatchUpsertTableRows' {rowsToUpsert} -> rowsToUpsert) (\s@BatchUpsertTableRows' {} a -> s {rowsToUpsert = a} :: BatchUpsertTableRows) Prelude.. Lens.coerced
+
+instance Core.AWSRequest BatchUpsertTableRows where
+  type
+    AWSResponse BatchUpsertTableRows =
+      BatchUpsertTableRowsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchUpsertTableRowsResponse'
+            Prelude.<$> ( x
+                            Data..?> "failedBatchItems"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "rows" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..:> "workbookCursor")
+      )
+
+instance Prelude.Hashable BatchUpsertTableRows where
+  hashWithSalt _salt BatchUpsertTableRows' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientRequestToken
+      `Prelude.hashWithSalt` workbookId
+      `Prelude.hashWithSalt` tableId
+      `Prelude.hashWithSalt` rowsToUpsert
+
+instance Prelude.NFData BatchUpsertTableRows where
+  rnf BatchUpsertTableRows' {..} =
+    Prelude.rnf clientRequestToken
+      `Prelude.seq` Prelude.rnf workbookId
+      `Prelude.seq` Prelude.rnf tableId
+      `Prelude.seq` Prelude.rnf rowsToUpsert
+
+instance Data.ToHeaders BatchUpsertTableRows where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON BatchUpsertTableRows where
+  toJSON BatchUpsertTableRows' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientRequestToken" Data..=)
+              Prelude.<$> clientRequestToken,
+            Prelude.Just ("rowsToUpsert" Data..= rowsToUpsert)
+          ]
+      )
+
+instance Data.ToPath BatchUpsertTableRows where
+  toPath BatchUpsertTableRows' {..} =
+    Prelude.mconcat
+      [ "/workbooks/",
+        Data.toBS workbookId,
+        "/tables/",
+        Data.toBS tableId,
+        "/rows/batchupsert"
+      ]
+
+instance Data.ToQuery BatchUpsertTableRows where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchUpsertTableRowsResponse' smart constructor.
+data BatchUpsertTableRowsResponse = BatchUpsertTableRowsResponse'
+  { -- | The list of batch items in the request that could not be updated or
+    -- appended in the table. Each element in this list contains one item from
+    -- the request that could not be updated in the table along with the reason
+    -- why that item could not be updated or appended.
+    failedBatchItems :: Prelude.Maybe [FailedBatchItem],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A map with the batch item id as the key and the result of the upsert
+    -- operation as the value. The result of the upsert operation specifies
+    -- whether existing rows were updated or a new row was appended, along with
+    -- the list of row ids that were affected.
+    rows :: Prelude.HashMap Prelude.Text UpsertRowsResult,
+    -- | The updated workbook cursor after updating or appending rows in the
+    -- table.
+    workbookCursor :: Prelude.Integer
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchUpsertTableRowsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'failedBatchItems', 'batchUpsertTableRowsResponse_failedBatchItems' - The list of batch items in the request that could not be updated or
+-- appended in the table. Each element in this list contains one item from
+-- the request that could not be updated in the table along with the reason
+-- why that item could not be updated or appended.
+--
+-- 'httpStatus', 'batchUpsertTableRowsResponse_httpStatus' - The response's http status code.
+--
+-- 'rows', 'batchUpsertTableRowsResponse_rows' - A map with the batch item id as the key and the result of the upsert
+-- operation as the value. The result of the upsert operation specifies
+-- whether existing rows were updated or a new row was appended, along with
+-- the list of row ids that were affected.
+--
+-- 'workbookCursor', 'batchUpsertTableRowsResponse_workbookCursor' - The updated workbook cursor after updating or appending rows in the
+-- table.
+newBatchUpsertTableRowsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'workbookCursor'
+  Prelude.Integer ->
+  BatchUpsertTableRowsResponse
+newBatchUpsertTableRowsResponse
+  pHttpStatus_
+  pWorkbookCursor_ =
+    BatchUpsertTableRowsResponse'
+      { failedBatchItems =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        rows = Prelude.mempty,
+        workbookCursor = pWorkbookCursor_
+      }
+
+-- | The list of batch items in the request that could not be updated or
+-- appended in the table. Each element in this list contains one item from
+-- the request that could not be updated in the table along with the reason
+-- why that item could not be updated or appended.
+batchUpsertTableRowsResponse_failedBatchItems :: Lens.Lens' BatchUpsertTableRowsResponse (Prelude.Maybe [FailedBatchItem])
+batchUpsertTableRowsResponse_failedBatchItems = Lens.lens (\BatchUpsertTableRowsResponse' {failedBatchItems} -> failedBatchItems) (\s@BatchUpsertTableRowsResponse' {} a -> s {failedBatchItems = a} :: BatchUpsertTableRowsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+batchUpsertTableRowsResponse_httpStatus :: Lens.Lens' BatchUpsertTableRowsResponse Prelude.Int
+batchUpsertTableRowsResponse_httpStatus = Lens.lens (\BatchUpsertTableRowsResponse' {httpStatus} -> httpStatus) (\s@BatchUpsertTableRowsResponse' {} a -> s {httpStatus = a} :: BatchUpsertTableRowsResponse)
+
+-- | A map with the batch item id as the key and the result of the upsert
+-- operation as the value. The result of the upsert operation specifies
+-- whether existing rows were updated or a new row was appended, along with
+-- the list of row ids that were affected.
+batchUpsertTableRowsResponse_rows :: Lens.Lens' BatchUpsertTableRowsResponse (Prelude.HashMap Prelude.Text UpsertRowsResult)
+batchUpsertTableRowsResponse_rows = Lens.lens (\BatchUpsertTableRowsResponse' {rows} -> rows) (\s@BatchUpsertTableRowsResponse' {} a -> s {rows = a} :: BatchUpsertTableRowsResponse) Prelude.. Lens.coerced
+
+-- | The updated workbook cursor after updating or appending rows in the
+-- table.
+batchUpsertTableRowsResponse_workbookCursor :: Lens.Lens' BatchUpsertTableRowsResponse Prelude.Integer
+batchUpsertTableRowsResponse_workbookCursor = Lens.lens (\BatchUpsertTableRowsResponse' {workbookCursor} -> workbookCursor) (\s@BatchUpsertTableRowsResponse' {} a -> s {workbookCursor = a} :: BatchUpsertTableRowsResponse)
+
+instance Prelude.NFData BatchUpsertTableRowsResponse where
+  rnf BatchUpsertTableRowsResponse' {..} =
+    Prelude.rnf failedBatchItems
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf rows
+      `Prelude.seq` Prelude.rnf workbookCursor
diff --git a/gen/Amazonka/HoneyCode/DescribeTableDataImportJob.hs b/gen/Amazonka/HoneyCode/DescribeTableDataImportJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/DescribeTableDataImportJob.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.HoneyCode.DescribeTableDataImportJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- The DescribeTableDataImportJob API allows you to retrieve the status and
+-- details of a table data import job.
+module Amazonka.HoneyCode.DescribeTableDataImportJob
+  ( -- * Creating a Request
+    DescribeTableDataImportJob (..),
+    newDescribeTableDataImportJob,
+
+    -- * Request Lenses
+    describeTableDataImportJob_workbookId,
+    describeTableDataImportJob_tableId,
+    describeTableDataImportJob_jobId,
+
+    -- * Destructuring the Response
+    DescribeTableDataImportJobResponse (..),
+    newDescribeTableDataImportJobResponse,
+
+    -- * Response Lenses
+    describeTableDataImportJobResponse_errorCode,
+    describeTableDataImportJobResponse_httpStatus,
+    describeTableDataImportJobResponse_jobStatus,
+    describeTableDataImportJobResponse_message,
+    describeTableDataImportJobResponse_jobMetadata,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeTableDataImportJob' smart constructor.
+data DescribeTableDataImportJob = DescribeTableDataImportJob'
+  { -- | The ID of the workbook into which data was imported.
+    --
+    -- If a workbook with the specified id could not be found, this API throws
+    -- ResourceNotFoundException.
+    workbookId :: Prelude.Text,
+    -- | The ID of the table into which data was imported.
+    --
+    -- If a table with the specified id could not be found, this API throws
+    -- ResourceNotFoundException.
+    tableId :: Prelude.Text,
+    -- | The ID of the job that was returned by the StartTableDataImportJob
+    -- request.
+    --
+    -- If a job with the specified id could not be found, this API throws
+    -- ResourceNotFoundException.
+    jobId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeTableDataImportJob' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'workbookId', 'describeTableDataImportJob_workbookId' - The ID of the workbook into which data was imported.
+--
+-- If a workbook with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+--
+-- 'tableId', 'describeTableDataImportJob_tableId' - The ID of the table into which data was imported.
+--
+-- If a table with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+--
+-- 'jobId', 'describeTableDataImportJob_jobId' - The ID of the job that was returned by the StartTableDataImportJob
+-- request.
+--
+-- If a job with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+newDescribeTableDataImportJob ::
+  -- | 'workbookId'
+  Prelude.Text ->
+  -- | 'tableId'
+  Prelude.Text ->
+  -- | 'jobId'
+  Prelude.Text ->
+  DescribeTableDataImportJob
+newDescribeTableDataImportJob
+  pWorkbookId_
+  pTableId_
+  pJobId_ =
+    DescribeTableDataImportJob'
+      { workbookId =
+          pWorkbookId_,
+        tableId = pTableId_,
+        jobId = pJobId_
+      }
+
+-- | The ID of the workbook into which data was imported.
+--
+-- If a workbook with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+describeTableDataImportJob_workbookId :: Lens.Lens' DescribeTableDataImportJob Prelude.Text
+describeTableDataImportJob_workbookId = Lens.lens (\DescribeTableDataImportJob' {workbookId} -> workbookId) (\s@DescribeTableDataImportJob' {} a -> s {workbookId = a} :: DescribeTableDataImportJob)
+
+-- | The ID of the table into which data was imported.
+--
+-- If a table with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+describeTableDataImportJob_tableId :: Lens.Lens' DescribeTableDataImportJob Prelude.Text
+describeTableDataImportJob_tableId = Lens.lens (\DescribeTableDataImportJob' {tableId} -> tableId) (\s@DescribeTableDataImportJob' {} a -> s {tableId = a} :: DescribeTableDataImportJob)
+
+-- | The ID of the job that was returned by the StartTableDataImportJob
+-- request.
+--
+-- If a job with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+describeTableDataImportJob_jobId :: Lens.Lens' DescribeTableDataImportJob Prelude.Text
+describeTableDataImportJob_jobId = Lens.lens (\DescribeTableDataImportJob' {jobId} -> jobId) (\s@DescribeTableDataImportJob' {} a -> s {jobId = a} :: DescribeTableDataImportJob)
+
+instance Core.AWSRequest DescribeTableDataImportJob where
+  type
+    AWSResponse DescribeTableDataImportJob =
+      DescribeTableDataImportJobResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeTableDataImportJobResponse'
+            Prelude.<$> (x Data..?> "errorCode")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "jobStatus")
+            Prelude.<*> (x Data..:> "message")
+            Prelude.<*> (x Data..:> "jobMetadata")
+      )
+
+instance Prelude.Hashable DescribeTableDataImportJob where
+  hashWithSalt _salt DescribeTableDataImportJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` workbookId
+      `Prelude.hashWithSalt` tableId
+      `Prelude.hashWithSalt` jobId
+
+instance Prelude.NFData DescribeTableDataImportJob where
+  rnf DescribeTableDataImportJob' {..} =
+    Prelude.rnf workbookId
+      `Prelude.seq` Prelude.rnf tableId
+      `Prelude.seq` Prelude.rnf jobId
+
+instance Data.ToHeaders DescribeTableDataImportJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeTableDataImportJob where
+  toPath DescribeTableDataImportJob' {..} =
+    Prelude.mconcat
+      [ "/workbooks/",
+        Data.toBS workbookId,
+        "/tables/",
+        Data.toBS tableId,
+        "/import/",
+        Data.toBS jobId
+      ]
+
+instance Data.ToQuery DescribeTableDataImportJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeTableDataImportJobResponse' smart constructor.
+data DescribeTableDataImportJobResponse = DescribeTableDataImportJobResponse'
+  { -- | If job status is failed, error code to understand reason for the
+    -- failure.
+    errorCode :: Prelude.Maybe ErrorCode,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The current status of the import job.
+    jobStatus :: TableDataImportJobStatus,
+    -- | A message providing more details about the current status of the import
+    -- job.
+    message :: Prelude.Text,
+    -- | The metadata about the job that was submitted for import.
+    jobMetadata :: TableDataImportJobMetadata
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeTableDataImportJobResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'errorCode', 'describeTableDataImportJobResponse_errorCode' - If job status is failed, error code to understand reason for the
+-- failure.
+--
+-- 'httpStatus', 'describeTableDataImportJobResponse_httpStatus' - The response's http status code.
+--
+-- 'jobStatus', 'describeTableDataImportJobResponse_jobStatus' - The current status of the import job.
+--
+-- 'message', 'describeTableDataImportJobResponse_message' - A message providing more details about the current status of the import
+-- job.
+--
+-- 'jobMetadata', 'describeTableDataImportJobResponse_jobMetadata' - The metadata about the job that was submitted for import.
+newDescribeTableDataImportJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'jobStatus'
+  TableDataImportJobStatus ->
+  -- | 'message'
+  Prelude.Text ->
+  -- | 'jobMetadata'
+  TableDataImportJobMetadata ->
+  DescribeTableDataImportJobResponse
+newDescribeTableDataImportJobResponse
+  pHttpStatus_
+  pJobStatus_
+  pMessage_
+  pJobMetadata_ =
+    DescribeTableDataImportJobResponse'
+      { errorCode =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        jobStatus = pJobStatus_,
+        message = pMessage_,
+        jobMetadata = pJobMetadata_
+      }
+
+-- | If job status is failed, error code to understand reason for the
+-- failure.
+describeTableDataImportJobResponse_errorCode :: Lens.Lens' DescribeTableDataImportJobResponse (Prelude.Maybe ErrorCode)
+describeTableDataImportJobResponse_errorCode = Lens.lens (\DescribeTableDataImportJobResponse' {errorCode} -> errorCode) (\s@DescribeTableDataImportJobResponse' {} a -> s {errorCode = a} :: DescribeTableDataImportJobResponse)
+
+-- | The response's http status code.
+describeTableDataImportJobResponse_httpStatus :: Lens.Lens' DescribeTableDataImportJobResponse Prelude.Int
+describeTableDataImportJobResponse_httpStatus = Lens.lens (\DescribeTableDataImportJobResponse' {httpStatus} -> httpStatus) (\s@DescribeTableDataImportJobResponse' {} a -> s {httpStatus = a} :: DescribeTableDataImportJobResponse)
+
+-- | The current status of the import job.
+describeTableDataImportJobResponse_jobStatus :: Lens.Lens' DescribeTableDataImportJobResponse TableDataImportJobStatus
+describeTableDataImportJobResponse_jobStatus = Lens.lens (\DescribeTableDataImportJobResponse' {jobStatus} -> jobStatus) (\s@DescribeTableDataImportJobResponse' {} a -> s {jobStatus = a} :: DescribeTableDataImportJobResponse)
+
+-- | A message providing more details about the current status of the import
+-- job.
+describeTableDataImportJobResponse_message :: Lens.Lens' DescribeTableDataImportJobResponse Prelude.Text
+describeTableDataImportJobResponse_message = Lens.lens (\DescribeTableDataImportJobResponse' {message} -> message) (\s@DescribeTableDataImportJobResponse' {} a -> s {message = a} :: DescribeTableDataImportJobResponse)
+
+-- | The metadata about the job that was submitted for import.
+describeTableDataImportJobResponse_jobMetadata :: Lens.Lens' DescribeTableDataImportJobResponse TableDataImportJobMetadata
+describeTableDataImportJobResponse_jobMetadata = Lens.lens (\DescribeTableDataImportJobResponse' {jobMetadata} -> jobMetadata) (\s@DescribeTableDataImportJobResponse' {} a -> s {jobMetadata = a} :: DescribeTableDataImportJobResponse)
+
+instance
+  Prelude.NFData
+    DescribeTableDataImportJobResponse
+  where
+  rnf DescribeTableDataImportJobResponse' {..} =
+    Prelude.rnf errorCode
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf jobStatus
+      `Prelude.seq` Prelude.rnf message
+      `Prelude.seq` Prelude.rnf jobMetadata
diff --git a/gen/Amazonka/HoneyCode/GetScreenData.hs b/gen/Amazonka/HoneyCode/GetScreenData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/GetScreenData.hs
@@ -0,0 +1,315 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.HoneyCode.GetScreenData
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- The GetScreenData API allows retrieval of data from a screen in a
+-- Honeycode app. The API allows setting local variables in the screen to
+-- filter, sort or otherwise affect what will be displayed on the screen.
+module Amazonka.HoneyCode.GetScreenData
+  ( -- * Creating a Request
+    GetScreenData (..),
+    newGetScreenData,
+
+    -- * Request Lenses
+    getScreenData_maxResults,
+    getScreenData_nextToken,
+    getScreenData_variables,
+    getScreenData_workbookId,
+    getScreenData_appId,
+    getScreenData_screenId,
+
+    -- * Destructuring the Response
+    GetScreenDataResponse (..),
+    newGetScreenDataResponse,
+
+    -- * Response Lenses
+    getScreenDataResponse_nextToken,
+    getScreenDataResponse_httpStatus,
+    getScreenDataResponse_results,
+    getScreenDataResponse_workbookCursor,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetScreenData' smart constructor.
+data GetScreenData = GetScreenData'
+  { -- | The number of results to be returned on a single page. Specify a number
+    -- between 1 and 100. The maximum value is 100.
+    --
+    -- This parameter is optional. If you don\'t specify this parameter, the
+    -- default page size is 100.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | This parameter is optional. If a nextToken is not specified, the API
+    -- returns the first page of data.
+    --
+    -- Pagination tokens expire after 1 hour. If you use a token that was
+    -- returned more than an hour back, the API will throw ValidationException.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Variables are optional and are needed only if the screen requires them
+    -- to render correctly. Variables are specified as a map where the key is
+    -- the name of the variable as defined on the screen. The value is an
+    -- object which currently has only one property, rawValue, which holds the
+    -- value of the variable to be passed to the screen.
+    variables :: Prelude.Maybe (Data.Sensitive (Prelude.HashMap Prelude.Text (Data.Sensitive VariableValue))),
+    -- | The ID of the workbook that contains the screen.
+    workbookId :: Prelude.Text,
+    -- | The ID of the app that contains the screen.
+    appId :: Prelude.Text,
+    -- | The ID of the screen.
+    screenId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetScreenData' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'getScreenData_maxResults' - The number of results to be returned on a single page. Specify a number
+-- between 1 and 100. The maximum value is 100.
+--
+-- This parameter is optional. If you don\'t specify this parameter, the
+-- default page size is 100.
+--
+-- 'nextToken', 'getScreenData_nextToken' - This parameter is optional. If a nextToken is not specified, the API
+-- returns the first page of data.
+--
+-- Pagination tokens expire after 1 hour. If you use a token that was
+-- returned more than an hour back, the API will throw ValidationException.
+--
+-- 'variables', 'getScreenData_variables' - Variables are optional and are needed only if the screen requires them
+-- to render correctly. Variables are specified as a map where the key is
+-- the name of the variable as defined on the screen. The value is an
+-- object which currently has only one property, rawValue, which holds the
+-- value of the variable to be passed to the screen.
+--
+-- 'workbookId', 'getScreenData_workbookId' - The ID of the workbook that contains the screen.
+--
+-- 'appId', 'getScreenData_appId' - The ID of the app that contains the screen.
+--
+-- 'screenId', 'getScreenData_screenId' - The ID of the screen.
+newGetScreenData ::
+  -- | 'workbookId'
+  Prelude.Text ->
+  -- | 'appId'
+  Prelude.Text ->
+  -- | 'screenId'
+  Prelude.Text ->
+  GetScreenData
+newGetScreenData pWorkbookId_ pAppId_ pScreenId_ =
+  GetScreenData'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      variables = Prelude.Nothing,
+      workbookId = pWorkbookId_,
+      appId = pAppId_,
+      screenId = pScreenId_
+    }
+
+-- | The number of results to be returned on a single page. Specify a number
+-- between 1 and 100. The maximum value is 100.
+--
+-- This parameter is optional. If you don\'t specify this parameter, the
+-- default page size is 100.
+getScreenData_maxResults :: Lens.Lens' GetScreenData (Prelude.Maybe Prelude.Natural)
+getScreenData_maxResults = Lens.lens (\GetScreenData' {maxResults} -> maxResults) (\s@GetScreenData' {} a -> s {maxResults = a} :: GetScreenData)
+
+-- | This parameter is optional. If a nextToken is not specified, the API
+-- returns the first page of data.
+--
+-- Pagination tokens expire after 1 hour. If you use a token that was
+-- returned more than an hour back, the API will throw ValidationException.
+getScreenData_nextToken :: Lens.Lens' GetScreenData (Prelude.Maybe Prelude.Text)
+getScreenData_nextToken = Lens.lens (\GetScreenData' {nextToken} -> nextToken) (\s@GetScreenData' {} a -> s {nextToken = a} :: GetScreenData)
+
+-- | Variables are optional and are needed only if the screen requires them
+-- to render correctly. Variables are specified as a map where the key is
+-- the name of the variable as defined on the screen. The value is an
+-- object which currently has only one property, rawValue, which holds the
+-- value of the variable to be passed to the screen.
+getScreenData_variables :: Lens.Lens' GetScreenData (Prelude.Maybe (Prelude.HashMap Prelude.Text VariableValue))
+getScreenData_variables = Lens.lens (\GetScreenData' {variables} -> variables) (\s@GetScreenData' {} a -> s {variables = a} :: GetScreenData) Prelude.. Lens.mapping (Data._Sensitive Prelude.. Lens.coerced)
+
+-- | The ID of the workbook that contains the screen.
+getScreenData_workbookId :: Lens.Lens' GetScreenData Prelude.Text
+getScreenData_workbookId = Lens.lens (\GetScreenData' {workbookId} -> workbookId) (\s@GetScreenData' {} a -> s {workbookId = a} :: GetScreenData)
+
+-- | The ID of the app that contains the screen.
+getScreenData_appId :: Lens.Lens' GetScreenData Prelude.Text
+getScreenData_appId = Lens.lens (\GetScreenData' {appId} -> appId) (\s@GetScreenData' {} a -> s {appId = a} :: GetScreenData)
+
+-- | The ID of the screen.
+getScreenData_screenId :: Lens.Lens' GetScreenData Prelude.Text
+getScreenData_screenId = Lens.lens (\GetScreenData' {screenId} -> screenId) (\s@GetScreenData' {} a -> s {screenId = a} :: GetScreenData)
+
+instance Core.AWSRequest GetScreenData where
+  type
+    AWSResponse GetScreenData =
+      GetScreenDataResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetScreenDataResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "results" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..:> "workbookCursor")
+      )
+
+instance Prelude.Hashable GetScreenData where
+  hashWithSalt _salt GetScreenData' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` variables
+      `Prelude.hashWithSalt` workbookId
+      `Prelude.hashWithSalt` appId
+      `Prelude.hashWithSalt` screenId
+
+instance Prelude.NFData GetScreenData where
+  rnf GetScreenData' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf variables
+      `Prelude.seq` Prelude.rnf workbookId
+      `Prelude.seq` Prelude.rnf appId
+      `Prelude.seq` Prelude.rnf screenId
+
+instance Data.ToHeaders GetScreenData where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetScreenData where
+  toJSON GetScreenData' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            ("variables" Data..=) Prelude.<$> variables,
+            Prelude.Just ("workbookId" Data..= workbookId),
+            Prelude.Just ("appId" Data..= appId),
+            Prelude.Just ("screenId" Data..= screenId)
+          ]
+      )
+
+instance Data.ToPath GetScreenData where
+  toPath = Prelude.const "/screendata"
+
+instance Data.ToQuery GetScreenData where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetScreenDataResponse' smart constructor.
+data GetScreenDataResponse = GetScreenDataResponse'
+  { -- | Provides the pagination token to load the next page if there are more
+    -- results matching the request. If a pagination token is not present in
+    -- the response, it means that all data matching the query has been loaded.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A map of all the rows on the screen keyed by block name.
+    results :: Prelude.HashMap Prelude.Text ResultSet,
+    -- | Indicates the cursor of the workbook at which the data returned by this
+    -- workbook is read. Workbook cursor keeps increasing with every update and
+    -- the increments are not sequential.
+    workbookCursor :: Prelude.Integer
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetScreenDataResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'getScreenDataResponse_nextToken' - Provides the pagination token to load the next page if there are more
+-- results matching the request. If a pagination token is not present in
+-- the response, it means that all data matching the query has been loaded.
+--
+-- 'httpStatus', 'getScreenDataResponse_httpStatus' - The response's http status code.
+--
+-- 'results', 'getScreenDataResponse_results' - A map of all the rows on the screen keyed by block name.
+--
+-- 'workbookCursor', 'getScreenDataResponse_workbookCursor' - Indicates the cursor of the workbook at which the data returned by this
+-- workbook is read. Workbook cursor keeps increasing with every update and
+-- the increments are not sequential.
+newGetScreenDataResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'workbookCursor'
+  Prelude.Integer ->
+  GetScreenDataResponse
+newGetScreenDataResponse
+  pHttpStatus_
+  pWorkbookCursor_ =
+    GetScreenDataResponse'
+      { nextToken = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        results = Prelude.mempty,
+        workbookCursor = pWorkbookCursor_
+      }
+
+-- | Provides the pagination token to load the next page if there are more
+-- results matching the request. If a pagination token is not present in
+-- the response, it means that all data matching the query has been loaded.
+getScreenDataResponse_nextToken :: Lens.Lens' GetScreenDataResponse (Prelude.Maybe Prelude.Text)
+getScreenDataResponse_nextToken = Lens.lens (\GetScreenDataResponse' {nextToken} -> nextToken) (\s@GetScreenDataResponse' {} a -> s {nextToken = a} :: GetScreenDataResponse)
+
+-- | The response's http status code.
+getScreenDataResponse_httpStatus :: Lens.Lens' GetScreenDataResponse Prelude.Int
+getScreenDataResponse_httpStatus = Lens.lens (\GetScreenDataResponse' {httpStatus} -> httpStatus) (\s@GetScreenDataResponse' {} a -> s {httpStatus = a} :: GetScreenDataResponse)
+
+-- | A map of all the rows on the screen keyed by block name.
+getScreenDataResponse_results :: Lens.Lens' GetScreenDataResponse (Prelude.HashMap Prelude.Text ResultSet)
+getScreenDataResponse_results = Lens.lens (\GetScreenDataResponse' {results} -> results) (\s@GetScreenDataResponse' {} a -> s {results = a} :: GetScreenDataResponse) Prelude.. Lens.coerced
+
+-- | Indicates the cursor of the workbook at which the data returned by this
+-- workbook is read. Workbook cursor keeps increasing with every update and
+-- the increments are not sequential.
+getScreenDataResponse_workbookCursor :: Lens.Lens' GetScreenDataResponse Prelude.Integer
+getScreenDataResponse_workbookCursor = Lens.lens (\GetScreenDataResponse' {workbookCursor} -> workbookCursor) (\s@GetScreenDataResponse' {} a -> s {workbookCursor = a} :: GetScreenDataResponse)
+
+instance Prelude.NFData GetScreenDataResponse where
+  rnf GetScreenDataResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf results
+      `Prelude.seq` Prelude.rnf workbookCursor
diff --git a/gen/Amazonka/HoneyCode/InvokeScreenAutomation.hs b/gen/Amazonka/HoneyCode/InvokeScreenAutomation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/InvokeScreenAutomation.hs
@@ -0,0 +1,318 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.HoneyCode.InvokeScreenAutomation
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- The InvokeScreenAutomation API allows invoking an action defined in a
+-- screen in a Honeycode app. The API allows setting local variables, which
+-- can then be used in the automation being invoked. This allows automating
+-- the Honeycode app interactions to write, update or delete data in the
+-- workbook.
+module Amazonka.HoneyCode.InvokeScreenAutomation
+  ( -- * Creating a Request
+    InvokeScreenAutomation (..),
+    newInvokeScreenAutomation,
+
+    -- * Request Lenses
+    invokeScreenAutomation_clientRequestToken,
+    invokeScreenAutomation_rowId,
+    invokeScreenAutomation_variables,
+    invokeScreenAutomation_workbookId,
+    invokeScreenAutomation_appId,
+    invokeScreenAutomation_screenId,
+    invokeScreenAutomation_screenAutomationId,
+
+    -- * Destructuring the Response
+    InvokeScreenAutomationResponse (..),
+    newInvokeScreenAutomationResponse,
+
+    -- * Response Lenses
+    invokeScreenAutomationResponse_httpStatus,
+    invokeScreenAutomationResponse_workbookCursor,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newInvokeScreenAutomation' smart constructor.
+data InvokeScreenAutomation = InvokeScreenAutomation'
+  { -- | The request token for performing the automation action. Request tokens
+    -- help to identify duplicate requests. If a call times out or fails due to
+    -- a transient error like a failed network connection, you can retry the
+    -- call with the same request token. The service ensures that if the first
+    -- call using that request token is successfully performed, the second call
+    -- will return the response of the previous call rather than performing the
+    -- action again.
+    --
+    -- Note that request tokens are valid only for a few minutes. You cannot
+    -- use request tokens to dedupe requests spanning hours or days.
+    clientRequestToken :: Prelude.Maybe Prelude.Text,
+    -- | The row ID for the automation if the automation is defined inside a
+    -- block with source or list.
+    rowId :: Prelude.Maybe Prelude.Text,
+    -- | Variables are specified as a map where the key is the name of the
+    -- variable as defined on the screen. The value is an object which
+    -- currently has only one property, rawValue, which holds the value of the
+    -- variable to be passed to the screen. Any variables defined in a screen
+    -- are required to be passed in the call.
+    variables :: Prelude.Maybe (Data.Sensitive (Prelude.HashMap Prelude.Text (Data.Sensitive VariableValue))),
+    -- | The ID of the workbook that contains the screen automation.
+    workbookId :: Prelude.Text,
+    -- | The ID of the app that contains the screen automation.
+    appId :: Prelude.Text,
+    -- | The ID of the screen that contains the screen automation.
+    screenId :: Prelude.Text,
+    -- | The ID of the automation action to be performed.
+    screenAutomationId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'InvokeScreenAutomation' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientRequestToken', 'invokeScreenAutomation_clientRequestToken' - The request token for performing the automation action. Request tokens
+-- help to identify duplicate requests. If a call times out or fails due to
+-- a transient error like a failed network connection, you can retry the
+-- call with the same request token. The service ensures that if the first
+-- call using that request token is successfully performed, the second call
+-- will return the response of the previous call rather than performing the
+-- action again.
+--
+-- Note that request tokens are valid only for a few minutes. You cannot
+-- use request tokens to dedupe requests spanning hours or days.
+--
+-- 'rowId', 'invokeScreenAutomation_rowId' - The row ID for the automation if the automation is defined inside a
+-- block with source or list.
+--
+-- 'variables', 'invokeScreenAutomation_variables' - Variables are specified as a map where the key is the name of the
+-- variable as defined on the screen. The value is an object which
+-- currently has only one property, rawValue, which holds the value of the
+-- variable to be passed to the screen. Any variables defined in a screen
+-- are required to be passed in the call.
+--
+-- 'workbookId', 'invokeScreenAutomation_workbookId' - The ID of the workbook that contains the screen automation.
+--
+-- 'appId', 'invokeScreenAutomation_appId' - The ID of the app that contains the screen automation.
+--
+-- 'screenId', 'invokeScreenAutomation_screenId' - The ID of the screen that contains the screen automation.
+--
+-- 'screenAutomationId', 'invokeScreenAutomation_screenAutomationId' - The ID of the automation action to be performed.
+newInvokeScreenAutomation ::
+  -- | 'workbookId'
+  Prelude.Text ->
+  -- | 'appId'
+  Prelude.Text ->
+  -- | 'screenId'
+  Prelude.Text ->
+  -- | 'screenAutomationId'
+  Prelude.Text ->
+  InvokeScreenAutomation
+newInvokeScreenAutomation
+  pWorkbookId_
+  pAppId_
+  pScreenId_
+  pScreenAutomationId_ =
+    InvokeScreenAutomation'
+      { clientRequestToken =
+          Prelude.Nothing,
+        rowId = Prelude.Nothing,
+        variables = Prelude.Nothing,
+        workbookId = pWorkbookId_,
+        appId = pAppId_,
+        screenId = pScreenId_,
+        screenAutomationId = pScreenAutomationId_
+      }
+
+-- | The request token for performing the automation action. Request tokens
+-- help to identify duplicate requests. If a call times out or fails due to
+-- a transient error like a failed network connection, you can retry the
+-- call with the same request token. The service ensures that if the first
+-- call using that request token is successfully performed, the second call
+-- will return the response of the previous call rather than performing the
+-- action again.
+--
+-- Note that request tokens are valid only for a few minutes. You cannot
+-- use request tokens to dedupe requests spanning hours or days.
+invokeScreenAutomation_clientRequestToken :: Lens.Lens' InvokeScreenAutomation (Prelude.Maybe Prelude.Text)
+invokeScreenAutomation_clientRequestToken = Lens.lens (\InvokeScreenAutomation' {clientRequestToken} -> clientRequestToken) (\s@InvokeScreenAutomation' {} a -> s {clientRequestToken = a} :: InvokeScreenAutomation)
+
+-- | The row ID for the automation if the automation is defined inside a
+-- block with source or list.
+invokeScreenAutomation_rowId :: Lens.Lens' InvokeScreenAutomation (Prelude.Maybe Prelude.Text)
+invokeScreenAutomation_rowId = Lens.lens (\InvokeScreenAutomation' {rowId} -> rowId) (\s@InvokeScreenAutomation' {} a -> s {rowId = a} :: InvokeScreenAutomation)
+
+-- | Variables are specified as a map where the key is the name of the
+-- variable as defined on the screen. The value is an object which
+-- currently has only one property, rawValue, which holds the value of the
+-- variable to be passed to the screen. Any variables defined in a screen
+-- are required to be passed in the call.
+invokeScreenAutomation_variables :: Lens.Lens' InvokeScreenAutomation (Prelude.Maybe (Prelude.HashMap Prelude.Text VariableValue))
+invokeScreenAutomation_variables = Lens.lens (\InvokeScreenAutomation' {variables} -> variables) (\s@InvokeScreenAutomation' {} a -> s {variables = a} :: InvokeScreenAutomation) Prelude.. Lens.mapping (Data._Sensitive Prelude.. Lens.coerced)
+
+-- | The ID of the workbook that contains the screen automation.
+invokeScreenAutomation_workbookId :: Lens.Lens' InvokeScreenAutomation Prelude.Text
+invokeScreenAutomation_workbookId = Lens.lens (\InvokeScreenAutomation' {workbookId} -> workbookId) (\s@InvokeScreenAutomation' {} a -> s {workbookId = a} :: InvokeScreenAutomation)
+
+-- | The ID of the app that contains the screen automation.
+invokeScreenAutomation_appId :: Lens.Lens' InvokeScreenAutomation Prelude.Text
+invokeScreenAutomation_appId = Lens.lens (\InvokeScreenAutomation' {appId} -> appId) (\s@InvokeScreenAutomation' {} a -> s {appId = a} :: InvokeScreenAutomation)
+
+-- | The ID of the screen that contains the screen automation.
+invokeScreenAutomation_screenId :: Lens.Lens' InvokeScreenAutomation Prelude.Text
+invokeScreenAutomation_screenId = Lens.lens (\InvokeScreenAutomation' {screenId} -> screenId) (\s@InvokeScreenAutomation' {} a -> s {screenId = a} :: InvokeScreenAutomation)
+
+-- | The ID of the automation action to be performed.
+invokeScreenAutomation_screenAutomationId :: Lens.Lens' InvokeScreenAutomation Prelude.Text
+invokeScreenAutomation_screenAutomationId = Lens.lens (\InvokeScreenAutomation' {screenAutomationId} -> screenAutomationId) (\s@InvokeScreenAutomation' {} a -> s {screenAutomationId = a} :: InvokeScreenAutomation)
+
+instance Core.AWSRequest InvokeScreenAutomation where
+  type
+    AWSResponse InvokeScreenAutomation =
+      InvokeScreenAutomationResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          InvokeScreenAutomationResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "workbookCursor")
+      )
+
+instance Prelude.Hashable InvokeScreenAutomation where
+  hashWithSalt _salt InvokeScreenAutomation' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientRequestToken
+      `Prelude.hashWithSalt` rowId
+      `Prelude.hashWithSalt` variables
+      `Prelude.hashWithSalt` workbookId
+      `Prelude.hashWithSalt` appId
+      `Prelude.hashWithSalt` screenId
+      `Prelude.hashWithSalt` screenAutomationId
+
+instance Prelude.NFData InvokeScreenAutomation where
+  rnf InvokeScreenAutomation' {..} =
+    Prelude.rnf clientRequestToken
+      `Prelude.seq` Prelude.rnf rowId
+      `Prelude.seq` Prelude.rnf variables
+      `Prelude.seq` Prelude.rnf workbookId
+      `Prelude.seq` Prelude.rnf appId
+      `Prelude.seq` Prelude.rnf screenId
+      `Prelude.seq` Prelude.rnf screenAutomationId
+
+instance Data.ToHeaders InvokeScreenAutomation where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON InvokeScreenAutomation where
+  toJSON InvokeScreenAutomation' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientRequestToken" Data..=)
+              Prelude.<$> clientRequestToken,
+            ("rowId" Data..=) Prelude.<$> rowId,
+            ("variables" Data..=) Prelude.<$> variables
+          ]
+      )
+
+instance Data.ToPath InvokeScreenAutomation where
+  toPath InvokeScreenAutomation' {..} =
+    Prelude.mconcat
+      [ "/workbooks/",
+        Data.toBS workbookId,
+        "/apps/",
+        Data.toBS appId,
+        "/screens/",
+        Data.toBS screenId,
+        "/automations/",
+        Data.toBS screenAutomationId
+      ]
+
+instance Data.ToQuery InvokeScreenAutomation where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newInvokeScreenAutomationResponse' smart constructor.
+data InvokeScreenAutomationResponse = InvokeScreenAutomationResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The updated workbook cursor after performing the automation action.
+    workbookCursor :: Prelude.Integer
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'InvokeScreenAutomationResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'invokeScreenAutomationResponse_httpStatus' - The response's http status code.
+--
+-- 'workbookCursor', 'invokeScreenAutomationResponse_workbookCursor' - The updated workbook cursor after performing the automation action.
+newInvokeScreenAutomationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'workbookCursor'
+  Prelude.Integer ->
+  InvokeScreenAutomationResponse
+newInvokeScreenAutomationResponse
+  pHttpStatus_
+  pWorkbookCursor_ =
+    InvokeScreenAutomationResponse'
+      { httpStatus =
+          pHttpStatus_,
+        workbookCursor = pWorkbookCursor_
+      }
+
+-- | The response's http status code.
+invokeScreenAutomationResponse_httpStatus :: Lens.Lens' InvokeScreenAutomationResponse Prelude.Int
+invokeScreenAutomationResponse_httpStatus = Lens.lens (\InvokeScreenAutomationResponse' {httpStatus} -> httpStatus) (\s@InvokeScreenAutomationResponse' {} a -> s {httpStatus = a} :: InvokeScreenAutomationResponse)
+
+-- | The updated workbook cursor after performing the automation action.
+invokeScreenAutomationResponse_workbookCursor :: Lens.Lens' InvokeScreenAutomationResponse Prelude.Integer
+invokeScreenAutomationResponse_workbookCursor = Lens.lens (\InvokeScreenAutomationResponse' {workbookCursor} -> workbookCursor) (\s@InvokeScreenAutomationResponse' {} a -> s {workbookCursor = a} :: InvokeScreenAutomationResponse)
+
+instance
+  Prelude.NFData
+    InvokeScreenAutomationResponse
+  where
+  rnf InvokeScreenAutomationResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf workbookCursor
diff --git a/gen/Amazonka/HoneyCode/Lens.hs b/gen/Amazonka/HoneyCode/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Lens.hs
@@ -0,0 +1,300 @@
+{-# 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.HoneyCode.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.HoneyCode.Lens
+  ( -- * Operations
+
+    -- ** BatchCreateTableRows
+    batchCreateTableRows_clientRequestToken,
+    batchCreateTableRows_workbookId,
+    batchCreateTableRows_tableId,
+    batchCreateTableRows_rowsToCreate,
+    batchCreateTableRowsResponse_failedBatchItems,
+    batchCreateTableRowsResponse_httpStatus,
+    batchCreateTableRowsResponse_workbookCursor,
+    batchCreateTableRowsResponse_createdRows,
+
+    -- ** BatchDeleteTableRows
+    batchDeleteTableRows_clientRequestToken,
+    batchDeleteTableRows_workbookId,
+    batchDeleteTableRows_tableId,
+    batchDeleteTableRows_rowIds,
+    batchDeleteTableRowsResponse_failedBatchItems,
+    batchDeleteTableRowsResponse_httpStatus,
+    batchDeleteTableRowsResponse_workbookCursor,
+
+    -- ** BatchUpdateTableRows
+    batchUpdateTableRows_clientRequestToken,
+    batchUpdateTableRows_workbookId,
+    batchUpdateTableRows_tableId,
+    batchUpdateTableRows_rowsToUpdate,
+    batchUpdateTableRowsResponse_failedBatchItems,
+    batchUpdateTableRowsResponse_httpStatus,
+    batchUpdateTableRowsResponse_workbookCursor,
+
+    -- ** BatchUpsertTableRows
+    batchUpsertTableRows_clientRequestToken,
+    batchUpsertTableRows_workbookId,
+    batchUpsertTableRows_tableId,
+    batchUpsertTableRows_rowsToUpsert,
+    batchUpsertTableRowsResponse_failedBatchItems,
+    batchUpsertTableRowsResponse_httpStatus,
+    batchUpsertTableRowsResponse_rows,
+    batchUpsertTableRowsResponse_workbookCursor,
+
+    -- ** DescribeTableDataImportJob
+    describeTableDataImportJob_workbookId,
+    describeTableDataImportJob_tableId,
+    describeTableDataImportJob_jobId,
+    describeTableDataImportJobResponse_errorCode,
+    describeTableDataImportJobResponse_httpStatus,
+    describeTableDataImportJobResponse_jobStatus,
+    describeTableDataImportJobResponse_message,
+    describeTableDataImportJobResponse_jobMetadata,
+
+    -- ** GetScreenData
+    getScreenData_maxResults,
+    getScreenData_nextToken,
+    getScreenData_variables,
+    getScreenData_workbookId,
+    getScreenData_appId,
+    getScreenData_screenId,
+    getScreenDataResponse_nextToken,
+    getScreenDataResponse_httpStatus,
+    getScreenDataResponse_results,
+    getScreenDataResponse_workbookCursor,
+
+    -- ** InvokeScreenAutomation
+    invokeScreenAutomation_clientRequestToken,
+    invokeScreenAutomation_rowId,
+    invokeScreenAutomation_variables,
+    invokeScreenAutomation_workbookId,
+    invokeScreenAutomation_appId,
+    invokeScreenAutomation_screenId,
+    invokeScreenAutomation_screenAutomationId,
+    invokeScreenAutomationResponse_httpStatus,
+    invokeScreenAutomationResponse_workbookCursor,
+
+    -- ** ListTableColumns
+    listTableColumns_nextToken,
+    listTableColumns_workbookId,
+    listTableColumns_tableId,
+    listTableColumnsResponse_nextToken,
+    listTableColumnsResponse_workbookCursor,
+    listTableColumnsResponse_httpStatus,
+    listTableColumnsResponse_tableColumns,
+
+    -- ** ListTableRows
+    listTableRows_maxResults,
+    listTableRows_nextToken,
+    listTableRows_rowIds,
+    listTableRows_workbookId,
+    listTableRows_tableId,
+    listTableRowsResponse_nextToken,
+    listTableRowsResponse_rowIdsNotFound,
+    listTableRowsResponse_httpStatus,
+    listTableRowsResponse_columnIds,
+    listTableRowsResponse_rows,
+    listTableRowsResponse_workbookCursor,
+
+    -- ** ListTables
+    listTables_maxResults,
+    listTables_nextToken,
+    listTables_workbookId,
+    listTablesResponse_nextToken,
+    listTablesResponse_workbookCursor,
+    listTablesResponse_httpStatus,
+    listTablesResponse_tables,
+
+    -- ** ListTagsForResource
+    listTagsForResource_resourceArn,
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+
+    -- ** QueryTableRows
+    queryTableRows_maxResults,
+    queryTableRows_nextToken,
+    queryTableRows_workbookId,
+    queryTableRows_tableId,
+    queryTableRows_filterFormula,
+    queryTableRowsResponse_nextToken,
+    queryTableRowsResponse_httpStatus,
+    queryTableRowsResponse_columnIds,
+    queryTableRowsResponse_rows,
+    queryTableRowsResponse_workbookCursor,
+
+    -- ** StartTableDataImportJob
+    startTableDataImportJob_workbookId,
+    startTableDataImportJob_dataSource,
+    startTableDataImportJob_dataFormat,
+    startTableDataImportJob_destinationTableId,
+    startTableDataImportJob_importOptions,
+    startTableDataImportJob_clientRequestToken,
+    startTableDataImportJobResponse_httpStatus,
+    startTableDataImportJobResponse_jobId,
+    startTableDataImportJobResponse_jobStatus,
+
+    -- ** TagResource
+    tagResource_resourceArn,
+    tagResource_tags,
+    tagResourceResponse_httpStatus,
+
+    -- ** UntagResource
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+    untagResourceResponse_httpStatus,
+
+    -- * Types
+
+    -- ** Cell
+    cell_format,
+    cell_formattedValue,
+    cell_formattedValues,
+    cell_formula,
+    cell_rawValue,
+
+    -- ** CellInput
+    cellInput_fact,
+    cellInput_facts,
+
+    -- ** ColumnMetadata
+    columnMetadata_name,
+    columnMetadata_format,
+
+    -- ** CreateRowData
+    createRowData_batchItemId,
+    createRowData_cellsToCreate,
+
+    -- ** DataItem
+    dataItem_formattedValue,
+    dataItem_overrideFormat,
+    dataItem_rawValue,
+
+    -- ** DelimitedTextImportOptions
+    delimitedTextImportOptions_dataCharacterEncoding,
+    delimitedTextImportOptions_hasHeaderRow,
+    delimitedTextImportOptions_ignoreEmptyRows,
+    delimitedTextImportOptions_delimiter,
+
+    -- ** DestinationOptions
+    destinationOptions_columnMap,
+
+    -- ** FailedBatchItem
+    failedBatchItem_id,
+    failedBatchItem_errorMessage,
+
+    -- ** Filter
+    filter_contextRowId,
+    filter_formula,
+
+    -- ** ImportDataSource
+    importDataSource_dataSourceConfig,
+
+    -- ** ImportDataSourceConfig
+    importDataSourceConfig_dataSourceUrl,
+
+    -- ** ImportJobSubmitter
+    importJobSubmitter_email,
+    importJobSubmitter_userArn,
+
+    -- ** ImportOptions
+    importOptions_delimitedTextOptions,
+    importOptions_destinationOptions,
+
+    -- ** ResultRow
+    resultRow_rowId,
+    resultRow_dataItems,
+
+    -- ** ResultSet
+    resultSet_headers,
+    resultSet_rows,
+
+    -- ** SourceDataColumnProperties
+    sourceDataColumnProperties_columnIndex,
+
+    -- ** Table
+    table_tableId,
+    table_tableName,
+
+    -- ** TableColumn
+    tableColumn_format,
+    tableColumn_tableColumnId,
+    tableColumn_tableColumnName,
+
+    -- ** TableDataImportJobMetadata
+    tableDataImportJobMetadata_submitter,
+    tableDataImportJobMetadata_submitTime,
+    tableDataImportJobMetadata_importOptions,
+    tableDataImportJobMetadata_dataSource,
+
+    -- ** TableRow
+    tableRow_rowId,
+    tableRow_cells,
+
+    -- ** UpdateRowData
+    updateRowData_rowId,
+    updateRowData_cellsToUpdate,
+
+    -- ** UpsertRowData
+    upsertRowData_batchItemId,
+    upsertRowData_filter,
+    upsertRowData_cellsToUpdate,
+
+    -- ** UpsertRowsResult
+    upsertRowsResult_rowIds,
+    upsertRowsResult_upsertAction,
+
+    -- ** VariableValue
+    variableValue_rawValue,
+  )
+where
+
+import Amazonka.HoneyCode.BatchCreateTableRows
+import Amazonka.HoneyCode.BatchDeleteTableRows
+import Amazonka.HoneyCode.BatchUpdateTableRows
+import Amazonka.HoneyCode.BatchUpsertTableRows
+import Amazonka.HoneyCode.DescribeTableDataImportJob
+import Amazonka.HoneyCode.GetScreenData
+import Amazonka.HoneyCode.InvokeScreenAutomation
+import Amazonka.HoneyCode.ListTableColumns
+import Amazonka.HoneyCode.ListTableRows
+import Amazonka.HoneyCode.ListTables
+import Amazonka.HoneyCode.ListTagsForResource
+import Amazonka.HoneyCode.QueryTableRows
+import Amazonka.HoneyCode.StartTableDataImportJob
+import Amazonka.HoneyCode.TagResource
+import Amazonka.HoneyCode.Types.Cell
+import Amazonka.HoneyCode.Types.CellInput
+import Amazonka.HoneyCode.Types.ColumnMetadata
+import Amazonka.HoneyCode.Types.CreateRowData
+import Amazonka.HoneyCode.Types.DataItem
+import Amazonka.HoneyCode.Types.DelimitedTextImportOptions
+import Amazonka.HoneyCode.Types.DestinationOptions
+import Amazonka.HoneyCode.Types.FailedBatchItem
+import Amazonka.HoneyCode.Types.Filter
+import Amazonka.HoneyCode.Types.ImportDataSource
+import Amazonka.HoneyCode.Types.ImportDataSourceConfig
+import Amazonka.HoneyCode.Types.ImportJobSubmitter
+import Amazonka.HoneyCode.Types.ImportOptions
+import Amazonka.HoneyCode.Types.ResultRow
+import Amazonka.HoneyCode.Types.ResultSet
+import Amazonka.HoneyCode.Types.SourceDataColumnProperties
+import Amazonka.HoneyCode.Types.Table
+import Amazonka.HoneyCode.Types.TableColumn
+import Amazonka.HoneyCode.Types.TableDataImportJobMetadata
+import Amazonka.HoneyCode.Types.TableRow
+import Amazonka.HoneyCode.Types.UpdateRowData
+import Amazonka.HoneyCode.Types.UpsertRowData
+import Amazonka.HoneyCode.Types.UpsertRowsResult
+import Amazonka.HoneyCode.Types.VariableValue
+import Amazonka.HoneyCode.UntagResource
diff --git a/gen/Amazonka/HoneyCode/ListTableColumns.hs b/gen/Amazonka/HoneyCode/ListTableColumns.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/ListTableColumns.hs
@@ -0,0 +1,289 @@
+{-# 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.HoneyCode.ListTableColumns
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- The ListTableColumns API allows you to retrieve a list of all the
+-- columns in a table in a workbook.
+--
+-- This operation returns paginated results.
+module Amazonka.HoneyCode.ListTableColumns
+  ( -- * Creating a Request
+    ListTableColumns (..),
+    newListTableColumns,
+
+    -- * Request Lenses
+    listTableColumns_nextToken,
+    listTableColumns_workbookId,
+    listTableColumns_tableId,
+
+    -- * Destructuring the Response
+    ListTableColumnsResponse (..),
+    newListTableColumnsResponse,
+
+    -- * Response Lenses
+    listTableColumnsResponse_nextToken,
+    listTableColumnsResponse_workbookCursor,
+    listTableColumnsResponse_httpStatus,
+    listTableColumnsResponse_tableColumns,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListTableColumns' smart constructor.
+data ListTableColumns = ListTableColumns'
+  { -- | This parameter is optional. If a nextToken is not specified, the API
+    -- returns the first page of data.
+    --
+    -- Pagination tokens expire after 1 hour. If you use a token that was
+    -- returned more than an hour back, the API will throw ValidationException.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the workbook that contains the table whose columns are being
+    -- retrieved.
+    --
+    -- If a workbook with the specified id could not be found, this API throws
+    -- ResourceNotFoundException.
+    workbookId :: Prelude.Text,
+    -- | The ID of the table whose columns are being retrieved.
+    --
+    -- If a table with the specified id could not be found, this API throws
+    -- ResourceNotFoundException.
+    tableId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTableColumns' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'listTableColumns_nextToken' - This parameter is optional. If a nextToken is not specified, the API
+-- returns the first page of data.
+--
+-- Pagination tokens expire after 1 hour. If you use a token that was
+-- returned more than an hour back, the API will throw ValidationException.
+--
+-- 'workbookId', 'listTableColumns_workbookId' - The ID of the workbook that contains the table whose columns are being
+-- retrieved.
+--
+-- If a workbook with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+--
+-- 'tableId', 'listTableColumns_tableId' - The ID of the table whose columns are being retrieved.
+--
+-- If a table with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+newListTableColumns ::
+  -- | 'workbookId'
+  Prelude.Text ->
+  -- | 'tableId'
+  Prelude.Text ->
+  ListTableColumns
+newListTableColumns pWorkbookId_ pTableId_ =
+  ListTableColumns'
+    { nextToken = Prelude.Nothing,
+      workbookId = pWorkbookId_,
+      tableId = pTableId_
+    }
+
+-- | This parameter is optional. If a nextToken is not specified, the API
+-- returns the first page of data.
+--
+-- Pagination tokens expire after 1 hour. If you use a token that was
+-- returned more than an hour back, the API will throw ValidationException.
+listTableColumns_nextToken :: Lens.Lens' ListTableColumns (Prelude.Maybe Prelude.Text)
+listTableColumns_nextToken = Lens.lens (\ListTableColumns' {nextToken} -> nextToken) (\s@ListTableColumns' {} a -> s {nextToken = a} :: ListTableColumns)
+
+-- | The ID of the workbook that contains the table whose columns are being
+-- retrieved.
+--
+-- If a workbook with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+listTableColumns_workbookId :: Lens.Lens' ListTableColumns Prelude.Text
+listTableColumns_workbookId = Lens.lens (\ListTableColumns' {workbookId} -> workbookId) (\s@ListTableColumns' {} a -> s {workbookId = a} :: ListTableColumns)
+
+-- | The ID of the table whose columns are being retrieved.
+--
+-- If a table with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+listTableColumns_tableId :: Lens.Lens' ListTableColumns Prelude.Text
+listTableColumns_tableId = Lens.lens (\ListTableColumns' {tableId} -> tableId) (\s@ListTableColumns' {} a -> s {tableId = a} :: ListTableColumns)
+
+instance Core.AWSPager ListTableColumns where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listTableColumnsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        (rs Lens.^. listTableColumnsResponse_tableColumns) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listTableColumns_nextToken
+          Lens..~ rs
+          Lens.^? listTableColumnsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListTableColumns where
+  type
+    AWSResponse ListTableColumns =
+      ListTableColumnsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTableColumnsResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "workbookCursor")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "tableColumns" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable ListTableColumns where
+  hashWithSalt _salt ListTableColumns' {..} =
+    _salt
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` workbookId
+      `Prelude.hashWithSalt` tableId
+
+instance Prelude.NFData ListTableColumns where
+  rnf ListTableColumns' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf workbookId
+      `Prelude.seq` Prelude.rnf tableId
+
+instance Data.ToHeaders ListTableColumns where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListTableColumns where
+  toPath ListTableColumns' {..} =
+    Prelude.mconcat
+      [ "/workbooks/",
+        Data.toBS workbookId,
+        "/tables/",
+        Data.toBS tableId,
+        "/columns"
+      ]
+
+instance Data.ToQuery ListTableColumns where
+  toQuery ListTableColumns' {..} =
+    Prelude.mconcat ["nextToken" Data.=: nextToken]
+
+-- | /See:/ 'newListTableColumnsResponse' smart constructor.
+data ListTableColumnsResponse = ListTableColumnsResponse'
+  { -- | Provides the pagination token to load the next page if there are more
+    -- results matching the request. If a pagination token is not present in
+    -- the response, it means that all data matching the request has been
+    -- loaded.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Indicates the cursor of the workbook at which the data returned by this
+    -- request is read. Workbook cursor keeps increasing with every update and
+    -- the increments are not sequential.
+    workbookCursor :: Prelude.Maybe Prelude.Integer,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The list of columns in the table.
+    tableColumns :: [TableColumn]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTableColumnsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'listTableColumnsResponse_nextToken' - Provides the pagination token to load the next page if there are more
+-- results matching the request. If a pagination token is not present in
+-- the response, it means that all data matching the request has been
+-- loaded.
+--
+-- 'workbookCursor', 'listTableColumnsResponse_workbookCursor' - Indicates the cursor of the workbook at which the data returned by this
+-- request is read. Workbook cursor keeps increasing with every update and
+-- the increments are not sequential.
+--
+-- 'httpStatus', 'listTableColumnsResponse_httpStatus' - The response's http status code.
+--
+-- 'tableColumns', 'listTableColumnsResponse_tableColumns' - The list of columns in the table.
+newListTableColumnsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTableColumnsResponse
+newListTableColumnsResponse pHttpStatus_ =
+  ListTableColumnsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      workbookCursor = Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      tableColumns = Prelude.mempty
+    }
+
+-- | Provides the pagination token to load the next page if there are more
+-- results matching the request. If a pagination token is not present in
+-- the response, it means that all data matching the request has been
+-- loaded.
+listTableColumnsResponse_nextToken :: Lens.Lens' ListTableColumnsResponse (Prelude.Maybe Prelude.Text)
+listTableColumnsResponse_nextToken = Lens.lens (\ListTableColumnsResponse' {nextToken} -> nextToken) (\s@ListTableColumnsResponse' {} a -> s {nextToken = a} :: ListTableColumnsResponse)
+
+-- | Indicates the cursor of the workbook at which the data returned by this
+-- request is read. Workbook cursor keeps increasing with every update and
+-- the increments are not sequential.
+listTableColumnsResponse_workbookCursor :: Lens.Lens' ListTableColumnsResponse (Prelude.Maybe Prelude.Integer)
+listTableColumnsResponse_workbookCursor = Lens.lens (\ListTableColumnsResponse' {workbookCursor} -> workbookCursor) (\s@ListTableColumnsResponse' {} a -> s {workbookCursor = a} :: ListTableColumnsResponse)
+
+-- | The response's http status code.
+listTableColumnsResponse_httpStatus :: Lens.Lens' ListTableColumnsResponse Prelude.Int
+listTableColumnsResponse_httpStatus = Lens.lens (\ListTableColumnsResponse' {httpStatus} -> httpStatus) (\s@ListTableColumnsResponse' {} a -> s {httpStatus = a} :: ListTableColumnsResponse)
+
+-- | The list of columns in the table.
+listTableColumnsResponse_tableColumns :: Lens.Lens' ListTableColumnsResponse [TableColumn]
+listTableColumnsResponse_tableColumns = Lens.lens (\ListTableColumnsResponse' {tableColumns} -> tableColumns) (\s@ListTableColumnsResponse' {} a -> s {tableColumns = a} :: ListTableColumnsResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListTableColumnsResponse where
+  rnf ListTableColumnsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf workbookCursor
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf tableColumns
diff --git a/gen/Amazonka/HoneyCode/ListTableRows.hs b/gen/Amazonka/HoneyCode/ListTableRows.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/ListTableRows.hs
@@ -0,0 +1,366 @@
+{-# 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.HoneyCode.ListTableRows
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- The ListTableRows API allows you to retrieve a list of all the rows in a
+-- table in a workbook.
+--
+-- This operation returns paginated results.
+module Amazonka.HoneyCode.ListTableRows
+  ( -- * Creating a Request
+    ListTableRows (..),
+    newListTableRows,
+
+    -- * Request Lenses
+    listTableRows_maxResults,
+    listTableRows_nextToken,
+    listTableRows_rowIds,
+    listTableRows_workbookId,
+    listTableRows_tableId,
+
+    -- * Destructuring the Response
+    ListTableRowsResponse (..),
+    newListTableRowsResponse,
+
+    -- * Response Lenses
+    listTableRowsResponse_nextToken,
+    listTableRowsResponse_rowIdsNotFound,
+    listTableRowsResponse_httpStatus,
+    listTableRowsResponse_columnIds,
+    listTableRowsResponse_rows,
+    listTableRowsResponse_workbookCursor,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListTableRows' smart constructor.
+data ListTableRows = ListTableRows'
+  { -- | The maximum number of rows to return in each page of the results.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | This parameter is optional. If a nextToken is not specified, the API
+    -- returns the first page of data.
+    --
+    -- Pagination tokens expire after 1 hour. If you use a token that was
+    -- returned more than an hour back, the API will throw ValidationException.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | This parameter is optional. If one or more row ids are specified in this
+    -- list, then only the specified row ids are returned in the result. If no
+    -- row ids are specified here, then all the rows in the table are returned.
+    rowIds :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text),
+    -- | The ID of the workbook that contains the table whose rows are being
+    -- retrieved.
+    --
+    -- If a workbook with the specified id could not be found, this API throws
+    -- ResourceNotFoundException.
+    workbookId :: Prelude.Text,
+    -- | The ID of the table whose rows are being retrieved.
+    --
+    -- If a table with the specified id could not be found, this API throws
+    -- ResourceNotFoundException.
+    tableId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTableRows' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'listTableRows_maxResults' - The maximum number of rows to return in each page of the results.
+--
+-- 'nextToken', 'listTableRows_nextToken' - This parameter is optional. If a nextToken is not specified, the API
+-- returns the first page of data.
+--
+-- Pagination tokens expire after 1 hour. If you use a token that was
+-- returned more than an hour back, the API will throw ValidationException.
+--
+-- 'rowIds', 'listTableRows_rowIds' - This parameter is optional. If one or more row ids are specified in this
+-- list, then only the specified row ids are returned in the result. If no
+-- row ids are specified here, then all the rows in the table are returned.
+--
+-- 'workbookId', 'listTableRows_workbookId' - The ID of the workbook that contains the table whose rows are being
+-- retrieved.
+--
+-- If a workbook with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+--
+-- 'tableId', 'listTableRows_tableId' - The ID of the table whose rows are being retrieved.
+--
+-- If a table with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+newListTableRows ::
+  -- | 'workbookId'
+  Prelude.Text ->
+  -- | 'tableId'
+  Prelude.Text ->
+  ListTableRows
+newListTableRows pWorkbookId_ pTableId_ =
+  ListTableRows'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      rowIds = Prelude.Nothing,
+      workbookId = pWorkbookId_,
+      tableId = pTableId_
+    }
+
+-- | The maximum number of rows to return in each page of the results.
+listTableRows_maxResults :: Lens.Lens' ListTableRows (Prelude.Maybe Prelude.Natural)
+listTableRows_maxResults = Lens.lens (\ListTableRows' {maxResults} -> maxResults) (\s@ListTableRows' {} a -> s {maxResults = a} :: ListTableRows)
+
+-- | This parameter is optional. If a nextToken is not specified, the API
+-- returns the first page of data.
+--
+-- Pagination tokens expire after 1 hour. If you use a token that was
+-- returned more than an hour back, the API will throw ValidationException.
+listTableRows_nextToken :: Lens.Lens' ListTableRows (Prelude.Maybe Prelude.Text)
+listTableRows_nextToken = Lens.lens (\ListTableRows' {nextToken} -> nextToken) (\s@ListTableRows' {} a -> s {nextToken = a} :: ListTableRows)
+
+-- | This parameter is optional. If one or more row ids are specified in this
+-- list, then only the specified row ids are returned in the result. If no
+-- row ids are specified here, then all the rows in the table are returned.
+listTableRows_rowIds :: Lens.Lens' ListTableRows (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+listTableRows_rowIds = Lens.lens (\ListTableRows' {rowIds} -> rowIds) (\s@ListTableRows' {} a -> s {rowIds = a} :: ListTableRows) Prelude.. Lens.mapping Lens.coerced
+
+-- | The ID of the workbook that contains the table whose rows are being
+-- retrieved.
+--
+-- If a workbook with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+listTableRows_workbookId :: Lens.Lens' ListTableRows Prelude.Text
+listTableRows_workbookId = Lens.lens (\ListTableRows' {workbookId} -> workbookId) (\s@ListTableRows' {} a -> s {workbookId = a} :: ListTableRows)
+
+-- | The ID of the table whose rows are being retrieved.
+--
+-- If a table with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+listTableRows_tableId :: Lens.Lens' ListTableRows Prelude.Text
+listTableRows_tableId = Lens.lens (\ListTableRows' {tableId} -> tableId) (\s@ListTableRows' {} a -> s {tableId = a} :: ListTableRows)
+
+instance Core.AWSPager ListTableRows where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listTableRowsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop (rs Lens.^. listTableRowsResponse_rows) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listTableRows_nextToken
+          Lens..~ rs
+          Lens.^? listTableRowsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListTableRows where
+  type
+    AWSResponse ListTableRows =
+      ListTableRowsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTableRowsResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "rowIdsNotFound")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "columnIds")
+            Prelude.<*> (x Data..?> "rows" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..:> "workbookCursor")
+      )
+
+instance Prelude.Hashable ListTableRows where
+  hashWithSalt _salt ListTableRows' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` rowIds
+      `Prelude.hashWithSalt` workbookId
+      `Prelude.hashWithSalt` tableId
+
+instance Prelude.NFData ListTableRows where
+  rnf ListTableRows' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf rowIds
+      `Prelude.seq` Prelude.rnf workbookId
+      `Prelude.seq` Prelude.rnf tableId
+
+instance Data.ToHeaders ListTableRows where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListTableRows where
+  toJSON ListTableRows' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            ("rowIds" Data..=) Prelude.<$> rowIds
+          ]
+      )
+
+instance Data.ToPath ListTableRows where
+  toPath ListTableRows' {..} =
+    Prelude.mconcat
+      [ "/workbooks/",
+        Data.toBS workbookId,
+        "/tables/",
+        Data.toBS tableId,
+        "/rows/list"
+      ]
+
+instance Data.ToQuery ListTableRows where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListTableRowsResponse' smart constructor.
+data ListTableRowsResponse = ListTableRowsResponse'
+  { -- | Provides the pagination token to load the next page if there are more
+    -- results matching the request. If a pagination token is not present in
+    -- the response, it means that all data matching the request has been
+    -- loaded.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The list of row ids included in the request that were not found in the
+    -- table.
+    rowIdsNotFound :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text),
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The list of columns in the table whose row data is returned in the
+    -- result.
+    columnIds :: Prelude.NonEmpty Prelude.Text,
+    -- | The list of rows in the table. Note that this result is paginated, so
+    -- this list contains a maximum of 100 rows.
+    rows :: [TableRow],
+    -- | Indicates the cursor of the workbook at which the data returned by this
+    -- request is read. Workbook cursor keeps increasing with every update and
+    -- the increments are not sequential.
+    workbookCursor :: Prelude.Integer
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTableRowsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'listTableRowsResponse_nextToken' - Provides the pagination token to load the next page if there are more
+-- results matching the request. If a pagination token is not present in
+-- the response, it means that all data matching the request has been
+-- loaded.
+--
+-- 'rowIdsNotFound', 'listTableRowsResponse_rowIdsNotFound' - The list of row ids included in the request that were not found in the
+-- table.
+--
+-- 'httpStatus', 'listTableRowsResponse_httpStatus' - The response's http status code.
+--
+-- 'columnIds', 'listTableRowsResponse_columnIds' - The list of columns in the table whose row data is returned in the
+-- result.
+--
+-- 'rows', 'listTableRowsResponse_rows' - The list of rows in the table. Note that this result is paginated, so
+-- this list contains a maximum of 100 rows.
+--
+-- 'workbookCursor', 'listTableRowsResponse_workbookCursor' - Indicates the cursor of the workbook at which the data returned by this
+-- request is read. Workbook cursor keeps increasing with every update and
+-- the increments are not sequential.
+newListTableRowsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'columnIds'
+  Prelude.NonEmpty Prelude.Text ->
+  -- | 'workbookCursor'
+  Prelude.Integer ->
+  ListTableRowsResponse
+newListTableRowsResponse
+  pHttpStatus_
+  pColumnIds_
+  pWorkbookCursor_ =
+    ListTableRowsResponse'
+      { nextToken = Prelude.Nothing,
+        rowIdsNotFound = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        columnIds = Lens.coerced Lens.# pColumnIds_,
+        rows = Prelude.mempty,
+        workbookCursor = pWorkbookCursor_
+      }
+
+-- | Provides the pagination token to load the next page if there are more
+-- results matching the request. If a pagination token is not present in
+-- the response, it means that all data matching the request has been
+-- loaded.
+listTableRowsResponse_nextToken :: Lens.Lens' ListTableRowsResponse (Prelude.Maybe Prelude.Text)
+listTableRowsResponse_nextToken = Lens.lens (\ListTableRowsResponse' {nextToken} -> nextToken) (\s@ListTableRowsResponse' {} a -> s {nextToken = a} :: ListTableRowsResponse)
+
+-- | The list of row ids included in the request that were not found in the
+-- table.
+listTableRowsResponse_rowIdsNotFound :: Lens.Lens' ListTableRowsResponse (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+listTableRowsResponse_rowIdsNotFound = Lens.lens (\ListTableRowsResponse' {rowIdsNotFound} -> rowIdsNotFound) (\s@ListTableRowsResponse' {} a -> s {rowIdsNotFound = a} :: ListTableRowsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listTableRowsResponse_httpStatus :: Lens.Lens' ListTableRowsResponse Prelude.Int
+listTableRowsResponse_httpStatus = Lens.lens (\ListTableRowsResponse' {httpStatus} -> httpStatus) (\s@ListTableRowsResponse' {} a -> s {httpStatus = a} :: ListTableRowsResponse)
+
+-- | The list of columns in the table whose row data is returned in the
+-- result.
+listTableRowsResponse_columnIds :: Lens.Lens' ListTableRowsResponse (Prelude.NonEmpty Prelude.Text)
+listTableRowsResponse_columnIds = Lens.lens (\ListTableRowsResponse' {columnIds} -> columnIds) (\s@ListTableRowsResponse' {} a -> s {columnIds = a} :: ListTableRowsResponse) Prelude.. Lens.coerced
+
+-- | The list of rows in the table. Note that this result is paginated, so
+-- this list contains a maximum of 100 rows.
+listTableRowsResponse_rows :: Lens.Lens' ListTableRowsResponse [TableRow]
+listTableRowsResponse_rows = Lens.lens (\ListTableRowsResponse' {rows} -> rows) (\s@ListTableRowsResponse' {} a -> s {rows = a} :: ListTableRowsResponse) Prelude.. Lens.coerced
+
+-- | Indicates the cursor of the workbook at which the data returned by this
+-- request is read. Workbook cursor keeps increasing with every update and
+-- the increments are not sequential.
+listTableRowsResponse_workbookCursor :: Lens.Lens' ListTableRowsResponse Prelude.Integer
+listTableRowsResponse_workbookCursor = Lens.lens (\ListTableRowsResponse' {workbookCursor} -> workbookCursor) (\s@ListTableRowsResponse' {} a -> s {workbookCursor = a} :: ListTableRowsResponse)
+
+instance Prelude.NFData ListTableRowsResponse where
+  rnf ListTableRowsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf rowIdsNotFound
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf columnIds
+      `Prelude.seq` Prelude.rnf rows
+      `Prelude.seq` Prelude.rnf workbookCursor
diff --git a/gen/Amazonka/HoneyCode/ListTables.hs b/gen/Amazonka/HoneyCode/ListTables.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/ListTables.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.HoneyCode.ListTables
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- The ListTables API allows you to retrieve a list of all the tables in a
+-- workbook.
+--
+-- This operation returns paginated results.
+module Amazonka.HoneyCode.ListTables
+  ( -- * Creating a Request
+    ListTables (..),
+    newListTables,
+
+    -- * Request Lenses
+    listTables_maxResults,
+    listTables_nextToken,
+    listTables_workbookId,
+
+    -- * Destructuring the Response
+    ListTablesResponse (..),
+    newListTablesResponse,
+
+    -- * Response Lenses
+    listTablesResponse_nextToken,
+    listTablesResponse_workbookCursor,
+    listTablesResponse_httpStatus,
+    listTablesResponse_tables,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListTables' smart constructor.
+data ListTables = ListTables'
+  { -- | The maximum number of tables to return in each page of the results.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | This parameter is optional. If a nextToken is not specified, the API
+    -- returns the first page of data.
+    --
+    -- Pagination tokens expire after 1 hour. If you use a token that was
+    -- returned more than an hour back, the API will throw ValidationException.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the workbook whose tables are being retrieved.
+    --
+    -- If a workbook with the specified id could not be found, this API throws
+    -- ResourceNotFoundException.
+    workbookId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTables' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'listTables_maxResults' - The maximum number of tables to return in each page of the results.
+--
+-- 'nextToken', 'listTables_nextToken' - This parameter is optional. If a nextToken is not specified, the API
+-- returns the first page of data.
+--
+-- Pagination tokens expire after 1 hour. If you use a token that was
+-- returned more than an hour back, the API will throw ValidationException.
+--
+-- 'workbookId', 'listTables_workbookId' - The ID of the workbook whose tables are being retrieved.
+--
+-- If a workbook with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+newListTables ::
+  -- | 'workbookId'
+  Prelude.Text ->
+  ListTables
+newListTables pWorkbookId_ =
+  ListTables'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      workbookId = pWorkbookId_
+    }
+
+-- | The maximum number of tables to return in each page of the results.
+listTables_maxResults :: Lens.Lens' ListTables (Prelude.Maybe Prelude.Natural)
+listTables_maxResults = Lens.lens (\ListTables' {maxResults} -> maxResults) (\s@ListTables' {} a -> s {maxResults = a} :: ListTables)
+
+-- | This parameter is optional. If a nextToken is not specified, the API
+-- returns the first page of data.
+--
+-- Pagination tokens expire after 1 hour. If you use a token that was
+-- returned more than an hour back, the API will throw ValidationException.
+listTables_nextToken :: Lens.Lens' ListTables (Prelude.Maybe Prelude.Text)
+listTables_nextToken = Lens.lens (\ListTables' {nextToken} -> nextToken) (\s@ListTables' {} a -> s {nextToken = a} :: ListTables)
+
+-- | The ID of the workbook whose tables are being retrieved.
+--
+-- If a workbook with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+listTables_workbookId :: Lens.Lens' ListTables Prelude.Text
+listTables_workbookId = Lens.lens (\ListTables' {workbookId} -> workbookId) (\s@ListTables' {} a -> s {workbookId = a} :: ListTables)
+
+instance Core.AWSPager ListTables where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listTablesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop (rs Lens.^. listTablesResponse_tables) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listTables_nextToken
+          Lens..~ rs
+          Lens.^? listTablesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListTables where
+  type AWSResponse ListTables = ListTablesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTablesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "workbookCursor")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "tables" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable ListTables where
+  hashWithSalt _salt ListTables' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` workbookId
+
+instance Prelude.NFData ListTables where
+  rnf ListTables' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf workbookId
+
+instance Data.ToHeaders ListTables where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListTables where
+  toPath ListTables' {..} =
+    Prelude.mconcat
+      ["/workbooks/", Data.toBS workbookId, "/tables"]
+
+instance Data.ToQuery ListTables where
+  toQuery ListTables' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListTablesResponse' smart constructor.
+data ListTablesResponse = ListTablesResponse'
+  { -- | Provides the pagination token to load the next page if there are more
+    -- results matching the request. If a pagination token is not present in
+    -- the response, it means that all data matching the request has been
+    -- loaded.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Indicates the cursor of the workbook at which the data returned by this
+    -- request is read. Workbook cursor keeps increasing with every update and
+    -- the increments are not sequential.
+    workbookCursor :: Prelude.Maybe Prelude.Integer,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The list of tables in the workbook.
+    tables :: [Table]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTablesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'listTablesResponse_nextToken' - Provides the pagination token to load the next page if there are more
+-- results matching the request. If a pagination token is not present in
+-- the response, it means that all data matching the request has been
+-- loaded.
+--
+-- 'workbookCursor', 'listTablesResponse_workbookCursor' - Indicates the cursor of the workbook at which the data returned by this
+-- request is read. Workbook cursor keeps increasing with every update and
+-- the increments are not sequential.
+--
+-- 'httpStatus', 'listTablesResponse_httpStatus' - The response's http status code.
+--
+-- 'tables', 'listTablesResponse_tables' - The list of tables in the workbook.
+newListTablesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTablesResponse
+newListTablesResponse pHttpStatus_ =
+  ListTablesResponse'
+    { nextToken = Prelude.Nothing,
+      workbookCursor = Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      tables = Prelude.mempty
+    }
+
+-- | Provides the pagination token to load the next page if there are more
+-- results matching the request. If a pagination token is not present in
+-- the response, it means that all data matching the request has been
+-- loaded.
+listTablesResponse_nextToken :: Lens.Lens' ListTablesResponse (Prelude.Maybe Prelude.Text)
+listTablesResponse_nextToken = Lens.lens (\ListTablesResponse' {nextToken} -> nextToken) (\s@ListTablesResponse' {} a -> s {nextToken = a} :: ListTablesResponse)
+
+-- | Indicates the cursor of the workbook at which the data returned by this
+-- request is read. Workbook cursor keeps increasing with every update and
+-- the increments are not sequential.
+listTablesResponse_workbookCursor :: Lens.Lens' ListTablesResponse (Prelude.Maybe Prelude.Integer)
+listTablesResponse_workbookCursor = Lens.lens (\ListTablesResponse' {workbookCursor} -> workbookCursor) (\s@ListTablesResponse' {} a -> s {workbookCursor = a} :: ListTablesResponse)
+
+-- | The response's http status code.
+listTablesResponse_httpStatus :: Lens.Lens' ListTablesResponse Prelude.Int
+listTablesResponse_httpStatus = Lens.lens (\ListTablesResponse' {httpStatus} -> httpStatus) (\s@ListTablesResponse' {} a -> s {httpStatus = a} :: ListTablesResponse)
+
+-- | The list of tables in the workbook.
+listTablesResponse_tables :: Lens.Lens' ListTablesResponse [Table]
+listTablesResponse_tables = Lens.lens (\ListTablesResponse' {tables} -> tables) (\s@ListTablesResponse' {} a -> s {tables = a} :: ListTablesResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListTablesResponse where
+  rnf ListTablesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf workbookCursor
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf tables
diff --git a/gen/Amazonka/HoneyCode/ListTagsForResource.hs b/gen/Amazonka/HoneyCode/ListTagsForResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/ListTagsForResource.hs
@@ -0,0 +1,159 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.HoneyCode.ListTagsForResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- The ListTagsForResource API allows you to return a resource\'s tags.
+module Amazonka.HoneyCode.ListTagsForResource
+  ( -- * Creating a Request
+    ListTagsForResource (..),
+    newListTagsForResource,
+
+    -- * Request Lenses
+    listTagsForResource_resourceArn,
+
+    -- * Destructuring the Response
+    ListTagsForResourceResponse (..),
+    newListTagsForResourceResponse,
+
+    -- * Response Lenses
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListTagsForResource' smart constructor.
+data ListTagsForResource = ListTagsForResource'
+  { -- | The resource\'s Amazon Resource Name (ARN).
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'listTagsForResource_resourceArn' - The resource\'s Amazon Resource Name (ARN).
+newListTagsForResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  ListTagsForResource
+newListTagsForResource pResourceArn_ =
+  ListTagsForResource' {resourceArn = pResourceArn_}
+
+-- | The resource\'s Amazon Resource Name (ARN).
+listTagsForResource_resourceArn :: Lens.Lens' ListTagsForResource Prelude.Text
+listTagsForResource_resourceArn = Lens.lens (\ListTagsForResource' {resourceArn} -> resourceArn) (\s@ListTagsForResource' {} a -> s {resourceArn = a} :: ListTagsForResource)
+
+instance Core.AWSRequest ListTagsForResource where
+  type
+    AWSResponse ListTagsForResource =
+      ListTagsForResourceResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTagsForResourceResponse'
+            Prelude.<$> (x Data..?> "tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListTagsForResource where
+  hashWithSalt _salt ListTagsForResource' {..} =
+    _salt `Prelude.hashWithSalt` resourceArn
+
+instance Prelude.NFData ListTagsForResource where
+  rnf ListTagsForResource' {..} =
+    Prelude.rnf resourceArn
+
+instance Data.ToHeaders ListTagsForResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListTagsForResource where
+  toPath ListTagsForResource' {..} =
+    Prelude.mconcat ["/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery ListTagsForResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListTagsForResourceResponse' smart constructor.
+data ListTagsForResourceResponse = ListTagsForResourceResponse'
+  { -- | The resource\'s tags.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tags', 'listTagsForResourceResponse_tags' - The resource\'s tags.
+--
+-- 'httpStatus', 'listTagsForResourceResponse_httpStatus' - The response's http status code.
+newListTagsForResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTagsForResourceResponse
+newListTagsForResourceResponse pHttpStatus_ =
+  ListTagsForResourceResponse'
+    { tags =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The resource\'s tags.
+listTagsForResourceResponse_tags :: Lens.Lens' ListTagsForResourceResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+listTagsForResourceResponse_tags = Lens.lens (\ListTagsForResourceResponse' {tags} -> tags) (\s@ListTagsForResourceResponse' {} a -> s {tags = a} :: ListTagsForResourceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listTagsForResourceResponse_httpStatus :: Lens.Lens' ListTagsForResourceResponse Prelude.Int
+listTagsForResourceResponse_httpStatus = Lens.lens (\ListTagsForResourceResponse' {httpStatus} -> httpStatus) (\s@ListTagsForResourceResponse' {} a -> s {httpStatus = a} :: ListTagsForResourceResponse)
+
+instance Prelude.NFData ListTagsForResourceResponse where
+  rnf ListTagsForResourceResponse' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/HoneyCode/QueryTableRows.hs b/gen/Amazonka/HoneyCode/QueryTableRows.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/QueryTableRows.hs
@@ -0,0 +1,349 @@
+{-# 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.HoneyCode.QueryTableRows
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- The QueryTableRows API allows you to use a filter formula to query for
+-- specific rows in a table.
+--
+-- This operation returns paginated results.
+module Amazonka.HoneyCode.QueryTableRows
+  ( -- * Creating a Request
+    QueryTableRows (..),
+    newQueryTableRows,
+
+    -- * Request Lenses
+    queryTableRows_maxResults,
+    queryTableRows_nextToken,
+    queryTableRows_workbookId,
+    queryTableRows_tableId,
+    queryTableRows_filterFormula,
+
+    -- * Destructuring the Response
+    QueryTableRowsResponse (..),
+    newQueryTableRowsResponse,
+
+    -- * Response Lenses
+    queryTableRowsResponse_nextToken,
+    queryTableRowsResponse_httpStatus,
+    queryTableRowsResponse_columnIds,
+    queryTableRowsResponse_rows,
+    queryTableRowsResponse_workbookCursor,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newQueryTableRows' smart constructor.
+data QueryTableRows = QueryTableRows'
+  { -- | The maximum number of rows to return in each page of the results.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | This parameter is optional. If a nextToken is not specified, the API
+    -- returns the first page of data.
+    --
+    -- Pagination tokens expire after 1 hour. If you use a token that was
+    -- returned more than an hour back, the API will throw ValidationException.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the workbook whose table rows are being queried.
+    --
+    -- If a workbook with the specified id could not be found, this API throws
+    -- ResourceNotFoundException.
+    workbookId :: Prelude.Text,
+    -- | The ID of the table whose rows are being queried.
+    --
+    -- If a table with the specified id could not be found, this API throws
+    -- ResourceNotFoundException.
+    tableId :: Prelude.Text,
+    -- | An object that represents a filter formula along with the id of the
+    -- context row under which the filter function needs to evaluate.
+    filterFormula :: Filter
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'QueryTableRows' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'queryTableRows_maxResults' - The maximum number of rows to return in each page of the results.
+--
+-- 'nextToken', 'queryTableRows_nextToken' - This parameter is optional. If a nextToken is not specified, the API
+-- returns the first page of data.
+--
+-- Pagination tokens expire after 1 hour. If you use a token that was
+-- returned more than an hour back, the API will throw ValidationException.
+--
+-- 'workbookId', 'queryTableRows_workbookId' - The ID of the workbook whose table rows are being queried.
+--
+-- If a workbook with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+--
+-- 'tableId', 'queryTableRows_tableId' - The ID of the table whose rows are being queried.
+--
+-- If a table with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+--
+-- 'filterFormula', 'queryTableRows_filterFormula' - An object that represents a filter formula along with the id of the
+-- context row under which the filter function needs to evaluate.
+newQueryTableRows ::
+  -- | 'workbookId'
+  Prelude.Text ->
+  -- | 'tableId'
+  Prelude.Text ->
+  -- | 'filterFormula'
+  Filter ->
+  QueryTableRows
+newQueryTableRows
+  pWorkbookId_
+  pTableId_
+  pFilterFormula_ =
+    QueryTableRows'
+      { maxResults = Prelude.Nothing,
+        nextToken = Prelude.Nothing,
+        workbookId = pWorkbookId_,
+        tableId = pTableId_,
+        filterFormula = pFilterFormula_
+      }
+
+-- | The maximum number of rows to return in each page of the results.
+queryTableRows_maxResults :: Lens.Lens' QueryTableRows (Prelude.Maybe Prelude.Natural)
+queryTableRows_maxResults = Lens.lens (\QueryTableRows' {maxResults} -> maxResults) (\s@QueryTableRows' {} a -> s {maxResults = a} :: QueryTableRows)
+
+-- | This parameter is optional. If a nextToken is not specified, the API
+-- returns the first page of data.
+--
+-- Pagination tokens expire after 1 hour. If you use a token that was
+-- returned more than an hour back, the API will throw ValidationException.
+queryTableRows_nextToken :: Lens.Lens' QueryTableRows (Prelude.Maybe Prelude.Text)
+queryTableRows_nextToken = Lens.lens (\QueryTableRows' {nextToken} -> nextToken) (\s@QueryTableRows' {} a -> s {nextToken = a} :: QueryTableRows)
+
+-- | The ID of the workbook whose table rows are being queried.
+--
+-- If a workbook with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+queryTableRows_workbookId :: Lens.Lens' QueryTableRows Prelude.Text
+queryTableRows_workbookId = Lens.lens (\QueryTableRows' {workbookId} -> workbookId) (\s@QueryTableRows' {} a -> s {workbookId = a} :: QueryTableRows)
+
+-- | The ID of the table whose rows are being queried.
+--
+-- If a table with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+queryTableRows_tableId :: Lens.Lens' QueryTableRows Prelude.Text
+queryTableRows_tableId = Lens.lens (\QueryTableRows' {tableId} -> tableId) (\s@QueryTableRows' {} a -> s {tableId = a} :: QueryTableRows)
+
+-- | An object that represents a filter formula along with the id of the
+-- context row under which the filter function needs to evaluate.
+queryTableRows_filterFormula :: Lens.Lens' QueryTableRows Filter
+queryTableRows_filterFormula = Lens.lens (\QueryTableRows' {filterFormula} -> filterFormula) (\s@QueryTableRows' {} a -> s {filterFormula = a} :: QueryTableRows)
+
+instance Core.AWSPager QueryTableRows where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? queryTableRowsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop (rs Lens.^. queryTableRowsResponse_rows) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& queryTableRows_nextToken
+          Lens..~ rs
+          Lens.^? queryTableRowsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest QueryTableRows where
+  type
+    AWSResponse QueryTableRows =
+      QueryTableRowsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          QueryTableRowsResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "columnIds")
+            Prelude.<*> (x Data..?> "rows" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..:> "workbookCursor")
+      )
+
+instance Prelude.Hashable QueryTableRows where
+  hashWithSalt _salt QueryTableRows' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` workbookId
+      `Prelude.hashWithSalt` tableId
+      `Prelude.hashWithSalt` filterFormula
+
+instance Prelude.NFData QueryTableRows where
+  rnf QueryTableRows' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf workbookId
+      `Prelude.seq` Prelude.rnf tableId
+      `Prelude.seq` Prelude.rnf filterFormula
+
+instance Data.ToHeaders QueryTableRows where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON QueryTableRows where
+  toJSON QueryTableRows' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just
+              ("filterFormula" Data..= filterFormula)
+          ]
+      )
+
+instance Data.ToPath QueryTableRows where
+  toPath QueryTableRows' {..} =
+    Prelude.mconcat
+      [ "/workbooks/",
+        Data.toBS workbookId,
+        "/tables/",
+        Data.toBS tableId,
+        "/rows/query"
+      ]
+
+instance Data.ToQuery QueryTableRows where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newQueryTableRowsResponse' smart constructor.
+data QueryTableRowsResponse = QueryTableRowsResponse'
+  { -- | Provides the pagination token to load the next page if there are more
+    -- results matching the request. If a pagination token is not present in
+    -- the response, it means that all data matching the request has been
+    -- loaded.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The list of columns in the table whose row data is returned in the
+    -- result.
+    columnIds :: Prelude.NonEmpty Prelude.Text,
+    -- | The list of rows in the table that match the query filter.
+    rows :: [TableRow],
+    -- | Indicates the cursor of the workbook at which the data returned by this
+    -- request is read. Workbook cursor keeps increasing with every update and
+    -- the increments are not sequential.
+    workbookCursor :: Prelude.Integer
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'QueryTableRowsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'queryTableRowsResponse_nextToken' - Provides the pagination token to load the next page if there are more
+-- results matching the request. If a pagination token is not present in
+-- the response, it means that all data matching the request has been
+-- loaded.
+--
+-- 'httpStatus', 'queryTableRowsResponse_httpStatus' - The response's http status code.
+--
+-- 'columnIds', 'queryTableRowsResponse_columnIds' - The list of columns in the table whose row data is returned in the
+-- result.
+--
+-- 'rows', 'queryTableRowsResponse_rows' - The list of rows in the table that match the query filter.
+--
+-- 'workbookCursor', 'queryTableRowsResponse_workbookCursor' - Indicates the cursor of the workbook at which the data returned by this
+-- request is read. Workbook cursor keeps increasing with every update and
+-- the increments are not sequential.
+newQueryTableRowsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'columnIds'
+  Prelude.NonEmpty Prelude.Text ->
+  -- | 'workbookCursor'
+  Prelude.Integer ->
+  QueryTableRowsResponse
+newQueryTableRowsResponse
+  pHttpStatus_
+  pColumnIds_
+  pWorkbookCursor_ =
+    QueryTableRowsResponse'
+      { nextToken =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        columnIds = Lens.coerced Lens.# pColumnIds_,
+        rows = Prelude.mempty,
+        workbookCursor = pWorkbookCursor_
+      }
+
+-- | Provides the pagination token to load the next page if there are more
+-- results matching the request. If a pagination token is not present in
+-- the response, it means that all data matching the request has been
+-- loaded.
+queryTableRowsResponse_nextToken :: Lens.Lens' QueryTableRowsResponse (Prelude.Maybe Prelude.Text)
+queryTableRowsResponse_nextToken = Lens.lens (\QueryTableRowsResponse' {nextToken} -> nextToken) (\s@QueryTableRowsResponse' {} a -> s {nextToken = a} :: QueryTableRowsResponse)
+
+-- | The response's http status code.
+queryTableRowsResponse_httpStatus :: Lens.Lens' QueryTableRowsResponse Prelude.Int
+queryTableRowsResponse_httpStatus = Lens.lens (\QueryTableRowsResponse' {httpStatus} -> httpStatus) (\s@QueryTableRowsResponse' {} a -> s {httpStatus = a} :: QueryTableRowsResponse)
+
+-- | The list of columns in the table whose row data is returned in the
+-- result.
+queryTableRowsResponse_columnIds :: Lens.Lens' QueryTableRowsResponse (Prelude.NonEmpty Prelude.Text)
+queryTableRowsResponse_columnIds = Lens.lens (\QueryTableRowsResponse' {columnIds} -> columnIds) (\s@QueryTableRowsResponse' {} a -> s {columnIds = a} :: QueryTableRowsResponse) Prelude.. Lens.coerced
+
+-- | The list of rows in the table that match the query filter.
+queryTableRowsResponse_rows :: Lens.Lens' QueryTableRowsResponse [TableRow]
+queryTableRowsResponse_rows = Lens.lens (\QueryTableRowsResponse' {rows} -> rows) (\s@QueryTableRowsResponse' {} a -> s {rows = a} :: QueryTableRowsResponse) Prelude.. Lens.coerced
+
+-- | Indicates the cursor of the workbook at which the data returned by this
+-- request is read. Workbook cursor keeps increasing with every update and
+-- the increments are not sequential.
+queryTableRowsResponse_workbookCursor :: Lens.Lens' QueryTableRowsResponse Prelude.Integer
+queryTableRowsResponse_workbookCursor = Lens.lens (\QueryTableRowsResponse' {workbookCursor} -> workbookCursor) (\s@QueryTableRowsResponse' {} a -> s {workbookCursor = a} :: QueryTableRowsResponse)
+
+instance Prelude.NFData QueryTableRowsResponse where
+  rnf QueryTableRowsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf columnIds
+      `Prelude.seq` Prelude.rnf rows
+      `Prelude.seq` Prelude.rnf workbookCursor
diff --git a/gen/Amazonka/HoneyCode/StartTableDataImportJob.hs b/gen/Amazonka/HoneyCode/StartTableDataImportJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/StartTableDataImportJob.hs
@@ -0,0 +1,338 @@
+{-# 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.HoneyCode.StartTableDataImportJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- The StartTableDataImportJob API allows you to start an import job on a
+-- table. This API will only return the id of the job that was started. To
+-- find out the status of the import request, you need to call the
+-- DescribeTableDataImportJob API.
+module Amazonka.HoneyCode.StartTableDataImportJob
+  ( -- * Creating a Request
+    StartTableDataImportJob (..),
+    newStartTableDataImportJob,
+
+    -- * Request Lenses
+    startTableDataImportJob_workbookId,
+    startTableDataImportJob_dataSource,
+    startTableDataImportJob_dataFormat,
+    startTableDataImportJob_destinationTableId,
+    startTableDataImportJob_importOptions,
+    startTableDataImportJob_clientRequestToken,
+
+    -- * Destructuring the Response
+    StartTableDataImportJobResponse (..),
+    newStartTableDataImportJobResponse,
+
+    -- * Response Lenses
+    startTableDataImportJobResponse_httpStatus,
+    startTableDataImportJobResponse_jobId,
+    startTableDataImportJobResponse_jobStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newStartTableDataImportJob' smart constructor.
+data StartTableDataImportJob = StartTableDataImportJob'
+  { -- | The ID of the workbook where the rows are being imported.
+    --
+    -- If a workbook with the specified id could not be found, this API throws
+    -- ResourceNotFoundException.
+    workbookId :: Prelude.Text,
+    -- | The source of the data that is being imported. The size of source must
+    -- be no larger than 100 MB. Source must have no more than 100,000 cells
+    -- and no more than 1,000 rows.
+    dataSource :: ImportDataSource,
+    -- | The format of the data that is being imported. Currently the only option
+    -- supported is \"DELIMITED_TEXT\".
+    dataFormat :: ImportSourceDataFormat,
+    -- | The ID of the table where the rows are being imported.
+    --
+    -- If a table with the specified id could not be found, this API throws
+    -- ResourceNotFoundException.
+    destinationTableId :: Prelude.Text,
+    -- | The options for customizing this import request.
+    importOptions :: ImportOptions,
+    -- | The request token for performing the update action. Request tokens help
+    -- to identify duplicate requests. If a call times out or fails due to a
+    -- transient error like a failed network connection, you can retry the call
+    -- with the same request token. The service ensures that if the first call
+    -- using that request token is successfully performed, the second call will
+    -- not perform the action again.
+    --
+    -- Note that request tokens are valid only for a few minutes. You cannot
+    -- use request tokens to dedupe requests spanning hours or days.
+    clientRequestToken :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartTableDataImportJob' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'workbookId', 'startTableDataImportJob_workbookId' - The ID of the workbook where the rows are being imported.
+--
+-- If a workbook with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+--
+-- 'dataSource', 'startTableDataImportJob_dataSource' - The source of the data that is being imported. The size of source must
+-- be no larger than 100 MB. Source must have no more than 100,000 cells
+-- and no more than 1,000 rows.
+--
+-- 'dataFormat', 'startTableDataImportJob_dataFormat' - The format of the data that is being imported. Currently the only option
+-- supported is \"DELIMITED_TEXT\".
+--
+-- 'destinationTableId', 'startTableDataImportJob_destinationTableId' - The ID of the table where the rows are being imported.
+--
+-- If a table with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+--
+-- 'importOptions', 'startTableDataImportJob_importOptions' - The options for customizing this import request.
+--
+-- 'clientRequestToken', 'startTableDataImportJob_clientRequestToken' - The request token for performing the update action. Request tokens help
+-- to identify duplicate requests. If a call times out or fails due to a
+-- transient error like a failed network connection, you can retry the call
+-- with the same request token. The service ensures that if the first call
+-- using that request token is successfully performed, the second call will
+-- not perform the action again.
+--
+-- Note that request tokens are valid only for a few minutes. You cannot
+-- use request tokens to dedupe requests spanning hours or days.
+newStartTableDataImportJob ::
+  -- | 'workbookId'
+  Prelude.Text ->
+  -- | 'dataSource'
+  ImportDataSource ->
+  -- | 'dataFormat'
+  ImportSourceDataFormat ->
+  -- | 'destinationTableId'
+  Prelude.Text ->
+  -- | 'importOptions'
+  ImportOptions ->
+  -- | 'clientRequestToken'
+  Prelude.Text ->
+  StartTableDataImportJob
+newStartTableDataImportJob
+  pWorkbookId_
+  pDataSource_
+  pDataFormat_
+  pDestinationTableId_
+  pImportOptions_
+  pClientRequestToken_ =
+    StartTableDataImportJob'
+      { workbookId = pWorkbookId_,
+        dataSource = pDataSource_,
+        dataFormat = pDataFormat_,
+        destinationTableId = pDestinationTableId_,
+        importOptions = pImportOptions_,
+        clientRequestToken = pClientRequestToken_
+      }
+
+-- | The ID of the workbook where the rows are being imported.
+--
+-- If a workbook with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+startTableDataImportJob_workbookId :: Lens.Lens' StartTableDataImportJob Prelude.Text
+startTableDataImportJob_workbookId = Lens.lens (\StartTableDataImportJob' {workbookId} -> workbookId) (\s@StartTableDataImportJob' {} a -> s {workbookId = a} :: StartTableDataImportJob)
+
+-- | The source of the data that is being imported. The size of source must
+-- be no larger than 100 MB. Source must have no more than 100,000 cells
+-- and no more than 1,000 rows.
+startTableDataImportJob_dataSource :: Lens.Lens' StartTableDataImportJob ImportDataSource
+startTableDataImportJob_dataSource = Lens.lens (\StartTableDataImportJob' {dataSource} -> dataSource) (\s@StartTableDataImportJob' {} a -> s {dataSource = a} :: StartTableDataImportJob)
+
+-- | The format of the data that is being imported. Currently the only option
+-- supported is \"DELIMITED_TEXT\".
+startTableDataImportJob_dataFormat :: Lens.Lens' StartTableDataImportJob ImportSourceDataFormat
+startTableDataImportJob_dataFormat = Lens.lens (\StartTableDataImportJob' {dataFormat} -> dataFormat) (\s@StartTableDataImportJob' {} a -> s {dataFormat = a} :: StartTableDataImportJob)
+
+-- | The ID of the table where the rows are being imported.
+--
+-- If a table with the specified id could not be found, this API throws
+-- ResourceNotFoundException.
+startTableDataImportJob_destinationTableId :: Lens.Lens' StartTableDataImportJob Prelude.Text
+startTableDataImportJob_destinationTableId = Lens.lens (\StartTableDataImportJob' {destinationTableId} -> destinationTableId) (\s@StartTableDataImportJob' {} a -> s {destinationTableId = a} :: StartTableDataImportJob)
+
+-- | The options for customizing this import request.
+startTableDataImportJob_importOptions :: Lens.Lens' StartTableDataImportJob ImportOptions
+startTableDataImportJob_importOptions = Lens.lens (\StartTableDataImportJob' {importOptions} -> importOptions) (\s@StartTableDataImportJob' {} a -> s {importOptions = a} :: StartTableDataImportJob)
+
+-- | The request token for performing the update action. Request tokens help
+-- to identify duplicate requests. If a call times out or fails due to a
+-- transient error like a failed network connection, you can retry the call
+-- with the same request token. The service ensures that if the first call
+-- using that request token is successfully performed, the second call will
+-- not perform the action again.
+--
+-- Note that request tokens are valid only for a few minutes. You cannot
+-- use request tokens to dedupe requests spanning hours or days.
+startTableDataImportJob_clientRequestToken :: Lens.Lens' StartTableDataImportJob Prelude.Text
+startTableDataImportJob_clientRequestToken = Lens.lens (\StartTableDataImportJob' {clientRequestToken} -> clientRequestToken) (\s@StartTableDataImportJob' {} a -> s {clientRequestToken = a} :: StartTableDataImportJob)
+
+instance Core.AWSRequest StartTableDataImportJob where
+  type
+    AWSResponse StartTableDataImportJob =
+      StartTableDataImportJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          StartTableDataImportJobResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "jobId")
+            Prelude.<*> (x Data..:> "jobStatus")
+      )
+
+instance Prelude.Hashable StartTableDataImportJob where
+  hashWithSalt _salt StartTableDataImportJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` workbookId
+      `Prelude.hashWithSalt` dataSource
+      `Prelude.hashWithSalt` dataFormat
+      `Prelude.hashWithSalt` destinationTableId
+      `Prelude.hashWithSalt` importOptions
+      `Prelude.hashWithSalt` clientRequestToken
+
+instance Prelude.NFData StartTableDataImportJob where
+  rnf StartTableDataImportJob' {..} =
+    Prelude.rnf workbookId
+      `Prelude.seq` Prelude.rnf dataSource
+      `Prelude.seq` Prelude.rnf dataFormat
+      `Prelude.seq` Prelude.rnf destinationTableId
+      `Prelude.seq` Prelude.rnf importOptions
+      `Prelude.seq` Prelude.rnf clientRequestToken
+
+instance Data.ToHeaders StartTableDataImportJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON StartTableDataImportJob where
+  toJSON StartTableDataImportJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("dataSource" Data..= dataSource),
+            Prelude.Just ("dataFormat" Data..= dataFormat),
+            Prelude.Just ("importOptions" Data..= importOptions),
+            Prelude.Just
+              ("clientRequestToken" Data..= clientRequestToken)
+          ]
+      )
+
+instance Data.ToPath StartTableDataImportJob where
+  toPath StartTableDataImportJob' {..} =
+    Prelude.mconcat
+      [ "/workbooks/",
+        Data.toBS workbookId,
+        "/tables/",
+        Data.toBS destinationTableId,
+        "/import"
+      ]
+
+instance Data.ToQuery StartTableDataImportJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newStartTableDataImportJobResponse' smart constructor.
+data StartTableDataImportJobResponse = StartTableDataImportJobResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The id that is assigned to this import job. Future requests to find out
+    -- the status of this import job need to send this id in the appropriate
+    -- parameter in the request.
+    jobId :: Prelude.Text,
+    -- | The status of the import job immediately after submitting the request.
+    jobStatus :: TableDataImportJobStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartTableDataImportJobResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'startTableDataImportJobResponse_httpStatus' - The response's http status code.
+--
+-- 'jobId', 'startTableDataImportJobResponse_jobId' - The id that is assigned to this import job. Future requests to find out
+-- the status of this import job need to send this id in the appropriate
+-- parameter in the request.
+--
+-- 'jobStatus', 'startTableDataImportJobResponse_jobStatus' - The status of the import job immediately after submitting the request.
+newStartTableDataImportJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'jobId'
+  Prelude.Text ->
+  -- | 'jobStatus'
+  TableDataImportJobStatus ->
+  StartTableDataImportJobResponse
+newStartTableDataImportJobResponse
+  pHttpStatus_
+  pJobId_
+  pJobStatus_ =
+    StartTableDataImportJobResponse'
+      { httpStatus =
+          pHttpStatus_,
+        jobId = pJobId_,
+        jobStatus = pJobStatus_
+      }
+
+-- | The response's http status code.
+startTableDataImportJobResponse_httpStatus :: Lens.Lens' StartTableDataImportJobResponse Prelude.Int
+startTableDataImportJobResponse_httpStatus = Lens.lens (\StartTableDataImportJobResponse' {httpStatus} -> httpStatus) (\s@StartTableDataImportJobResponse' {} a -> s {httpStatus = a} :: StartTableDataImportJobResponse)
+
+-- | The id that is assigned to this import job. Future requests to find out
+-- the status of this import job need to send this id in the appropriate
+-- parameter in the request.
+startTableDataImportJobResponse_jobId :: Lens.Lens' StartTableDataImportJobResponse Prelude.Text
+startTableDataImportJobResponse_jobId = Lens.lens (\StartTableDataImportJobResponse' {jobId} -> jobId) (\s@StartTableDataImportJobResponse' {} a -> s {jobId = a} :: StartTableDataImportJobResponse)
+
+-- | The status of the import job immediately after submitting the request.
+startTableDataImportJobResponse_jobStatus :: Lens.Lens' StartTableDataImportJobResponse TableDataImportJobStatus
+startTableDataImportJobResponse_jobStatus = Lens.lens (\StartTableDataImportJobResponse' {jobStatus} -> jobStatus) (\s@StartTableDataImportJobResponse' {} a -> s {jobStatus = a} :: StartTableDataImportJobResponse)
+
+instance
+  Prelude.NFData
+    StartTableDataImportJobResponse
+  where
+  rnf StartTableDataImportJobResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf jobId
+      `Prelude.seq` Prelude.rnf jobStatus
diff --git a/gen/Amazonka/HoneyCode/TagResource.hs b/gen/Amazonka/HoneyCode/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/TagResource.hs
@@ -0,0 +1,164 @@
+{-# 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.HoneyCode.TagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- The TagResource API allows you to add tags to an ARN-able resource.
+-- Resource includes workbook, table, screen and screen-automation.
+module Amazonka.HoneyCode.TagResource
+  ( -- * Creating a Request
+    TagResource (..),
+    newTagResource,
+
+    -- * Request Lenses
+    tagResource_resourceArn,
+    tagResource_tags,
+
+    -- * Destructuring the Response
+    TagResourceResponse (..),
+    newTagResourceResponse,
+
+    -- * Response Lenses
+    tagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newTagResource' smart constructor.
+data TagResource = TagResource'
+  { -- | The resource\'s Amazon Resource Name (ARN).
+    resourceArn :: Prelude.Text,
+    -- | A list of tags to apply to the resource.
+    tags :: Prelude.HashMap Prelude.Text Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'tagResource_resourceArn' - The resource\'s Amazon Resource Name (ARN).
+--
+-- 'tags', 'tagResource_tags' - A list of tags to apply to the resource.
+newTagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  TagResource
+newTagResource pResourceArn_ =
+  TagResource'
+    { resourceArn = pResourceArn_,
+      tags = Prelude.mempty
+    }
+
+-- | The resource\'s Amazon Resource Name (ARN).
+tagResource_resourceArn :: Lens.Lens' TagResource Prelude.Text
+tagResource_resourceArn = Lens.lens (\TagResource' {resourceArn} -> resourceArn) (\s@TagResource' {} a -> s {resourceArn = a} :: TagResource)
+
+-- | A list of tags to apply to the resource.
+tagResource_tags :: Lens.Lens' TagResource (Prelude.HashMap Prelude.Text Prelude.Text)
+tagResource_tags = Lens.lens (\TagResource' {tags} -> tags) (\s@TagResource' {} a -> s {tags = a} :: TagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest TagResource where
+  type AWSResponse TagResource = TagResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          TagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable TagResource where
+  hashWithSalt _salt TagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData TagResource where
+  rnf TagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tags
+
+instance Data.ToHeaders TagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON TagResource where
+  toJSON TagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("tags" Data..= tags)]
+      )
+
+instance Data.ToPath TagResource where
+  toPath TagResource' {..} =
+    Prelude.mconcat ["/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery TagResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newTagResourceResponse' smart constructor.
+data TagResourceResponse = TagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'tagResourceResponse_httpStatus' - The response's http status code.
+newTagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  TagResourceResponse
+newTagResourceResponse pHttpStatus_ =
+  TagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+tagResourceResponse_httpStatus :: Lens.Lens' TagResourceResponse Prelude.Int
+tagResourceResponse_httpStatus = Lens.lens (\TagResourceResponse' {httpStatus} -> httpStatus) (\s@TagResourceResponse' {} a -> s {httpStatus = a} :: TagResourceResponse)
+
+instance Prelude.NFData TagResourceResponse where
+  rnf TagResourceResponse' {..} = Prelude.rnf httpStatus
diff --git a/gen/Amazonka/HoneyCode/Types.hs b/gen/Amazonka/HoneyCode/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types.hs
@@ -0,0 +1,388 @@
+{-# 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.HoneyCode.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.HoneyCode.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _AccessDeniedException,
+    _AutomationExecutionException,
+    _AutomationExecutionTimeoutException,
+    _InternalServerException,
+    _RequestTimeoutException,
+    _ResourceNotFoundException,
+    _ServiceQuotaExceededException,
+    _ServiceUnavailableException,
+    _ThrottlingException,
+    _ValidationException,
+
+    -- * ErrorCode
+    ErrorCode (..),
+
+    -- * Format
+    Format (..),
+
+    -- * ImportDataCharacterEncoding
+    ImportDataCharacterEncoding (..),
+
+    -- * ImportSourceDataFormat
+    ImportSourceDataFormat (..),
+
+    -- * TableDataImportJobStatus
+    TableDataImportJobStatus (..),
+
+    -- * UpsertAction
+    UpsertAction (..),
+
+    -- * Cell
+    Cell (..),
+    newCell,
+    cell_format,
+    cell_formattedValue,
+    cell_formattedValues,
+    cell_formula,
+    cell_rawValue,
+
+    -- * CellInput
+    CellInput (..),
+    newCellInput,
+    cellInput_fact,
+    cellInput_facts,
+
+    -- * ColumnMetadata
+    ColumnMetadata (..),
+    newColumnMetadata,
+    columnMetadata_name,
+    columnMetadata_format,
+
+    -- * CreateRowData
+    CreateRowData (..),
+    newCreateRowData,
+    createRowData_batchItemId,
+    createRowData_cellsToCreate,
+
+    -- * DataItem
+    DataItem (..),
+    newDataItem,
+    dataItem_formattedValue,
+    dataItem_overrideFormat,
+    dataItem_rawValue,
+
+    -- * DelimitedTextImportOptions
+    DelimitedTextImportOptions (..),
+    newDelimitedTextImportOptions,
+    delimitedTextImportOptions_dataCharacterEncoding,
+    delimitedTextImportOptions_hasHeaderRow,
+    delimitedTextImportOptions_ignoreEmptyRows,
+    delimitedTextImportOptions_delimiter,
+
+    -- * DestinationOptions
+    DestinationOptions (..),
+    newDestinationOptions,
+    destinationOptions_columnMap,
+
+    -- * FailedBatchItem
+    FailedBatchItem (..),
+    newFailedBatchItem,
+    failedBatchItem_id,
+    failedBatchItem_errorMessage,
+
+    -- * Filter
+    Filter (..),
+    newFilter,
+    filter_contextRowId,
+    filter_formula,
+
+    -- * ImportDataSource
+    ImportDataSource (..),
+    newImportDataSource,
+    importDataSource_dataSourceConfig,
+
+    -- * ImportDataSourceConfig
+    ImportDataSourceConfig (..),
+    newImportDataSourceConfig,
+    importDataSourceConfig_dataSourceUrl,
+
+    -- * ImportJobSubmitter
+    ImportJobSubmitter (..),
+    newImportJobSubmitter,
+    importJobSubmitter_email,
+    importJobSubmitter_userArn,
+
+    -- * ImportOptions
+    ImportOptions (..),
+    newImportOptions,
+    importOptions_delimitedTextOptions,
+    importOptions_destinationOptions,
+
+    -- * ResultRow
+    ResultRow (..),
+    newResultRow,
+    resultRow_rowId,
+    resultRow_dataItems,
+
+    -- * ResultSet
+    ResultSet (..),
+    newResultSet,
+    resultSet_headers,
+    resultSet_rows,
+
+    -- * SourceDataColumnProperties
+    SourceDataColumnProperties (..),
+    newSourceDataColumnProperties,
+    sourceDataColumnProperties_columnIndex,
+
+    -- * Table
+    Table (..),
+    newTable,
+    table_tableId,
+    table_tableName,
+
+    -- * TableColumn
+    TableColumn (..),
+    newTableColumn,
+    tableColumn_format,
+    tableColumn_tableColumnId,
+    tableColumn_tableColumnName,
+
+    -- * TableDataImportJobMetadata
+    TableDataImportJobMetadata (..),
+    newTableDataImportJobMetadata,
+    tableDataImportJobMetadata_submitter,
+    tableDataImportJobMetadata_submitTime,
+    tableDataImportJobMetadata_importOptions,
+    tableDataImportJobMetadata_dataSource,
+
+    -- * TableRow
+    TableRow (..),
+    newTableRow,
+    tableRow_rowId,
+    tableRow_cells,
+
+    -- * UpdateRowData
+    UpdateRowData (..),
+    newUpdateRowData,
+    updateRowData_rowId,
+    updateRowData_cellsToUpdate,
+
+    -- * UpsertRowData
+    UpsertRowData (..),
+    newUpsertRowData,
+    upsertRowData_batchItemId,
+    upsertRowData_filter,
+    upsertRowData_cellsToUpdate,
+
+    -- * UpsertRowsResult
+    UpsertRowsResult (..),
+    newUpsertRowsResult,
+    upsertRowsResult_rowIds,
+    upsertRowsResult_upsertAction,
+
+    -- * VariableValue
+    VariableValue (..),
+    newVariableValue,
+    variableValue_rawValue,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import Amazonka.HoneyCode.Types.Cell
+import Amazonka.HoneyCode.Types.CellInput
+import Amazonka.HoneyCode.Types.ColumnMetadata
+import Amazonka.HoneyCode.Types.CreateRowData
+import Amazonka.HoneyCode.Types.DataItem
+import Amazonka.HoneyCode.Types.DelimitedTextImportOptions
+import Amazonka.HoneyCode.Types.DestinationOptions
+import Amazonka.HoneyCode.Types.ErrorCode
+import Amazonka.HoneyCode.Types.FailedBatchItem
+import Amazonka.HoneyCode.Types.Filter
+import Amazonka.HoneyCode.Types.Format
+import Amazonka.HoneyCode.Types.ImportDataCharacterEncoding
+import Amazonka.HoneyCode.Types.ImportDataSource
+import Amazonka.HoneyCode.Types.ImportDataSourceConfig
+import Amazonka.HoneyCode.Types.ImportJobSubmitter
+import Amazonka.HoneyCode.Types.ImportOptions
+import Amazonka.HoneyCode.Types.ImportSourceDataFormat
+import Amazonka.HoneyCode.Types.ResultRow
+import Amazonka.HoneyCode.Types.ResultSet
+import Amazonka.HoneyCode.Types.SourceDataColumnProperties
+import Amazonka.HoneyCode.Types.Table
+import Amazonka.HoneyCode.Types.TableColumn
+import Amazonka.HoneyCode.Types.TableDataImportJobMetadata
+import Amazonka.HoneyCode.Types.TableDataImportJobStatus
+import Amazonka.HoneyCode.Types.TableRow
+import Amazonka.HoneyCode.Types.UpdateRowData
+import Amazonka.HoneyCode.Types.UpsertAction
+import Amazonka.HoneyCode.Types.UpsertRowData
+import Amazonka.HoneyCode.Types.UpsertRowsResult
+import Amazonka.HoneyCode.Types.VariableValue
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2020-03-01@ of the Amazon Honeycode SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "HoneyCode",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "honeycode",
+      Core.signingName = "honeycode",
+      Core.version = "2020-03-01",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "HoneyCode",
+      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. Check that the
+-- workbook is owned by you and your IAM policy allows access to the
+-- resource in the request.
+_AccessDeniedException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_AccessDeniedException =
+  Core._MatchServiceError
+    defaultService
+    "AccessDeniedException"
+    Prelude.. Core.hasStatus 403
+
+-- | The automation execution did not end successfully.
+_AutomationExecutionException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_AutomationExecutionException =
+  Core._MatchServiceError
+    defaultService
+    "AutomationExecutionException"
+    Prelude.. Core.hasStatus 400
+
+-- | The automation execution timed out.
+_AutomationExecutionTimeoutException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_AutomationExecutionTimeoutException =
+  Core._MatchServiceError
+    defaultService
+    "AutomationExecutionTimeoutException"
+    Prelude.. Core.hasStatus 504
+
+-- | There were unexpected errors from the server.
+_InternalServerException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalServerException =
+  Core._MatchServiceError
+    defaultService
+    "InternalServerException"
+    Prelude.. Core.hasStatus 500
+
+-- | The request timed out.
+_RequestTimeoutException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_RequestTimeoutException =
+  Core._MatchServiceError
+    defaultService
+    "RequestTimeoutException"
+    Prelude.. Core.hasStatus 504
+
+-- | A Workbook, Table, App, Screen or Screen Automation was not found with
+-- the given ID.
+_ResourceNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNotFoundException"
+    Prelude.. Core.hasStatus 404
+
+-- | The request caused service quota to be breached.
+_ServiceQuotaExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ServiceQuotaExceededException =
+  Core._MatchServiceError
+    defaultService
+    "ServiceQuotaExceededException"
+    Prelude.. Core.hasStatus 402
+
+-- | Remote service is unreachable.
+_ServiceUnavailableException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ServiceUnavailableException =
+  Core._MatchServiceError
+    defaultService
+    "ServiceUnavailableException"
+    Prelude.. Core.hasStatus 503
+
+-- | Tps(transactions per second) rate reached.
+_ThrottlingException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ThrottlingException =
+  Core._MatchServiceError
+    defaultService
+    "ThrottlingException"
+    Prelude.. Core.hasStatus 429
+
+-- | Request is invalid. The message in the response contains details on why
+-- the request is invalid.
+_ValidationException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ValidationException =
+  Core._MatchServiceError
+    defaultService
+    "ValidationException"
+    Prelude.. Core.hasStatus 400
diff --git a/gen/Amazonka/HoneyCode/Types/Cell.hs b/gen/Amazonka/HoneyCode/Types/Cell.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/Cell.hs
@@ -0,0 +1,340 @@
+{-# 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.HoneyCode.Types.Cell
+-- 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.HoneyCode.Types.Cell where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types.Format
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a single cell in a table.
+--
+-- /See:/ 'newCell' smart constructor.
+data Cell = Cell'
+  { -- | The format of the cell. If this field is empty, then the format is
+    -- either not specified in the workbook or the format is set to AUTO.
+    format :: Prelude.Maybe Format,
+    -- | The formatted value of the cell. This is the value that you see
+    -- displayed in the cell in the UI.
+    --
+    -- Note that the formatted value of a cell is always represented as a
+    -- string irrespective of the data that is stored in the cell. For example,
+    -- if a cell contains a date, the formatted value of the cell is the string
+    -- representation of the formatted date being shown in the cell in the UI.
+    -- See details in the rawValue field below for how cells of different
+    -- formats will have different raw and formatted values.
+    formattedValue :: Prelude.Maybe Prelude.Text,
+    -- | A list of formatted values of the cell. This field is only returned when
+    -- the cell is ROWSET format (aka multi-select or multi-record picklist).
+    -- Values in the list are always represented as strings. The formattedValue
+    -- field will be empty if this field is returned.
+    formattedValues :: Prelude.Maybe [Prelude.Text],
+    -- | The formula contained in the cell. This field is empty if a cell does
+    -- not have a formula.
+    formula :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The raw value of the data contained in the cell. The raw value depends
+    -- on the format of the data in the cell. However the attribute in the API
+    -- return value is always a string containing the raw value.
+    --
+    -- Cells with format DATE, DATE_TIME or TIME have the raw value as a
+    -- floating point number where the whole number represents the number of
+    -- days since 1\/1\/1900 and the fractional part represents the fraction of
+    -- the day since midnight. For example, a cell with date 11\/3\/2020 has
+    -- the raw value \"44138\". A cell with the time 9:00 AM has the raw value
+    -- \"0.375\" and a cell with date\/time value of 11\/3\/2020 9:00 AM has
+    -- the raw value \"44138.375\". Notice that even though the raw value is a
+    -- number in all three cases, it is still represented as a string.
+    --
+    -- Cells with format NUMBER, CURRENCY, PERCENTAGE and ACCOUNTING have the
+    -- raw value of the data as the number representing the data being
+    -- displayed. For example, the number 1.325 with two decimal places in the
+    -- format will have it\'s raw value as \"1.325\" and formatted value as
+    -- \"1.33\". A currency value for $10 will have the raw value as \"10\" and
+    -- formatted value as \"$10.00\". A value representing 20% with two decimal
+    -- places in the format will have its raw value as \"0.2\" and the
+    -- formatted value as \"20.00%\". An accounting value of -$25 will have
+    -- \"-25\" as the raw value and \"$ (25.00)\" as the formatted value.
+    --
+    -- Cells with format TEXT will have the raw text as the raw value. For
+    -- example, a cell with text \"John Smith\" will have \"John Smith\" as
+    -- both the raw value and the formatted value.
+    --
+    -- Cells with format CONTACT will have the name of the contact as a
+    -- formatted value and the email address of the contact as the raw value.
+    -- For example, a contact for John Smith will have \"John Smith\" as the
+    -- formatted value and \"john.smith\@example.com\" as the raw value.
+    --
+    -- Cells with format ROWLINK (aka picklist) will have the first column of
+    -- the linked row as the formatted value and the row id of the linked row
+    -- as the raw value. For example, a cell containing a picklist to a table
+    -- that displays task status might have \"Completed\" as the formatted
+    -- value and
+    -- \"row:dfcefaee-5b37-4355-8f28-40c3e4ff5dd4\/ca432b2f-b8eb-431d-9fb5-cbe0342f9f03\"
+    -- as the raw value.
+    --
+    -- Cells with format ROWSET (aka multi-select or multi-record picklist)
+    -- will by default have the first column of each of the linked rows as the
+    -- formatted value in the list, and the rowset id of the linked rows as the
+    -- raw value. For example, a cell containing a multi-select picklist to a
+    -- table that contains items might have \"Item A\", \"Item B\" in the
+    -- formatted value list and \"rows:b742c1f4-6cb0-4650-a845-35eb86fcc2bb\/
+    -- [fdea123b-8f68-474a-aa8a-5ff87aa333af,6daf41f0-a138-4eee-89da-123086d36ecf]\"
+    -- as the raw value.
+    --
+    -- Cells with format ATTACHMENT will have the name of the attachment as the
+    -- formatted value and the attachment id as the raw value. For example, a
+    -- cell containing an attachment named \"image.jpeg\" will have
+    -- \"image.jpeg\" as the formatted value and
+    -- \"attachment:ca432b2f-b8eb-431d-9fb5-cbe0342f9f03\" as the raw value.
+    --
+    -- Cells with format AUTO or cells without any format that are
+    -- auto-detected as one of the formats above will contain the raw and
+    -- formatted values as mentioned above, based on the auto-detected formats.
+    -- If there is no auto-detected format, the raw and formatted values will
+    -- be the same as the data in the cell.
+    rawValue :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Cell' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'format', 'cell_format' - The format of the cell. If this field is empty, then the format is
+-- either not specified in the workbook or the format is set to AUTO.
+--
+-- 'formattedValue', 'cell_formattedValue' - The formatted value of the cell. This is the value that you see
+-- displayed in the cell in the UI.
+--
+-- Note that the formatted value of a cell is always represented as a
+-- string irrespective of the data that is stored in the cell. For example,
+-- if a cell contains a date, the formatted value of the cell is the string
+-- representation of the formatted date being shown in the cell in the UI.
+-- See details in the rawValue field below for how cells of different
+-- formats will have different raw and formatted values.
+--
+-- 'formattedValues', 'cell_formattedValues' - A list of formatted values of the cell. This field is only returned when
+-- the cell is ROWSET format (aka multi-select or multi-record picklist).
+-- Values in the list are always represented as strings. The formattedValue
+-- field will be empty if this field is returned.
+--
+-- 'formula', 'cell_formula' - The formula contained in the cell. This field is empty if a cell does
+-- not have a formula.
+--
+-- 'rawValue', 'cell_rawValue' - The raw value of the data contained in the cell. The raw value depends
+-- on the format of the data in the cell. However the attribute in the API
+-- return value is always a string containing the raw value.
+--
+-- Cells with format DATE, DATE_TIME or TIME have the raw value as a
+-- floating point number where the whole number represents the number of
+-- days since 1\/1\/1900 and the fractional part represents the fraction of
+-- the day since midnight. For example, a cell with date 11\/3\/2020 has
+-- the raw value \"44138\". A cell with the time 9:00 AM has the raw value
+-- \"0.375\" and a cell with date\/time value of 11\/3\/2020 9:00 AM has
+-- the raw value \"44138.375\". Notice that even though the raw value is a
+-- number in all three cases, it is still represented as a string.
+--
+-- Cells with format NUMBER, CURRENCY, PERCENTAGE and ACCOUNTING have the
+-- raw value of the data as the number representing the data being
+-- displayed. For example, the number 1.325 with two decimal places in the
+-- format will have it\'s raw value as \"1.325\" and formatted value as
+-- \"1.33\". A currency value for $10 will have the raw value as \"10\" and
+-- formatted value as \"$10.00\". A value representing 20% with two decimal
+-- places in the format will have its raw value as \"0.2\" and the
+-- formatted value as \"20.00%\". An accounting value of -$25 will have
+-- \"-25\" as the raw value and \"$ (25.00)\" as the formatted value.
+--
+-- Cells with format TEXT will have the raw text as the raw value. For
+-- example, a cell with text \"John Smith\" will have \"John Smith\" as
+-- both the raw value and the formatted value.
+--
+-- Cells with format CONTACT will have the name of the contact as a
+-- formatted value and the email address of the contact as the raw value.
+-- For example, a contact for John Smith will have \"John Smith\" as the
+-- formatted value and \"john.smith\@example.com\" as the raw value.
+--
+-- Cells with format ROWLINK (aka picklist) will have the first column of
+-- the linked row as the formatted value and the row id of the linked row
+-- as the raw value. For example, a cell containing a picklist to a table
+-- that displays task status might have \"Completed\" as the formatted
+-- value and
+-- \"row:dfcefaee-5b37-4355-8f28-40c3e4ff5dd4\/ca432b2f-b8eb-431d-9fb5-cbe0342f9f03\"
+-- as the raw value.
+--
+-- Cells with format ROWSET (aka multi-select or multi-record picklist)
+-- will by default have the first column of each of the linked rows as the
+-- formatted value in the list, and the rowset id of the linked rows as the
+-- raw value. For example, a cell containing a multi-select picklist to a
+-- table that contains items might have \"Item A\", \"Item B\" in the
+-- formatted value list and \"rows:b742c1f4-6cb0-4650-a845-35eb86fcc2bb\/
+-- [fdea123b-8f68-474a-aa8a-5ff87aa333af,6daf41f0-a138-4eee-89da-123086d36ecf]\"
+-- as the raw value.
+--
+-- Cells with format ATTACHMENT will have the name of the attachment as the
+-- formatted value and the attachment id as the raw value. For example, a
+-- cell containing an attachment named \"image.jpeg\" will have
+-- \"image.jpeg\" as the formatted value and
+-- \"attachment:ca432b2f-b8eb-431d-9fb5-cbe0342f9f03\" as the raw value.
+--
+-- Cells with format AUTO or cells without any format that are
+-- auto-detected as one of the formats above will contain the raw and
+-- formatted values as mentioned above, based on the auto-detected formats.
+-- If there is no auto-detected format, the raw and formatted values will
+-- be the same as the data in the cell.
+newCell ::
+  Cell
+newCell =
+  Cell'
+    { format = Prelude.Nothing,
+      formattedValue = Prelude.Nothing,
+      formattedValues = Prelude.Nothing,
+      formula = Prelude.Nothing,
+      rawValue = Prelude.Nothing
+    }
+
+-- | The format of the cell. If this field is empty, then the format is
+-- either not specified in the workbook or the format is set to AUTO.
+cell_format :: Lens.Lens' Cell (Prelude.Maybe Format)
+cell_format = Lens.lens (\Cell' {format} -> format) (\s@Cell' {} a -> s {format = a} :: Cell)
+
+-- | The formatted value of the cell. This is the value that you see
+-- displayed in the cell in the UI.
+--
+-- Note that the formatted value of a cell is always represented as a
+-- string irrespective of the data that is stored in the cell. For example,
+-- if a cell contains a date, the formatted value of the cell is the string
+-- representation of the formatted date being shown in the cell in the UI.
+-- See details in the rawValue field below for how cells of different
+-- formats will have different raw and formatted values.
+cell_formattedValue :: Lens.Lens' Cell (Prelude.Maybe Prelude.Text)
+cell_formattedValue = Lens.lens (\Cell' {formattedValue} -> formattedValue) (\s@Cell' {} a -> s {formattedValue = a} :: Cell)
+
+-- | A list of formatted values of the cell. This field is only returned when
+-- the cell is ROWSET format (aka multi-select or multi-record picklist).
+-- Values in the list are always represented as strings. The formattedValue
+-- field will be empty if this field is returned.
+cell_formattedValues :: Lens.Lens' Cell (Prelude.Maybe [Prelude.Text])
+cell_formattedValues = Lens.lens (\Cell' {formattedValues} -> formattedValues) (\s@Cell' {} a -> s {formattedValues = a} :: Cell) Prelude.. Lens.mapping Lens.coerced
+
+-- | The formula contained in the cell. This field is empty if a cell does
+-- not have a formula.
+cell_formula :: Lens.Lens' Cell (Prelude.Maybe Prelude.Text)
+cell_formula = Lens.lens (\Cell' {formula} -> formula) (\s@Cell' {} a -> s {formula = a} :: Cell) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The raw value of the data contained in the cell. The raw value depends
+-- on the format of the data in the cell. However the attribute in the API
+-- return value is always a string containing the raw value.
+--
+-- Cells with format DATE, DATE_TIME or TIME have the raw value as a
+-- floating point number where the whole number represents the number of
+-- days since 1\/1\/1900 and the fractional part represents the fraction of
+-- the day since midnight. For example, a cell with date 11\/3\/2020 has
+-- the raw value \"44138\". A cell with the time 9:00 AM has the raw value
+-- \"0.375\" and a cell with date\/time value of 11\/3\/2020 9:00 AM has
+-- the raw value \"44138.375\". Notice that even though the raw value is a
+-- number in all three cases, it is still represented as a string.
+--
+-- Cells with format NUMBER, CURRENCY, PERCENTAGE and ACCOUNTING have the
+-- raw value of the data as the number representing the data being
+-- displayed. For example, the number 1.325 with two decimal places in the
+-- format will have it\'s raw value as \"1.325\" and formatted value as
+-- \"1.33\". A currency value for $10 will have the raw value as \"10\" and
+-- formatted value as \"$10.00\". A value representing 20% with two decimal
+-- places in the format will have its raw value as \"0.2\" and the
+-- formatted value as \"20.00%\". An accounting value of -$25 will have
+-- \"-25\" as the raw value and \"$ (25.00)\" as the formatted value.
+--
+-- Cells with format TEXT will have the raw text as the raw value. For
+-- example, a cell with text \"John Smith\" will have \"John Smith\" as
+-- both the raw value and the formatted value.
+--
+-- Cells with format CONTACT will have the name of the contact as a
+-- formatted value and the email address of the contact as the raw value.
+-- For example, a contact for John Smith will have \"John Smith\" as the
+-- formatted value and \"john.smith\@example.com\" as the raw value.
+--
+-- Cells with format ROWLINK (aka picklist) will have the first column of
+-- the linked row as the formatted value and the row id of the linked row
+-- as the raw value. For example, a cell containing a picklist to a table
+-- that displays task status might have \"Completed\" as the formatted
+-- value and
+-- \"row:dfcefaee-5b37-4355-8f28-40c3e4ff5dd4\/ca432b2f-b8eb-431d-9fb5-cbe0342f9f03\"
+-- as the raw value.
+--
+-- Cells with format ROWSET (aka multi-select or multi-record picklist)
+-- will by default have the first column of each of the linked rows as the
+-- formatted value in the list, and the rowset id of the linked rows as the
+-- raw value. For example, a cell containing a multi-select picklist to a
+-- table that contains items might have \"Item A\", \"Item B\" in the
+-- formatted value list and \"rows:b742c1f4-6cb0-4650-a845-35eb86fcc2bb\/
+-- [fdea123b-8f68-474a-aa8a-5ff87aa333af,6daf41f0-a138-4eee-89da-123086d36ecf]\"
+-- as the raw value.
+--
+-- Cells with format ATTACHMENT will have the name of the attachment as the
+-- formatted value and the attachment id as the raw value. For example, a
+-- cell containing an attachment named \"image.jpeg\" will have
+-- \"image.jpeg\" as the formatted value and
+-- \"attachment:ca432b2f-b8eb-431d-9fb5-cbe0342f9f03\" as the raw value.
+--
+-- Cells with format AUTO or cells without any format that are
+-- auto-detected as one of the formats above will contain the raw and
+-- formatted values as mentioned above, based on the auto-detected formats.
+-- If there is no auto-detected format, the raw and formatted values will
+-- be the same as the data in the cell.
+cell_rawValue :: Lens.Lens' Cell (Prelude.Maybe Prelude.Text)
+cell_rawValue = Lens.lens (\Cell' {rawValue} -> rawValue) (\s@Cell' {} a -> s {rawValue = a} :: Cell)
+
+instance Data.FromJSON Cell where
+  parseJSON =
+    Data.withObject
+      "Cell"
+      ( \x ->
+          Cell'
+            Prelude.<$> (x Data..:? "format")
+            Prelude.<*> (x Data..:? "formattedValue")
+            Prelude.<*> ( x
+                            Data..:? "formattedValues"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "formula")
+            Prelude.<*> (x Data..:? "rawValue")
+      )
+
+instance Prelude.Hashable Cell where
+  hashWithSalt _salt Cell' {..} =
+    _salt
+      `Prelude.hashWithSalt` format
+      `Prelude.hashWithSalt` formattedValue
+      `Prelude.hashWithSalt` formattedValues
+      `Prelude.hashWithSalt` formula
+      `Prelude.hashWithSalt` rawValue
+
+instance Prelude.NFData Cell where
+  rnf Cell' {..} =
+    Prelude.rnf format
+      `Prelude.seq` Prelude.rnf formattedValue
+      `Prelude.seq` Prelude.rnf formattedValues
+      `Prelude.seq` Prelude.rnf formula
+      `Prelude.seq` Prelude.rnf rawValue
diff --git a/gen/Amazonka/HoneyCode/Types/CellInput.hs b/gen/Amazonka/HoneyCode/Types/CellInput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/CellInput.hs
@@ -0,0 +1,95 @@
+{-# 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.HoneyCode.Types.CellInput
+-- 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.HoneyCode.Types.CellInput 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
+
+-- | CellInput object contains the data needed to create or update cells in a
+-- table.
+--
+-- CellInput object has only a facts field or a fact field, but not both. A
+-- 400 bad request will be thrown if both fact and facts field are present.
+--
+-- /See:/ 'newCellInput' smart constructor.
+data CellInput = CellInput'
+  { -- | Fact represents the data that is entered into a cell. This data can be
+    -- free text or a formula. Formulas need to start with the equals (=) sign.
+    fact :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A list representing the values that are entered into a ROWSET cell.
+    -- Facts list can have either only values or rowIDs, and rowIDs should from
+    -- the same table.
+    facts :: Prelude.Maybe [Data.Sensitive Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CellInput' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'fact', 'cellInput_fact' - Fact represents the data that is entered into a cell. This data can be
+-- free text or a formula. Formulas need to start with the equals (=) sign.
+--
+-- 'facts', 'cellInput_facts' - A list representing the values that are entered into a ROWSET cell.
+-- Facts list can have either only values or rowIDs, and rowIDs should from
+-- the same table.
+newCellInput ::
+  CellInput
+newCellInput =
+  CellInput'
+    { fact = Prelude.Nothing,
+      facts = Prelude.Nothing
+    }
+
+-- | Fact represents the data that is entered into a cell. This data can be
+-- free text or a formula. Formulas need to start with the equals (=) sign.
+cellInput_fact :: Lens.Lens' CellInput (Prelude.Maybe Prelude.Text)
+cellInput_fact = Lens.lens (\CellInput' {fact} -> fact) (\s@CellInput' {} a -> s {fact = a} :: CellInput) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A list representing the values that are entered into a ROWSET cell.
+-- Facts list can have either only values or rowIDs, and rowIDs should from
+-- the same table.
+cellInput_facts :: Lens.Lens' CellInput (Prelude.Maybe [Prelude.Text])
+cellInput_facts = Lens.lens (\CellInput' {facts} -> facts) (\s@CellInput' {} a -> s {facts = a} :: CellInput) Prelude.. Lens.mapping Lens.coerced
+
+instance Prelude.Hashable CellInput where
+  hashWithSalt _salt CellInput' {..} =
+    _salt
+      `Prelude.hashWithSalt` fact
+      `Prelude.hashWithSalt` facts
+
+instance Prelude.NFData CellInput where
+  rnf CellInput' {..} =
+    Prelude.rnf fact `Prelude.seq` Prelude.rnf facts
+
+instance Data.ToJSON CellInput where
+  toJSON CellInput' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("fact" Data..=) Prelude.<$> fact,
+            ("facts" Data..=) Prelude.<$> facts
+          ]
+      )
diff --git a/gen/Amazonka/HoneyCode/Types/ColumnMetadata.hs b/gen/Amazonka/HoneyCode/Types/ColumnMetadata.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/ColumnMetadata.hs
@@ -0,0 +1,89 @@
+{-# 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.HoneyCode.Types.ColumnMetadata
+-- 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.HoneyCode.Types.ColumnMetadata where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types.Format
+import qualified Amazonka.Prelude as Prelude
+
+-- | Metadata for column in the table.
+--
+-- /See:/ 'newColumnMetadata' smart constructor.
+data ColumnMetadata = ColumnMetadata'
+  { -- | The name of the column.
+    name :: Data.Sensitive Prelude.Text,
+    -- | The format of the column.
+    format :: Format
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ColumnMetadata' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'name', 'columnMetadata_name' - The name of the column.
+--
+-- 'format', 'columnMetadata_format' - The format of the column.
+newColumnMetadata ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'format'
+  Format ->
+  ColumnMetadata
+newColumnMetadata pName_ pFormat_ =
+  ColumnMetadata'
+    { name =
+        Data._Sensitive Lens.# pName_,
+      format = pFormat_
+    }
+
+-- | The name of the column.
+columnMetadata_name :: Lens.Lens' ColumnMetadata Prelude.Text
+columnMetadata_name = Lens.lens (\ColumnMetadata' {name} -> name) (\s@ColumnMetadata' {} a -> s {name = a} :: ColumnMetadata) Prelude.. Data._Sensitive
+
+-- | The format of the column.
+columnMetadata_format :: Lens.Lens' ColumnMetadata Format
+columnMetadata_format = Lens.lens (\ColumnMetadata' {format} -> format) (\s@ColumnMetadata' {} a -> s {format = a} :: ColumnMetadata)
+
+instance Data.FromJSON ColumnMetadata where
+  parseJSON =
+    Data.withObject
+      "ColumnMetadata"
+      ( \x ->
+          ColumnMetadata'
+            Prelude.<$> (x Data..: "name")
+            Prelude.<*> (x Data..: "format")
+      )
+
+instance Prelude.Hashable ColumnMetadata where
+  hashWithSalt _salt ColumnMetadata' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` format
+
+instance Prelude.NFData ColumnMetadata where
+  rnf ColumnMetadata' {..} =
+    Prelude.rnf name `Prelude.seq` Prelude.rnf format
diff --git a/gen/Amazonka/HoneyCode/Types/CreateRowData.hs b/gen/Amazonka/HoneyCode/Types/CreateRowData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/CreateRowData.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.HoneyCode.Types.CreateRowData
+-- 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.HoneyCode.Types.CreateRowData where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types.CellInput
+import qualified Amazonka.Prelude as Prelude
+
+-- | Data needed to create a single row in a table as part of the
+-- BatchCreateTableRows request.
+--
+-- /See:/ 'newCreateRowData' smart constructor.
+data CreateRowData = CreateRowData'
+  { -- | An external identifier that represents the single row that is being
+    -- created as part of the BatchCreateTableRows request. This can be any
+    -- string that you can use to identify the row in the request. The
+    -- BatchCreateTableRows API puts the batch item id in the results to allow
+    -- you to link data in the request to data in the results.
+    batchItemId :: Prelude.Text,
+    -- | A map representing the cells to create in the new row. The key is the
+    -- column id of the cell and the value is the CellInput object that
+    -- represents the data to set in that cell.
+    cellsToCreate :: Prelude.HashMap Prelude.Text CellInput
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateRowData' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'batchItemId', 'createRowData_batchItemId' - An external identifier that represents the single row that is being
+-- created as part of the BatchCreateTableRows request. This can be any
+-- string that you can use to identify the row in the request. The
+-- BatchCreateTableRows API puts the batch item id in the results to allow
+-- you to link data in the request to data in the results.
+--
+-- 'cellsToCreate', 'createRowData_cellsToCreate' - A map representing the cells to create in the new row. The key is the
+-- column id of the cell and the value is the CellInput object that
+-- represents the data to set in that cell.
+newCreateRowData ::
+  -- | 'batchItemId'
+  Prelude.Text ->
+  CreateRowData
+newCreateRowData pBatchItemId_ =
+  CreateRowData'
+    { batchItemId = pBatchItemId_,
+      cellsToCreate = Prelude.mempty
+    }
+
+-- | An external identifier that represents the single row that is being
+-- created as part of the BatchCreateTableRows request. This can be any
+-- string that you can use to identify the row in the request. The
+-- BatchCreateTableRows API puts the batch item id in the results to allow
+-- you to link data in the request to data in the results.
+createRowData_batchItemId :: Lens.Lens' CreateRowData Prelude.Text
+createRowData_batchItemId = Lens.lens (\CreateRowData' {batchItemId} -> batchItemId) (\s@CreateRowData' {} a -> s {batchItemId = a} :: CreateRowData)
+
+-- | A map representing the cells to create in the new row. The key is the
+-- column id of the cell and the value is the CellInput object that
+-- represents the data to set in that cell.
+createRowData_cellsToCreate :: Lens.Lens' CreateRowData (Prelude.HashMap Prelude.Text CellInput)
+createRowData_cellsToCreate = Lens.lens (\CreateRowData' {cellsToCreate} -> cellsToCreate) (\s@CreateRowData' {} a -> s {cellsToCreate = a} :: CreateRowData) Prelude.. Lens.coerced
+
+instance Prelude.Hashable CreateRowData where
+  hashWithSalt _salt CreateRowData' {..} =
+    _salt
+      `Prelude.hashWithSalt` batchItemId
+      `Prelude.hashWithSalt` cellsToCreate
+
+instance Prelude.NFData CreateRowData where
+  rnf CreateRowData' {..} =
+    Prelude.rnf batchItemId
+      `Prelude.seq` Prelude.rnf cellsToCreate
+
+instance Data.ToJSON CreateRowData where
+  toJSON CreateRowData' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("batchItemId" Data..= batchItemId),
+            Prelude.Just
+              ("cellsToCreate" Data..= cellsToCreate)
+          ]
+      )
diff --git a/gen/Amazonka/HoneyCode/Types/DataItem.hs b/gen/Amazonka/HoneyCode/Types/DataItem.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/DataItem.hs
@@ -0,0 +1,103 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.HoneyCode.Types.DataItem
+-- 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.HoneyCode.Types.DataItem where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types.Format
+import qualified Amazonka.Prelude as Prelude
+
+-- | The data in a particular data cell defined on the screen.
+--
+-- /See:/ 'newDataItem' smart constructor.
+data DataItem = DataItem'
+  { -- | The formatted value of the data. e.g. John Smith.
+    formattedValue :: Prelude.Maybe Prelude.Text,
+    -- | The overrideFormat is optional and is specified only if a particular row
+    -- of data has a different format for the data than the default format
+    -- defined on the screen or the table.
+    overrideFormat :: Prelude.Maybe Format,
+    -- | The raw value of the data. e.g. jsmith\@example.com
+    rawValue :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DataItem' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'formattedValue', 'dataItem_formattedValue' - The formatted value of the data. e.g. John Smith.
+--
+-- 'overrideFormat', 'dataItem_overrideFormat' - The overrideFormat is optional and is specified only if a particular row
+-- of data has a different format for the data than the default format
+-- defined on the screen or the table.
+--
+-- 'rawValue', 'dataItem_rawValue' - The raw value of the data. e.g. jsmith\@example.com
+newDataItem ::
+  DataItem
+newDataItem =
+  DataItem'
+    { formattedValue = Prelude.Nothing,
+      overrideFormat = Prelude.Nothing,
+      rawValue = Prelude.Nothing
+    }
+
+-- | The formatted value of the data. e.g. John Smith.
+dataItem_formattedValue :: Lens.Lens' DataItem (Prelude.Maybe Prelude.Text)
+dataItem_formattedValue = Lens.lens (\DataItem' {formattedValue} -> formattedValue) (\s@DataItem' {} a -> s {formattedValue = a} :: DataItem)
+
+-- | The overrideFormat is optional and is specified only if a particular row
+-- of data has a different format for the data than the default format
+-- defined on the screen or the table.
+dataItem_overrideFormat :: Lens.Lens' DataItem (Prelude.Maybe Format)
+dataItem_overrideFormat = Lens.lens (\DataItem' {overrideFormat} -> overrideFormat) (\s@DataItem' {} a -> s {overrideFormat = a} :: DataItem)
+
+-- | The raw value of the data. e.g. jsmith\@example.com
+dataItem_rawValue :: Lens.Lens' DataItem (Prelude.Maybe Prelude.Text)
+dataItem_rawValue = Lens.lens (\DataItem' {rawValue} -> rawValue) (\s@DataItem' {} a -> s {rawValue = a} :: DataItem)
+
+instance Data.FromJSON DataItem where
+  parseJSON =
+    Data.withObject
+      "DataItem"
+      ( \x ->
+          DataItem'
+            Prelude.<$> (x Data..:? "formattedValue")
+            Prelude.<*> (x Data..:? "overrideFormat")
+            Prelude.<*> (x Data..:? "rawValue")
+      )
+
+instance Prelude.Hashable DataItem where
+  hashWithSalt _salt DataItem' {..} =
+    _salt
+      `Prelude.hashWithSalt` formattedValue
+      `Prelude.hashWithSalt` overrideFormat
+      `Prelude.hashWithSalt` rawValue
+
+instance Prelude.NFData DataItem where
+  rnf DataItem' {..} =
+    Prelude.rnf formattedValue
+      `Prelude.seq` Prelude.rnf overrideFormat
+      `Prelude.seq` Prelude.rnf rawValue
diff --git a/gen/Amazonka/HoneyCode/Types/DelimitedTextImportOptions.hs b/gen/Amazonka/HoneyCode/Types/DelimitedTextImportOptions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/DelimitedTextImportOptions.hs
@@ -0,0 +1,135 @@
+{-# 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.HoneyCode.Types.DelimitedTextImportOptions
+-- 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.HoneyCode.Types.DelimitedTextImportOptions where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types.ImportDataCharacterEncoding
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that contains the options relating to parsing delimited text
+-- as part of an import request.
+--
+-- /See:/ 'newDelimitedTextImportOptions' smart constructor.
+data DelimitedTextImportOptions = DelimitedTextImportOptions'
+  { -- | The encoding of the data in the input file.
+    dataCharacterEncoding :: Prelude.Maybe ImportDataCharacterEncoding,
+    -- | Indicates whether the input file has a header row at the top containing
+    -- the column names.
+    hasHeaderRow :: Prelude.Maybe Prelude.Bool,
+    -- | A parameter to indicate whether empty rows should be ignored or be
+    -- included in the import.
+    ignoreEmptyRows :: Prelude.Maybe Prelude.Bool,
+    -- | The delimiter to use for separating columns in a single row of the
+    -- input.
+    delimiter :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DelimitedTextImportOptions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'dataCharacterEncoding', 'delimitedTextImportOptions_dataCharacterEncoding' - The encoding of the data in the input file.
+--
+-- 'hasHeaderRow', 'delimitedTextImportOptions_hasHeaderRow' - Indicates whether the input file has a header row at the top containing
+-- the column names.
+--
+-- 'ignoreEmptyRows', 'delimitedTextImportOptions_ignoreEmptyRows' - A parameter to indicate whether empty rows should be ignored or be
+-- included in the import.
+--
+-- 'delimiter', 'delimitedTextImportOptions_delimiter' - The delimiter to use for separating columns in a single row of the
+-- input.
+newDelimitedTextImportOptions ::
+  -- | 'delimiter'
+  Prelude.Text ->
+  DelimitedTextImportOptions
+newDelimitedTextImportOptions pDelimiter_ =
+  DelimitedTextImportOptions'
+    { dataCharacterEncoding =
+        Prelude.Nothing,
+      hasHeaderRow = Prelude.Nothing,
+      ignoreEmptyRows = Prelude.Nothing,
+      delimiter = pDelimiter_
+    }
+
+-- | The encoding of the data in the input file.
+delimitedTextImportOptions_dataCharacterEncoding :: Lens.Lens' DelimitedTextImportOptions (Prelude.Maybe ImportDataCharacterEncoding)
+delimitedTextImportOptions_dataCharacterEncoding = Lens.lens (\DelimitedTextImportOptions' {dataCharacterEncoding} -> dataCharacterEncoding) (\s@DelimitedTextImportOptions' {} a -> s {dataCharacterEncoding = a} :: DelimitedTextImportOptions)
+
+-- | Indicates whether the input file has a header row at the top containing
+-- the column names.
+delimitedTextImportOptions_hasHeaderRow :: Lens.Lens' DelimitedTextImportOptions (Prelude.Maybe Prelude.Bool)
+delimitedTextImportOptions_hasHeaderRow = Lens.lens (\DelimitedTextImportOptions' {hasHeaderRow} -> hasHeaderRow) (\s@DelimitedTextImportOptions' {} a -> s {hasHeaderRow = a} :: DelimitedTextImportOptions)
+
+-- | A parameter to indicate whether empty rows should be ignored or be
+-- included in the import.
+delimitedTextImportOptions_ignoreEmptyRows :: Lens.Lens' DelimitedTextImportOptions (Prelude.Maybe Prelude.Bool)
+delimitedTextImportOptions_ignoreEmptyRows = Lens.lens (\DelimitedTextImportOptions' {ignoreEmptyRows} -> ignoreEmptyRows) (\s@DelimitedTextImportOptions' {} a -> s {ignoreEmptyRows = a} :: DelimitedTextImportOptions)
+
+-- | The delimiter to use for separating columns in a single row of the
+-- input.
+delimitedTextImportOptions_delimiter :: Lens.Lens' DelimitedTextImportOptions Prelude.Text
+delimitedTextImportOptions_delimiter = Lens.lens (\DelimitedTextImportOptions' {delimiter} -> delimiter) (\s@DelimitedTextImportOptions' {} a -> s {delimiter = a} :: DelimitedTextImportOptions)
+
+instance Data.FromJSON DelimitedTextImportOptions where
+  parseJSON =
+    Data.withObject
+      "DelimitedTextImportOptions"
+      ( \x ->
+          DelimitedTextImportOptions'
+            Prelude.<$> (x Data..:? "dataCharacterEncoding")
+            Prelude.<*> (x Data..:? "hasHeaderRow")
+            Prelude.<*> (x Data..:? "ignoreEmptyRows")
+            Prelude.<*> (x Data..: "delimiter")
+      )
+
+instance Prelude.Hashable DelimitedTextImportOptions where
+  hashWithSalt _salt DelimitedTextImportOptions' {..} =
+    _salt
+      `Prelude.hashWithSalt` dataCharacterEncoding
+      `Prelude.hashWithSalt` hasHeaderRow
+      `Prelude.hashWithSalt` ignoreEmptyRows
+      `Prelude.hashWithSalt` delimiter
+
+instance Prelude.NFData DelimitedTextImportOptions where
+  rnf DelimitedTextImportOptions' {..} =
+    Prelude.rnf dataCharacterEncoding
+      `Prelude.seq` Prelude.rnf hasHeaderRow
+      `Prelude.seq` Prelude.rnf ignoreEmptyRows
+      `Prelude.seq` Prelude.rnf delimiter
+
+instance Data.ToJSON DelimitedTextImportOptions where
+  toJSON DelimitedTextImportOptions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("dataCharacterEncoding" Data..=)
+              Prelude.<$> dataCharacterEncoding,
+            ("hasHeaderRow" Data..=) Prelude.<$> hasHeaderRow,
+            ("ignoreEmptyRows" Data..=)
+              Prelude.<$> ignoreEmptyRows,
+            Prelude.Just ("delimiter" Data..= delimiter)
+          ]
+      )
diff --git a/gen/Amazonka/HoneyCode/Types/DestinationOptions.hs b/gen/Amazonka/HoneyCode/Types/DestinationOptions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/DestinationOptions.hs
@@ -0,0 +1,77 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.HoneyCode.Types.DestinationOptions
+-- 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.HoneyCode.Types.DestinationOptions where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types.SourceDataColumnProperties
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that contains the options relating to the destination of the
+-- import request.
+--
+-- /See:/ 'newDestinationOptions' smart constructor.
+data DestinationOptions = DestinationOptions'
+  { -- | A map of the column id to the import properties for each column.
+    columnMap :: Prelude.Maybe (Prelude.HashMap Prelude.Text SourceDataColumnProperties)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DestinationOptions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'columnMap', 'destinationOptions_columnMap' - A map of the column id to the import properties for each column.
+newDestinationOptions ::
+  DestinationOptions
+newDestinationOptions =
+  DestinationOptions' {columnMap = Prelude.Nothing}
+
+-- | A map of the column id to the import properties for each column.
+destinationOptions_columnMap :: Lens.Lens' DestinationOptions (Prelude.Maybe (Prelude.HashMap Prelude.Text SourceDataColumnProperties))
+destinationOptions_columnMap = Lens.lens (\DestinationOptions' {columnMap} -> columnMap) (\s@DestinationOptions' {} a -> s {columnMap = a} :: DestinationOptions) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON DestinationOptions where
+  parseJSON =
+    Data.withObject
+      "DestinationOptions"
+      ( \x ->
+          DestinationOptions'
+            Prelude.<$> (x Data..:? "columnMap" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable DestinationOptions where
+  hashWithSalt _salt DestinationOptions' {..} =
+    _salt `Prelude.hashWithSalt` columnMap
+
+instance Prelude.NFData DestinationOptions where
+  rnf DestinationOptions' {..} = Prelude.rnf columnMap
+
+instance Data.ToJSON DestinationOptions where
+  toJSON DestinationOptions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("columnMap" Data..=) Prelude.<$> columnMap]
+      )
diff --git a/gen/Amazonka/HoneyCode/Types/ErrorCode.hs b/gen/Amazonka/HoneyCode/Types/ErrorCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/ErrorCode.hs
@@ -0,0 +1,131 @@
+{-# 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.HoneyCode.Types.ErrorCode
+-- 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.HoneyCode.Types.ErrorCode
+  ( ErrorCode
+      ( ..,
+        ErrorCode_ACCESS_DENIED,
+        ErrorCode_FILE_EMPTY_ERROR,
+        ErrorCode_FILE_NOT_FOUND_ERROR,
+        ErrorCode_FILE_PARSING_ERROR,
+        ErrorCode_FILE_SIZE_LIMIT_ERROR,
+        ErrorCode_INVALID_FILE_TYPE_ERROR,
+        ErrorCode_INVALID_IMPORT_OPTIONS_ERROR,
+        ErrorCode_INVALID_TABLE_COLUMN_ID_ERROR,
+        ErrorCode_INVALID_TABLE_ID_ERROR,
+        ErrorCode_INVALID_URL_ERROR,
+        ErrorCode_RESOURCE_NOT_FOUND_ERROR,
+        ErrorCode_SYSTEM_LIMIT_ERROR,
+        ErrorCode_TABLE_NOT_FOUND_ERROR,
+        ErrorCode_UNKNOWN_ERROR
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ErrorCode = ErrorCode'
+  { fromErrorCode ::
+      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 ErrorCode_ACCESS_DENIED :: ErrorCode
+pattern ErrorCode_ACCESS_DENIED = ErrorCode' "ACCESS_DENIED"
+
+pattern ErrorCode_FILE_EMPTY_ERROR :: ErrorCode
+pattern ErrorCode_FILE_EMPTY_ERROR = ErrorCode' "FILE_EMPTY_ERROR"
+
+pattern ErrorCode_FILE_NOT_FOUND_ERROR :: ErrorCode
+pattern ErrorCode_FILE_NOT_FOUND_ERROR = ErrorCode' "FILE_NOT_FOUND_ERROR"
+
+pattern ErrorCode_FILE_PARSING_ERROR :: ErrorCode
+pattern ErrorCode_FILE_PARSING_ERROR = ErrorCode' "FILE_PARSING_ERROR"
+
+pattern ErrorCode_FILE_SIZE_LIMIT_ERROR :: ErrorCode
+pattern ErrorCode_FILE_SIZE_LIMIT_ERROR = ErrorCode' "FILE_SIZE_LIMIT_ERROR"
+
+pattern ErrorCode_INVALID_FILE_TYPE_ERROR :: ErrorCode
+pattern ErrorCode_INVALID_FILE_TYPE_ERROR = ErrorCode' "INVALID_FILE_TYPE_ERROR"
+
+pattern ErrorCode_INVALID_IMPORT_OPTIONS_ERROR :: ErrorCode
+pattern ErrorCode_INVALID_IMPORT_OPTIONS_ERROR = ErrorCode' "INVALID_IMPORT_OPTIONS_ERROR"
+
+pattern ErrorCode_INVALID_TABLE_COLUMN_ID_ERROR :: ErrorCode
+pattern ErrorCode_INVALID_TABLE_COLUMN_ID_ERROR = ErrorCode' "INVALID_TABLE_COLUMN_ID_ERROR"
+
+pattern ErrorCode_INVALID_TABLE_ID_ERROR :: ErrorCode
+pattern ErrorCode_INVALID_TABLE_ID_ERROR = ErrorCode' "INVALID_TABLE_ID_ERROR"
+
+pattern ErrorCode_INVALID_URL_ERROR :: ErrorCode
+pattern ErrorCode_INVALID_URL_ERROR = ErrorCode' "INVALID_URL_ERROR"
+
+pattern ErrorCode_RESOURCE_NOT_FOUND_ERROR :: ErrorCode
+pattern ErrorCode_RESOURCE_NOT_FOUND_ERROR = ErrorCode' "RESOURCE_NOT_FOUND_ERROR"
+
+pattern ErrorCode_SYSTEM_LIMIT_ERROR :: ErrorCode
+pattern ErrorCode_SYSTEM_LIMIT_ERROR = ErrorCode' "SYSTEM_LIMIT_ERROR"
+
+pattern ErrorCode_TABLE_NOT_FOUND_ERROR :: ErrorCode
+pattern ErrorCode_TABLE_NOT_FOUND_ERROR = ErrorCode' "TABLE_NOT_FOUND_ERROR"
+
+pattern ErrorCode_UNKNOWN_ERROR :: ErrorCode
+pattern ErrorCode_UNKNOWN_ERROR = ErrorCode' "UNKNOWN_ERROR"
+
+{-# COMPLETE
+  ErrorCode_ACCESS_DENIED,
+  ErrorCode_FILE_EMPTY_ERROR,
+  ErrorCode_FILE_NOT_FOUND_ERROR,
+  ErrorCode_FILE_PARSING_ERROR,
+  ErrorCode_FILE_SIZE_LIMIT_ERROR,
+  ErrorCode_INVALID_FILE_TYPE_ERROR,
+  ErrorCode_INVALID_IMPORT_OPTIONS_ERROR,
+  ErrorCode_INVALID_TABLE_COLUMN_ID_ERROR,
+  ErrorCode_INVALID_TABLE_ID_ERROR,
+  ErrorCode_INVALID_URL_ERROR,
+  ErrorCode_RESOURCE_NOT_FOUND_ERROR,
+  ErrorCode_SYSTEM_LIMIT_ERROR,
+  ErrorCode_TABLE_NOT_FOUND_ERROR,
+  ErrorCode_UNKNOWN_ERROR,
+  ErrorCode'
+  #-}
diff --git a/gen/Amazonka/HoneyCode/Types/FailedBatchItem.hs b/gen/Amazonka/HoneyCode/Types/FailedBatchItem.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/FailedBatchItem.hs
@@ -0,0 +1,95 @@
+{-# 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.HoneyCode.Types.FailedBatchItem
+-- 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.HoneyCode.Types.FailedBatchItem 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 single item in a batch that failed to perform the intended action
+-- because of an error preventing it from succeeding.
+--
+-- /See:/ 'newFailedBatchItem' smart constructor.
+data FailedBatchItem = FailedBatchItem'
+  { -- | The id of the batch item that failed. This is the batch item id for the
+    -- BatchCreateTableRows and BatchUpsertTableRows operations and the row id
+    -- for the BatchUpdateTableRows and BatchDeleteTableRows operations.
+    id :: Prelude.Text,
+    -- | The error message that indicates why the batch item failed.
+    errorMessage :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'FailedBatchItem' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'id', 'failedBatchItem_id' - The id of the batch item that failed. This is the batch item id for the
+-- BatchCreateTableRows and BatchUpsertTableRows operations and the row id
+-- for the BatchUpdateTableRows and BatchDeleteTableRows operations.
+--
+-- 'errorMessage', 'failedBatchItem_errorMessage' - The error message that indicates why the batch item failed.
+newFailedBatchItem ::
+  -- | 'id'
+  Prelude.Text ->
+  -- | 'errorMessage'
+  Prelude.Text ->
+  FailedBatchItem
+newFailedBatchItem pId_ pErrorMessage_ =
+  FailedBatchItem'
+    { id = pId_,
+      errorMessage = pErrorMessage_
+    }
+
+-- | The id of the batch item that failed. This is the batch item id for the
+-- BatchCreateTableRows and BatchUpsertTableRows operations and the row id
+-- for the BatchUpdateTableRows and BatchDeleteTableRows operations.
+failedBatchItem_id :: Lens.Lens' FailedBatchItem Prelude.Text
+failedBatchItem_id = Lens.lens (\FailedBatchItem' {id} -> id) (\s@FailedBatchItem' {} a -> s {id = a} :: FailedBatchItem)
+
+-- | The error message that indicates why the batch item failed.
+failedBatchItem_errorMessage :: Lens.Lens' FailedBatchItem Prelude.Text
+failedBatchItem_errorMessage = Lens.lens (\FailedBatchItem' {errorMessage} -> errorMessage) (\s@FailedBatchItem' {} a -> s {errorMessage = a} :: FailedBatchItem)
+
+instance Data.FromJSON FailedBatchItem where
+  parseJSON =
+    Data.withObject
+      "FailedBatchItem"
+      ( \x ->
+          FailedBatchItem'
+            Prelude.<$> (x Data..: "id")
+            Prelude.<*> (x Data..: "errorMessage")
+      )
+
+instance Prelude.Hashable FailedBatchItem where
+  hashWithSalt _salt FailedBatchItem' {..} =
+    _salt
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` errorMessage
+
+instance Prelude.NFData FailedBatchItem where
+  rnf FailedBatchItem' {..} =
+    Prelude.rnf id
+      `Prelude.seq` Prelude.rnf errorMessage
diff --git a/gen/Amazonka/HoneyCode/Types/Filter.hs b/gen/Amazonka/HoneyCode/Types/Filter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/Filter.hs
@@ -0,0 +1,110 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.HoneyCode.Types.Filter
+-- 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.HoneyCode.Types.Filter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a filter formula along with the id of the
+-- context row under which the filter function needs to evaluate.
+--
+-- /See:/ 'newFilter' smart constructor.
+data Filter = Filter'
+  { -- | The optional contextRowId attribute can be used to specify the row id of
+    -- the context row if the filter formula contains unqualified references to
+    -- table columns and needs a context row to evaluate them successfully.
+    contextRowId :: Prelude.Maybe Prelude.Text,
+    -- | A formula representing a filter function that returns zero or more
+    -- matching rows from a table. Valid formulas in this field return a list
+    -- of rows from a table. The most common ways of writing a formula to
+    -- return a list of rows are to use the FindRow() or Filter() functions.
+    -- Any other formula that returns zero or more rows is also acceptable. For
+    -- example, you can use a formula that points to a cell that contains a
+    -- filter function.
+    formula :: Data.Sensitive Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Filter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'contextRowId', 'filter_contextRowId' - The optional contextRowId attribute can be used to specify the row id of
+-- the context row if the filter formula contains unqualified references to
+-- table columns and needs a context row to evaluate them successfully.
+--
+-- 'formula', 'filter_formula' - A formula representing a filter function that returns zero or more
+-- matching rows from a table. Valid formulas in this field return a list
+-- of rows from a table. The most common ways of writing a formula to
+-- return a list of rows are to use the FindRow() or Filter() functions.
+-- Any other formula that returns zero or more rows is also acceptable. For
+-- example, you can use a formula that points to a cell that contains a
+-- filter function.
+newFilter ::
+  -- | 'formula'
+  Prelude.Text ->
+  Filter
+newFilter pFormula_ =
+  Filter'
+    { contextRowId = Prelude.Nothing,
+      formula = Data._Sensitive Lens.# pFormula_
+    }
+
+-- | The optional contextRowId attribute can be used to specify the row id of
+-- the context row if the filter formula contains unqualified references to
+-- table columns and needs a context row to evaluate them successfully.
+filter_contextRowId :: Lens.Lens' Filter (Prelude.Maybe Prelude.Text)
+filter_contextRowId = Lens.lens (\Filter' {contextRowId} -> contextRowId) (\s@Filter' {} a -> s {contextRowId = a} :: Filter)
+
+-- | A formula representing a filter function that returns zero or more
+-- matching rows from a table. Valid formulas in this field return a list
+-- of rows from a table. The most common ways of writing a formula to
+-- return a list of rows are to use the FindRow() or Filter() functions.
+-- Any other formula that returns zero or more rows is also acceptable. For
+-- example, you can use a formula that points to a cell that contains a
+-- filter function.
+filter_formula :: Lens.Lens' Filter Prelude.Text
+filter_formula = Lens.lens (\Filter' {formula} -> formula) (\s@Filter' {} a -> s {formula = a} :: Filter) Prelude.. Data._Sensitive
+
+instance Prelude.Hashable Filter where
+  hashWithSalt _salt Filter' {..} =
+    _salt
+      `Prelude.hashWithSalt` contextRowId
+      `Prelude.hashWithSalt` formula
+
+instance Prelude.NFData Filter where
+  rnf Filter' {..} =
+    Prelude.rnf contextRowId
+      `Prelude.seq` Prelude.rnf formula
+
+instance Data.ToJSON Filter where
+  toJSON Filter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("contextRowId" Data..=) Prelude.<$> contextRowId,
+            Prelude.Just ("formula" Data..= formula)
+          ]
+      )
diff --git a/gen/Amazonka/HoneyCode/Types/Format.hs b/gen/Amazonka/HoneyCode/Types/Format.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/Format.hs
@@ -0,0 +1,118 @@
+{-# 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.HoneyCode.Types.Format
+-- 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.HoneyCode.Types.Format
+  ( Format
+      ( ..,
+        Format_ACCOUNTING,
+        Format_AUTO,
+        Format_CONTACT,
+        Format_CURRENCY,
+        Format_DATE,
+        Format_DATE_TIME,
+        Format_NUMBER,
+        Format_PERCENTAGE,
+        Format_ROWLINK,
+        Format_ROWSET,
+        Format_TEXT,
+        Format_TIME
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype Format = Format' {fromFormat :: 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 Format_ACCOUNTING :: Format
+pattern Format_ACCOUNTING = Format' "ACCOUNTING"
+
+pattern Format_AUTO :: Format
+pattern Format_AUTO = Format' "AUTO"
+
+pattern Format_CONTACT :: Format
+pattern Format_CONTACT = Format' "CONTACT"
+
+pattern Format_CURRENCY :: Format
+pattern Format_CURRENCY = Format' "CURRENCY"
+
+pattern Format_DATE :: Format
+pattern Format_DATE = Format' "DATE"
+
+pattern Format_DATE_TIME :: Format
+pattern Format_DATE_TIME = Format' "DATE_TIME"
+
+pattern Format_NUMBER :: Format
+pattern Format_NUMBER = Format' "NUMBER"
+
+pattern Format_PERCENTAGE :: Format
+pattern Format_PERCENTAGE = Format' "PERCENTAGE"
+
+pattern Format_ROWLINK :: Format
+pattern Format_ROWLINK = Format' "ROWLINK"
+
+pattern Format_ROWSET :: Format
+pattern Format_ROWSET = Format' "ROWSET"
+
+pattern Format_TEXT :: Format
+pattern Format_TEXT = Format' "TEXT"
+
+pattern Format_TIME :: Format
+pattern Format_TIME = Format' "TIME"
+
+{-# COMPLETE
+  Format_ACCOUNTING,
+  Format_AUTO,
+  Format_CONTACT,
+  Format_CURRENCY,
+  Format_DATE,
+  Format_DATE_TIME,
+  Format_NUMBER,
+  Format_PERCENTAGE,
+  Format_ROWLINK,
+  Format_ROWSET,
+  Format_TEXT,
+  Format_TIME,
+  Format'
+  #-}
diff --git a/gen/Amazonka/HoneyCode/Types/ImportDataCharacterEncoding.hs b/gen/Amazonka/HoneyCode/Types/ImportDataCharacterEncoding.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/ImportDataCharacterEncoding.hs
@@ -0,0 +1,91 @@
+{-# 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.HoneyCode.Types.ImportDataCharacterEncoding
+-- 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.HoneyCode.Types.ImportDataCharacterEncoding
+  ( ImportDataCharacterEncoding
+      ( ..,
+        ImportDataCharacterEncoding_ISO_8859_1,
+        ImportDataCharacterEncoding_US_ASCII,
+        ImportDataCharacterEncoding_UTF_16,
+        ImportDataCharacterEncoding_UTF_16BE,
+        ImportDataCharacterEncoding_UTF_16LE,
+        ImportDataCharacterEncoding_UTF_8
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ImportDataCharacterEncoding = ImportDataCharacterEncoding'
+  { fromImportDataCharacterEncoding ::
+      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 ImportDataCharacterEncoding_ISO_8859_1 :: ImportDataCharacterEncoding
+pattern ImportDataCharacterEncoding_ISO_8859_1 = ImportDataCharacterEncoding' "ISO-8859-1"
+
+pattern ImportDataCharacterEncoding_US_ASCII :: ImportDataCharacterEncoding
+pattern ImportDataCharacterEncoding_US_ASCII = ImportDataCharacterEncoding' "US-ASCII"
+
+pattern ImportDataCharacterEncoding_UTF_16 :: ImportDataCharacterEncoding
+pattern ImportDataCharacterEncoding_UTF_16 = ImportDataCharacterEncoding' "UTF-16"
+
+pattern ImportDataCharacterEncoding_UTF_16BE :: ImportDataCharacterEncoding
+pattern ImportDataCharacterEncoding_UTF_16BE = ImportDataCharacterEncoding' "UTF-16BE"
+
+pattern ImportDataCharacterEncoding_UTF_16LE :: ImportDataCharacterEncoding
+pattern ImportDataCharacterEncoding_UTF_16LE = ImportDataCharacterEncoding' "UTF-16LE"
+
+pattern ImportDataCharacterEncoding_UTF_8 :: ImportDataCharacterEncoding
+pattern ImportDataCharacterEncoding_UTF_8 = ImportDataCharacterEncoding' "UTF-8"
+
+{-# COMPLETE
+  ImportDataCharacterEncoding_ISO_8859_1,
+  ImportDataCharacterEncoding_US_ASCII,
+  ImportDataCharacterEncoding_UTF_16,
+  ImportDataCharacterEncoding_UTF_16BE,
+  ImportDataCharacterEncoding_UTF_16LE,
+  ImportDataCharacterEncoding_UTF_8,
+  ImportDataCharacterEncoding'
+  #-}
diff --git a/gen/Amazonka/HoneyCode/Types/ImportDataSource.hs b/gen/Amazonka/HoneyCode/Types/ImportDataSource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/ImportDataSource.hs
@@ -0,0 +1,85 @@
+{-# 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.HoneyCode.Types.ImportDataSource
+-- 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.HoneyCode.Types.ImportDataSource where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types.ImportDataSourceConfig
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that has details about the source of the data that was
+-- submitted for import.
+--
+-- /See:/ 'newImportDataSource' smart constructor.
+data ImportDataSource = ImportDataSource'
+  { -- | The configuration parameters for the data source of the import
+    dataSourceConfig :: ImportDataSourceConfig
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ImportDataSource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'dataSourceConfig', 'importDataSource_dataSourceConfig' - The configuration parameters for the data source of the import
+newImportDataSource ::
+  -- | 'dataSourceConfig'
+  ImportDataSourceConfig ->
+  ImportDataSource
+newImportDataSource pDataSourceConfig_ =
+  ImportDataSource'
+    { dataSourceConfig =
+        pDataSourceConfig_
+    }
+
+-- | The configuration parameters for the data source of the import
+importDataSource_dataSourceConfig :: Lens.Lens' ImportDataSource ImportDataSourceConfig
+importDataSource_dataSourceConfig = Lens.lens (\ImportDataSource' {dataSourceConfig} -> dataSourceConfig) (\s@ImportDataSource' {} a -> s {dataSourceConfig = a} :: ImportDataSource)
+
+instance Data.FromJSON ImportDataSource where
+  parseJSON =
+    Data.withObject
+      "ImportDataSource"
+      ( \x ->
+          ImportDataSource'
+            Prelude.<$> (x Data..: "dataSourceConfig")
+      )
+
+instance Prelude.Hashable ImportDataSource where
+  hashWithSalt _salt ImportDataSource' {..} =
+    _salt `Prelude.hashWithSalt` dataSourceConfig
+
+instance Prelude.NFData ImportDataSource where
+  rnf ImportDataSource' {..} =
+    Prelude.rnf dataSourceConfig
+
+instance Data.ToJSON ImportDataSource where
+  toJSON ImportDataSource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("dataSourceConfig" Data..= dataSourceConfig)
+          ]
+      )
diff --git a/gen/Amazonka/HoneyCode/Types/ImportDataSourceConfig.hs b/gen/Amazonka/HoneyCode/Types/ImportDataSourceConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/ImportDataSourceConfig.hs
@@ -0,0 +1,85 @@
+{-# 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.HoneyCode.Types.ImportDataSourceConfig
+-- 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.HoneyCode.Types.ImportDataSourceConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that contains the configuration parameters for the data source
+-- of an import request.
+--
+-- /See:/ 'newImportDataSourceConfig' smart constructor.
+data ImportDataSourceConfig = ImportDataSourceConfig'
+  { -- | The URL from which source data will be downloaded for the import
+    -- request.
+    dataSourceUrl :: Prelude.Maybe (Data.Sensitive Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ImportDataSourceConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'dataSourceUrl', 'importDataSourceConfig_dataSourceUrl' - The URL from which source data will be downloaded for the import
+-- request.
+newImportDataSourceConfig ::
+  ImportDataSourceConfig
+newImportDataSourceConfig =
+  ImportDataSourceConfig'
+    { dataSourceUrl =
+        Prelude.Nothing
+    }
+
+-- | The URL from which source data will be downloaded for the import
+-- request.
+importDataSourceConfig_dataSourceUrl :: Lens.Lens' ImportDataSourceConfig (Prelude.Maybe Prelude.Text)
+importDataSourceConfig_dataSourceUrl = Lens.lens (\ImportDataSourceConfig' {dataSourceUrl} -> dataSourceUrl) (\s@ImportDataSourceConfig' {} a -> s {dataSourceUrl = a} :: ImportDataSourceConfig) Prelude.. Lens.mapping Data._Sensitive
+
+instance Data.FromJSON ImportDataSourceConfig where
+  parseJSON =
+    Data.withObject
+      "ImportDataSourceConfig"
+      ( \x ->
+          ImportDataSourceConfig'
+            Prelude.<$> (x Data..:? "dataSourceUrl")
+      )
+
+instance Prelude.Hashable ImportDataSourceConfig where
+  hashWithSalt _salt ImportDataSourceConfig' {..} =
+    _salt `Prelude.hashWithSalt` dataSourceUrl
+
+instance Prelude.NFData ImportDataSourceConfig where
+  rnf ImportDataSourceConfig' {..} =
+    Prelude.rnf dataSourceUrl
+
+instance Data.ToJSON ImportDataSourceConfig where
+  toJSON ImportDataSourceConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("dataSourceUrl" Data..=)
+              Prelude.<$> dataSourceUrl
+          ]
+      )
diff --git a/gen/Amazonka/HoneyCode/Types/ImportJobSubmitter.hs b/gen/Amazonka/HoneyCode/Types/ImportJobSubmitter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/ImportJobSubmitter.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.HoneyCode.Types.ImportJobSubmitter
+-- 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.HoneyCode.Types.ImportJobSubmitter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that contains the attributes of the submitter of the import
+-- job.
+--
+-- /See:/ 'newImportJobSubmitter' smart constructor.
+data ImportJobSubmitter = ImportJobSubmitter'
+  { -- | The email id of the submitter of the import job, if available.
+    email :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The AWS user ARN of the submitter of the import job, if available.
+    userArn :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ImportJobSubmitter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'importJobSubmitter_email' - The email id of the submitter of the import job, if available.
+--
+-- 'userArn', 'importJobSubmitter_userArn' - The AWS user ARN of the submitter of the import job, if available.
+newImportJobSubmitter ::
+  ImportJobSubmitter
+newImportJobSubmitter =
+  ImportJobSubmitter'
+    { email = Prelude.Nothing,
+      userArn = Prelude.Nothing
+    }
+
+-- | The email id of the submitter of the import job, if available.
+importJobSubmitter_email :: Lens.Lens' ImportJobSubmitter (Prelude.Maybe Prelude.Text)
+importJobSubmitter_email = Lens.lens (\ImportJobSubmitter' {email} -> email) (\s@ImportJobSubmitter' {} a -> s {email = a} :: ImportJobSubmitter) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The AWS user ARN of the submitter of the import job, if available.
+importJobSubmitter_userArn :: Lens.Lens' ImportJobSubmitter (Prelude.Maybe Prelude.Text)
+importJobSubmitter_userArn = Lens.lens (\ImportJobSubmitter' {userArn} -> userArn) (\s@ImportJobSubmitter' {} a -> s {userArn = a} :: ImportJobSubmitter)
+
+instance Data.FromJSON ImportJobSubmitter where
+  parseJSON =
+    Data.withObject
+      "ImportJobSubmitter"
+      ( \x ->
+          ImportJobSubmitter'
+            Prelude.<$> (x Data..:? "email")
+            Prelude.<*> (x Data..:? "userArn")
+      )
+
+instance Prelude.Hashable ImportJobSubmitter where
+  hashWithSalt _salt ImportJobSubmitter' {..} =
+    _salt
+      `Prelude.hashWithSalt` email
+      `Prelude.hashWithSalt` userArn
+
+instance Prelude.NFData ImportJobSubmitter where
+  rnf ImportJobSubmitter' {..} =
+    Prelude.rnf email `Prelude.seq` Prelude.rnf userArn
diff --git a/gen/Amazonka/HoneyCode/Types/ImportOptions.hs b/gen/Amazonka/HoneyCode/Types/ImportOptions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/ImportOptions.hs
@@ -0,0 +1,102 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.HoneyCode.Types.ImportOptions
+-- 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.HoneyCode.Types.ImportOptions where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types.DelimitedTextImportOptions
+import Amazonka.HoneyCode.Types.DestinationOptions
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that contains the options specified by the sumitter of the
+-- import request.
+--
+-- /See:/ 'newImportOptions' smart constructor.
+data ImportOptions = ImportOptions'
+  { -- | Options relating to parsing delimited text. Required if dataFormat is
+    -- DELIMITED_TEXT.
+    delimitedTextOptions :: Prelude.Maybe DelimitedTextImportOptions,
+    -- | Options relating to the destination of the import request.
+    destinationOptions :: Prelude.Maybe DestinationOptions
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ImportOptions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'delimitedTextOptions', 'importOptions_delimitedTextOptions' - Options relating to parsing delimited text. Required if dataFormat is
+-- DELIMITED_TEXT.
+--
+-- 'destinationOptions', 'importOptions_destinationOptions' - Options relating to the destination of the import request.
+newImportOptions ::
+  ImportOptions
+newImportOptions =
+  ImportOptions'
+    { delimitedTextOptions =
+        Prelude.Nothing,
+      destinationOptions = Prelude.Nothing
+    }
+
+-- | Options relating to parsing delimited text. Required if dataFormat is
+-- DELIMITED_TEXT.
+importOptions_delimitedTextOptions :: Lens.Lens' ImportOptions (Prelude.Maybe DelimitedTextImportOptions)
+importOptions_delimitedTextOptions = Lens.lens (\ImportOptions' {delimitedTextOptions} -> delimitedTextOptions) (\s@ImportOptions' {} a -> s {delimitedTextOptions = a} :: ImportOptions)
+
+-- | Options relating to the destination of the import request.
+importOptions_destinationOptions :: Lens.Lens' ImportOptions (Prelude.Maybe DestinationOptions)
+importOptions_destinationOptions = Lens.lens (\ImportOptions' {destinationOptions} -> destinationOptions) (\s@ImportOptions' {} a -> s {destinationOptions = a} :: ImportOptions)
+
+instance Data.FromJSON ImportOptions where
+  parseJSON =
+    Data.withObject
+      "ImportOptions"
+      ( \x ->
+          ImportOptions'
+            Prelude.<$> (x Data..:? "delimitedTextOptions")
+            Prelude.<*> (x Data..:? "destinationOptions")
+      )
+
+instance Prelude.Hashable ImportOptions where
+  hashWithSalt _salt ImportOptions' {..} =
+    _salt
+      `Prelude.hashWithSalt` delimitedTextOptions
+      `Prelude.hashWithSalt` destinationOptions
+
+instance Prelude.NFData ImportOptions where
+  rnf ImportOptions' {..} =
+    Prelude.rnf delimitedTextOptions
+      `Prelude.seq` Prelude.rnf destinationOptions
+
+instance Data.ToJSON ImportOptions where
+  toJSON ImportOptions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("delimitedTextOptions" Data..=)
+              Prelude.<$> delimitedTextOptions,
+            ("destinationOptions" Data..=)
+              Prelude.<$> destinationOptions
+          ]
+      )
diff --git a/gen/Amazonka/HoneyCode/Types/ImportSourceDataFormat.hs b/gen/Amazonka/HoneyCode/Types/ImportSourceDataFormat.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/ImportSourceDataFormat.hs
@@ -0,0 +1,66 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.HoneyCode.Types.ImportSourceDataFormat
+-- 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.HoneyCode.Types.ImportSourceDataFormat
+  ( ImportSourceDataFormat
+      ( ..,
+        ImportSourceDataFormat_DELIMITED_TEXT
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ImportSourceDataFormat = ImportSourceDataFormat'
+  { fromImportSourceDataFormat ::
+      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 ImportSourceDataFormat_DELIMITED_TEXT :: ImportSourceDataFormat
+pattern ImportSourceDataFormat_DELIMITED_TEXT = ImportSourceDataFormat' "DELIMITED_TEXT"
+
+{-# COMPLETE
+  ImportSourceDataFormat_DELIMITED_TEXT,
+  ImportSourceDataFormat'
+  #-}
diff --git a/gen/Amazonka/HoneyCode/Types/ResultRow.hs b/gen/Amazonka/HoneyCode/Types/ResultRow.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/ResultRow.hs
@@ -0,0 +1,85 @@
+{-# 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.HoneyCode.Types.ResultRow
+-- 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.HoneyCode.Types.ResultRow where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types.DataItem
+import qualified Amazonka.Prelude as Prelude
+
+-- | A single row in the ResultSet.
+--
+-- /See:/ 'newResultRow' smart constructor.
+data ResultRow = ResultRow'
+  { -- | The ID for a particular row.
+    rowId :: Prelude.Maybe Prelude.Text,
+    -- | List of all the data cells in a row.
+    dataItems :: [Data.Sensitive DataItem]
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ResultRow' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'rowId', 'resultRow_rowId' - The ID for a particular row.
+--
+-- 'dataItems', 'resultRow_dataItems' - List of all the data cells in a row.
+newResultRow ::
+  ResultRow
+newResultRow =
+  ResultRow'
+    { rowId = Prelude.Nothing,
+      dataItems = Prelude.mempty
+    }
+
+-- | The ID for a particular row.
+resultRow_rowId :: Lens.Lens' ResultRow (Prelude.Maybe Prelude.Text)
+resultRow_rowId = Lens.lens (\ResultRow' {rowId} -> rowId) (\s@ResultRow' {} a -> s {rowId = a} :: ResultRow)
+
+-- | List of all the data cells in a row.
+resultRow_dataItems :: Lens.Lens' ResultRow [DataItem]
+resultRow_dataItems = Lens.lens (\ResultRow' {dataItems} -> dataItems) (\s@ResultRow' {} a -> s {dataItems = a} :: ResultRow) Prelude.. Lens.coerced
+
+instance Data.FromJSON ResultRow where
+  parseJSON =
+    Data.withObject
+      "ResultRow"
+      ( \x ->
+          ResultRow'
+            Prelude.<$> (x Data..:? "rowId")
+            Prelude.<*> (x Data..:? "dataItems" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable ResultRow where
+  hashWithSalt _salt ResultRow' {..} =
+    _salt
+      `Prelude.hashWithSalt` rowId
+      `Prelude.hashWithSalt` dataItems
+
+instance Prelude.NFData ResultRow where
+  rnf ResultRow' {..} =
+    Prelude.rnf rowId
+      `Prelude.seq` Prelude.rnf dataItems
diff --git a/gen/Amazonka/HoneyCode/Types/ResultSet.hs b/gen/Amazonka/HoneyCode/Types/ResultSet.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/ResultSet.hs
@@ -0,0 +1,131 @@
+{-# 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.HoneyCode.Types.ResultSet
+-- 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.HoneyCode.Types.ResultSet where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types.ColumnMetadata
+import Amazonka.HoneyCode.Types.ResultRow
+import qualified Amazonka.Prelude as Prelude
+
+-- | ResultSet contains the results of the request for a single block or list
+-- defined on the screen.
+--
+-- /See:/ 'newResultSet' smart constructor.
+data ResultSet = ResultSet'
+  { -- | List of headers for all the data cells in the block. The header
+    -- identifies the name and default format of the data cell. Data cells
+    -- appear in the same order in all rows as defined in the header. The names
+    -- and formats are not repeated in the rows. If a particular row does not
+    -- have a value for a data cell, a blank value is used.
+    --
+    -- For example, a task list that displays the task name, due date and
+    -- assigned person might have headers [ { \"name\": \"Task Name\"},
+    -- {\"name\": \"Due Date\", \"format\": \"DATE\"}, {\"name\": \"Assigned\",
+    -- \"format\": \"CONTACT\"} ]. Every row in the result will have the task
+    -- name as the first item, due date as the second item and assigned person
+    -- as the third item. If a particular task does not have a due date, that
+    -- row will still have a blank value in the second element and the assigned
+    -- person will still be in the third element.
+    headers :: [ColumnMetadata],
+    -- | List of rows returned by the request. Each row has a row Id and a list
+    -- of data cells in that row. The data cells will be present in the same
+    -- order as they are defined in the header.
+    rows :: [ResultRow]
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ResultSet' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'headers', 'resultSet_headers' - List of headers for all the data cells in the block. The header
+-- identifies the name and default format of the data cell. Data cells
+-- appear in the same order in all rows as defined in the header. The names
+-- and formats are not repeated in the rows. If a particular row does not
+-- have a value for a data cell, a blank value is used.
+--
+-- For example, a task list that displays the task name, due date and
+-- assigned person might have headers [ { \"name\": \"Task Name\"},
+-- {\"name\": \"Due Date\", \"format\": \"DATE\"}, {\"name\": \"Assigned\",
+-- \"format\": \"CONTACT\"} ]. Every row in the result will have the task
+-- name as the first item, due date as the second item and assigned person
+-- as the third item. If a particular task does not have a due date, that
+-- row will still have a blank value in the second element and the assigned
+-- person will still be in the third element.
+--
+-- 'rows', 'resultSet_rows' - List of rows returned by the request. Each row has a row Id and a list
+-- of data cells in that row. The data cells will be present in the same
+-- order as they are defined in the header.
+newResultSet ::
+  ResultSet
+newResultSet =
+  ResultSet'
+    { headers = Prelude.mempty,
+      rows = Prelude.mempty
+    }
+
+-- | List of headers for all the data cells in the block. The header
+-- identifies the name and default format of the data cell. Data cells
+-- appear in the same order in all rows as defined in the header. The names
+-- and formats are not repeated in the rows. If a particular row does not
+-- have a value for a data cell, a blank value is used.
+--
+-- For example, a task list that displays the task name, due date and
+-- assigned person might have headers [ { \"name\": \"Task Name\"},
+-- {\"name\": \"Due Date\", \"format\": \"DATE\"}, {\"name\": \"Assigned\",
+-- \"format\": \"CONTACT\"} ]. Every row in the result will have the task
+-- name as the first item, due date as the second item and assigned person
+-- as the third item. If a particular task does not have a due date, that
+-- row will still have a blank value in the second element and the assigned
+-- person will still be in the third element.
+resultSet_headers :: Lens.Lens' ResultSet [ColumnMetadata]
+resultSet_headers = Lens.lens (\ResultSet' {headers} -> headers) (\s@ResultSet' {} a -> s {headers = a} :: ResultSet) Prelude.. Lens.coerced
+
+-- | List of rows returned by the request. Each row has a row Id and a list
+-- of data cells in that row. The data cells will be present in the same
+-- order as they are defined in the header.
+resultSet_rows :: Lens.Lens' ResultSet [ResultRow]
+resultSet_rows = Lens.lens (\ResultSet' {rows} -> rows) (\s@ResultSet' {} a -> s {rows = a} :: ResultSet) Prelude.. Lens.coerced
+
+instance Data.FromJSON ResultSet where
+  parseJSON =
+    Data.withObject
+      "ResultSet"
+      ( \x ->
+          ResultSet'
+            Prelude.<$> (x Data..:? "headers" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "rows" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable ResultSet where
+  hashWithSalt _salt ResultSet' {..} =
+    _salt
+      `Prelude.hashWithSalt` headers
+      `Prelude.hashWithSalt` rows
+
+instance Prelude.NFData ResultSet where
+  rnf ResultSet' {..} =
+    Prelude.rnf headers `Prelude.seq` Prelude.rnf rows
diff --git a/gen/Amazonka/HoneyCode/Types/SourceDataColumnProperties.hs b/gen/Amazonka/HoneyCode/Types/SourceDataColumnProperties.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/SourceDataColumnProperties.hs
@@ -0,0 +1,80 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.HoneyCode.Types.SourceDataColumnProperties
+-- 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.HoneyCode.Types.SourceDataColumnProperties where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that contains the properties for importing data to a specific
+-- column in a table.
+--
+-- /See:/ 'newSourceDataColumnProperties' smart constructor.
+data SourceDataColumnProperties = SourceDataColumnProperties'
+  { -- | The index of the column in the input file.
+    columnIndex :: Prelude.Maybe Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SourceDataColumnProperties' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'columnIndex', 'sourceDataColumnProperties_columnIndex' - The index of the column in the input file.
+newSourceDataColumnProperties ::
+  SourceDataColumnProperties
+newSourceDataColumnProperties =
+  SourceDataColumnProperties'
+    { columnIndex =
+        Prelude.Nothing
+    }
+
+-- | The index of the column in the input file.
+sourceDataColumnProperties_columnIndex :: Lens.Lens' SourceDataColumnProperties (Prelude.Maybe Prelude.Natural)
+sourceDataColumnProperties_columnIndex = Lens.lens (\SourceDataColumnProperties' {columnIndex} -> columnIndex) (\s@SourceDataColumnProperties' {} a -> s {columnIndex = a} :: SourceDataColumnProperties)
+
+instance Data.FromJSON SourceDataColumnProperties where
+  parseJSON =
+    Data.withObject
+      "SourceDataColumnProperties"
+      ( \x ->
+          SourceDataColumnProperties'
+            Prelude.<$> (x Data..:? "columnIndex")
+      )
+
+instance Prelude.Hashable SourceDataColumnProperties where
+  hashWithSalt _salt SourceDataColumnProperties' {..} =
+    _salt `Prelude.hashWithSalt` columnIndex
+
+instance Prelude.NFData SourceDataColumnProperties where
+  rnf SourceDataColumnProperties' {..} =
+    Prelude.rnf columnIndex
+
+instance Data.ToJSON SourceDataColumnProperties where
+  toJSON SourceDataColumnProperties' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("columnIndex" Data..=) Prelude.<$> columnIndex]
+      )
diff --git a/gen/Amazonka/HoneyCode/Types/Table.hs b/gen/Amazonka/HoneyCode/Types/Table.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/Table.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.HoneyCode.Types.Table
+-- 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.HoneyCode.Types.Table where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing the properties of a table in a workbook.
+--
+-- /See:/ 'newTable' smart constructor.
+data Table = Table'
+  { -- | The id of the table.
+    tableId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the table.
+    tableName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Table' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tableId', 'table_tableId' - The id of the table.
+--
+-- 'tableName', 'table_tableName' - The name of the table.
+newTable ::
+  Table
+newTable =
+  Table'
+    { tableId = Prelude.Nothing,
+      tableName = Prelude.Nothing
+    }
+
+-- | The id of the table.
+table_tableId :: Lens.Lens' Table (Prelude.Maybe Prelude.Text)
+table_tableId = Lens.lens (\Table' {tableId} -> tableId) (\s@Table' {} a -> s {tableId = a} :: Table)
+
+-- | The name of the table.
+table_tableName :: Lens.Lens' Table (Prelude.Maybe Prelude.Text)
+table_tableName = Lens.lens (\Table' {tableName} -> tableName) (\s@Table' {} a -> s {tableName = a} :: Table)
+
+instance Data.FromJSON Table where
+  parseJSON =
+    Data.withObject
+      "Table"
+      ( \x ->
+          Table'
+            Prelude.<$> (x Data..:? "tableId")
+            Prelude.<*> (x Data..:? "tableName")
+      )
+
+instance Prelude.Hashable Table where
+  hashWithSalt _salt Table' {..} =
+    _salt
+      `Prelude.hashWithSalt` tableId
+      `Prelude.hashWithSalt` tableName
+
+instance Prelude.NFData Table where
+  rnf Table' {..} =
+    Prelude.rnf tableId
+      `Prelude.seq` Prelude.rnf tableName
diff --git a/gen/Amazonka/HoneyCode/Types/TableColumn.hs b/gen/Amazonka/HoneyCode/Types/TableColumn.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/TableColumn.hs
@@ -0,0 +1,100 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.HoneyCode.Types.TableColumn
+-- 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.HoneyCode.Types.TableColumn where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types.Format
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that contains attributes about a single column in a table
+--
+-- /See:/ 'newTableColumn' smart constructor.
+data TableColumn = TableColumn'
+  { -- | The column level format that is applied in the table. An empty value in
+    -- this field means that the column format is the default value \'AUTO\'.
+    format :: Prelude.Maybe Format,
+    -- | The id of the column in the table.
+    tableColumnId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the column in the table.
+    tableColumnName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TableColumn' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'format', 'tableColumn_format' - The column level format that is applied in the table. An empty value in
+-- this field means that the column format is the default value \'AUTO\'.
+--
+-- 'tableColumnId', 'tableColumn_tableColumnId' - The id of the column in the table.
+--
+-- 'tableColumnName', 'tableColumn_tableColumnName' - The name of the column in the table.
+newTableColumn ::
+  TableColumn
+newTableColumn =
+  TableColumn'
+    { format = Prelude.Nothing,
+      tableColumnId = Prelude.Nothing,
+      tableColumnName = Prelude.Nothing
+    }
+
+-- | The column level format that is applied in the table. An empty value in
+-- this field means that the column format is the default value \'AUTO\'.
+tableColumn_format :: Lens.Lens' TableColumn (Prelude.Maybe Format)
+tableColumn_format = Lens.lens (\TableColumn' {format} -> format) (\s@TableColumn' {} a -> s {format = a} :: TableColumn)
+
+-- | The id of the column in the table.
+tableColumn_tableColumnId :: Lens.Lens' TableColumn (Prelude.Maybe Prelude.Text)
+tableColumn_tableColumnId = Lens.lens (\TableColumn' {tableColumnId} -> tableColumnId) (\s@TableColumn' {} a -> s {tableColumnId = a} :: TableColumn)
+
+-- | The name of the column in the table.
+tableColumn_tableColumnName :: Lens.Lens' TableColumn (Prelude.Maybe Prelude.Text)
+tableColumn_tableColumnName = Lens.lens (\TableColumn' {tableColumnName} -> tableColumnName) (\s@TableColumn' {} a -> s {tableColumnName = a} :: TableColumn)
+
+instance Data.FromJSON TableColumn where
+  parseJSON =
+    Data.withObject
+      "TableColumn"
+      ( \x ->
+          TableColumn'
+            Prelude.<$> (x Data..:? "format")
+            Prelude.<*> (x Data..:? "tableColumnId")
+            Prelude.<*> (x Data..:? "tableColumnName")
+      )
+
+instance Prelude.Hashable TableColumn where
+  hashWithSalt _salt TableColumn' {..} =
+    _salt
+      `Prelude.hashWithSalt` format
+      `Prelude.hashWithSalt` tableColumnId
+      `Prelude.hashWithSalt` tableColumnName
+
+instance Prelude.NFData TableColumn where
+  rnf TableColumn' {..} =
+    Prelude.rnf format
+      `Prelude.seq` Prelude.rnf tableColumnId
+      `Prelude.seq` Prelude.rnf tableColumnName
diff --git a/gen/Amazonka/HoneyCode/Types/TableDataImportJobMetadata.hs b/gen/Amazonka/HoneyCode/Types/TableDataImportJobMetadata.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/TableDataImportJobMetadata.hs
@@ -0,0 +1,128 @@
+{-# 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.HoneyCode.Types.TableDataImportJobMetadata
+-- 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.HoneyCode.Types.TableDataImportJobMetadata where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types.ImportDataSource
+import Amazonka.HoneyCode.Types.ImportJobSubmitter
+import Amazonka.HoneyCode.Types.ImportOptions
+import qualified Amazonka.Prelude as Prelude
+
+-- | The metadata associated with the table data import job that was
+-- submitted.
+--
+-- /See:/ 'newTableDataImportJobMetadata' smart constructor.
+data TableDataImportJobMetadata = TableDataImportJobMetadata'
+  { -- | Details about the submitter of the import request.
+    submitter :: ImportJobSubmitter,
+    -- | The timestamp when the job was submitted for import.
+    submitTime :: Data.POSIX,
+    -- | The options that was specified at the time of submitting the import
+    -- request.
+    importOptions :: ImportOptions,
+    -- | The source of the data that was submitted for import.
+    dataSource :: ImportDataSource
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TableDataImportJobMetadata' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'submitter', 'tableDataImportJobMetadata_submitter' - Details about the submitter of the import request.
+--
+-- 'submitTime', 'tableDataImportJobMetadata_submitTime' - The timestamp when the job was submitted for import.
+--
+-- 'importOptions', 'tableDataImportJobMetadata_importOptions' - The options that was specified at the time of submitting the import
+-- request.
+--
+-- 'dataSource', 'tableDataImportJobMetadata_dataSource' - The source of the data that was submitted for import.
+newTableDataImportJobMetadata ::
+  -- | 'submitter'
+  ImportJobSubmitter ->
+  -- | 'submitTime'
+  Prelude.UTCTime ->
+  -- | 'importOptions'
+  ImportOptions ->
+  -- | 'dataSource'
+  ImportDataSource ->
+  TableDataImportJobMetadata
+newTableDataImportJobMetadata
+  pSubmitter_
+  pSubmitTime_
+  pImportOptions_
+  pDataSource_ =
+    TableDataImportJobMetadata'
+      { submitter =
+          pSubmitter_,
+        submitTime = Data._Time Lens.# pSubmitTime_,
+        importOptions = pImportOptions_,
+        dataSource = pDataSource_
+      }
+
+-- | Details about the submitter of the import request.
+tableDataImportJobMetadata_submitter :: Lens.Lens' TableDataImportJobMetadata ImportJobSubmitter
+tableDataImportJobMetadata_submitter = Lens.lens (\TableDataImportJobMetadata' {submitter} -> submitter) (\s@TableDataImportJobMetadata' {} a -> s {submitter = a} :: TableDataImportJobMetadata)
+
+-- | The timestamp when the job was submitted for import.
+tableDataImportJobMetadata_submitTime :: Lens.Lens' TableDataImportJobMetadata Prelude.UTCTime
+tableDataImportJobMetadata_submitTime = Lens.lens (\TableDataImportJobMetadata' {submitTime} -> submitTime) (\s@TableDataImportJobMetadata' {} a -> s {submitTime = a} :: TableDataImportJobMetadata) Prelude.. Data._Time
+
+-- | The options that was specified at the time of submitting the import
+-- request.
+tableDataImportJobMetadata_importOptions :: Lens.Lens' TableDataImportJobMetadata ImportOptions
+tableDataImportJobMetadata_importOptions = Lens.lens (\TableDataImportJobMetadata' {importOptions} -> importOptions) (\s@TableDataImportJobMetadata' {} a -> s {importOptions = a} :: TableDataImportJobMetadata)
+
+-- | The source of the data that was submitted for import.
+tableDataImportJobMetadata_dataSource :: Lens.Lens' TableDataImportJobMetadata ImportDataSource
+tableDataImportJobMetadata_dataSource = Lens.lens (\TableDataImportJobMetadata' {dataSource} -> dataSource) (\s@TableDataImportJobMetadata' {} a -> s {dataSource = a} :: TableDataImportJobMetadata)
+
+instance Data.FromJSON TableDataImportJobMetadata where
+  parseJSON =
+    Data.withObject
+      "TableDataImportJobMetadata"
+      ( \x ->
+          TableDataImportJobMetadata'
+            Prelude.<$> (x Data..: "submitter")
+            Prelude.<*> (x Data..: "submitTime")
+            Prelude.<*> (x Data..: "importOptions")
+            Prelude.<*> (x Data..: "dataSource")
+      )
+
+instance Prelude.Hashable TableDataImportJobMetadata where
+  hashWithSalt _salt TableDataImportJobMetadata' {..} =
+    _salt
+      `Prelude.hashWithSalt` submitter
+      `Prelude.hashWithSalt` submitTime
+      `Prelude.hashWithSalt` importOptions
+      `Prelude.hashWithSalt` dataSource
+
+instance Prelude.NFData TableDataImportJobMetadata where
+  rnf TableDataImportJobMetadata' {..} =
+    Prelude.rnf submitter
+      `Prelude.seq` Prelude.rnf submitTime
+      `Prelude.seq` Prelude.rnf importOptions
+      `Prelude.seq` Prelude.rnf dataSource
diff --git a/gen/Amazonka/HoneyCode/Types/TableDataImportJobStatus.hs b/gen/Amazonka/HoneyCode/Types/TableDataImportJobStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/TableDataImportJobStatus.hs
@@ -0,0 +1,81 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.HoneyCode.Types.TableDataImportJobStatus
+-- 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.HoneyCode.Types.TableDataImportJobStatus
+  ( TableDataImportJobStatus
+      ( ..,
+        TableDataImportJobStatus_COMPLETED,
+        TableDataImportJobStatus_FAILED,
+        TableDataImportJobStatus_IN_PROGRESS,
+        TableDataImportJobStatus_SUBMITTED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype TableDataImportJobStatus = TableDataImportJobStatus'
+  { fromTableDataImportJobStatus ::
+      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 TableDataImportJobStatus_COMPLETED :: TableDataImportJobStatus
+pattern TableDataImportJobStatus_COMPLETED = TableDataImportJobStatus' "COMPLETED"
+
+pattern TableDataImportJobStatus_FAILED :: TableDataImportJobStatus
+pattern TableDataImportJobStatus_FAILED = TableDataImportJobStatus' "FAILED"
+
+pattern TableDataImportJobStatus_IN_PROGRESS :: TableDataImportJobStatus
+pattern TableDataImportJobStatus_IN_PROGRESS = TableDataImportJobStatus' "IN_PROGRESS"
+
+pattern TableDataImportJobStatus_SUBMITTED :: TableDataImportJobStatus
+pattern TableDataImportJobStatus_SUBMITTED = TableDataImportJobStatus' "SUBMITTED"
+
+{-# COMPLETE
+  TableDataImportJobStatus_COMPLETED,
+  TableDataImportJobStatus_FAILED,
+  TableDataImportJobStatus_IN_PROGRESS,
+  TableDataImportJobStatus_SUBMITTED,
+  TableDataImportJobStatus'
+  #-}
diff --git a/gen/Amazonka/HoneyCode/Types/TableRow.hs b/gen/Amazonka/HoneyCode/Types/TableRow.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/TableRow.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.HoneyCode.Types.TableRow
+-- 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.HoneyCode.Types.TableRow where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types.Cell
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that contains attributes about a single row in a table
+--
+-- /See:/ 'newTableRow' smart constructor.
+data TableRow = TableRow'
+  { -- | The id of the row in the table.
+    rowId :: Prelude.Text,
+    -- | A list of cells in the table row. The cells appear in the same order as
+    -- the columns of the table.
+    cells :: [Data.Sensitive Cell]
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TableRow' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'rowId', 'tableRow_rowId' - The id of the row in the table.
+--
+-- 'cells', 'tableRow_cells' - A list of cells in the table row. The cells appear in the same order as
+-- the columns of the table.
+newTableRow ::
+  -- | 'rowId'
+  Prelude.Text ->
+  TableRow
+newTableRow pRowId_ =
+  TableRow' {rowId = pRowId_, cells = Prelude.mempty}
+
+-- | The id of the row in the table.
+tableRow_rowId :: Lens.Lens' TableRow Prelude.Text
+tableRow_rowId = Lens.lens (\TableRow' {rowId} -> rowId) (\s@TableRow' {} a -> s {rowId = a} :: TableRow)
+
+-- | A list of cells in the table row. The cells appear in the same order as
+-- the columns of the table.
+tableRow_cells :: Lens.Lens' TableRow [Cell]
+tableRow_cells = Lens.lens (\TableRow' {cells} -> cells) (\s@TableRow' {} a -> s {cells = a} :: TableRow) Prelude.. Lens.coerced
+
+instance Data.FromJSON TableRow where
+  parseJSON =
+    Data.withObject
+      "TableRow"
+      ( \x ->
+          TableRow'
+            Prelude.<$> (x Data..: "rowId")
+            Prelude.<*> (x Data..:? "cells" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable TableRow where
+  hashWithSalt _salt TableRow' {..} =
+    _salt
+      `Prelude.hashWithSalt` rowId
+      `Prelude.hashWithSalt` cells
+
+instance Prelude.NFData TableRow where
+  rnf TableRow' {..} =
+    Prelude.rnf rowId `Prelude.seq` Prelude.rnf cells
diff --git a/gen/Amazonka/HoneyCode/Types/UpdateRowData.hs b/gen/Amazonka/HoneyCode/Types/UpdateRowData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/UpdateRowData.hs
@@ -0,0 +1,94 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.HoneyCode.Types.UpdateRowData
+-- 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.HoneyCode.Types.UpdateRowData where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types.CellInput
+import qualified Amazonka.Prelude as Prelude
+
+-- | Data needed to create a single row in a table as part of the
+-- BatchCreateTableRows request.
+--
+-- /See:/ 'newUpdateRowData' smart constructor.
+data UpdateRowData = UpdateRowData'
+  { -- | The id of the row that needs to be updated.
+    rowId :: Prelude.Text,
+    -- | A map representing the cells to update in the given row. The key is the
+    -- column id of the cell and the value is the CellInput object that
+    -- represents the data to set in that cell.
+    cellsToUpdate :: Prelude.HashMap Prelude.Text CellInput
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateRowData' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'rowId', 'updateRowData_rowId' - The id of the row that needs to be updated.
+--
+-- 'cellsToUpdate', 'updateRowData_cellsToUpdate' - A map representing the cells to update in the given row. The key is the
+-- column id of the cell and the value is the CellInput object that
+-- represents the data to set in that cell.
+newUpdateRowData ::
+  -- | 'rowId'
+  Prelude.Text ->
+  UpdateRowData
+newUpdateRowData pRowId_ =
+  UpdateRowData'
+    { rowId = pRowId_,
+      cellsToUpdate = Prelude.mempty
+    }
+
+-- | The id of the row that needs to be updated.
+updateRowData_rowId :: Lens.Lens' UpdateRowData Prelude.Text
+updateRowData_rowId = Lens.lens (\UpdateRowData' {rowId} -> rowId) (\s@UpdateRowData' {} a -> s {rowId = a} :: UpdateRowData)
+
+-- | A map representing the cells to update in the given row. The key is the
+-- column id of the cell and the value is the CellInput object that
+-- represents the data to set in that cell.
+updateRowData_cellsToUpdate :: Lens.Lens' UpdateRowData (Prelude.HashMap Prelude.Text CellInput)
+updateRowData_cellsToUpdate = Lens.lens (\UpdateRowData' {cellsToUpdate} -> cellsToUpdate) (\s@UpdateRowData' {} a -> s {cellsToUpdate = a} :: UpdateRowData) Prelude.. Lens.coerced
+
+instance Prelude.Hashable UpdateRowData where
+  hashWithSalt _salt UpdateRowData' {..} =
+    _salt
+      `Prelude.hashWithSalt` rowId
+      `Prelude.hashWithSalt` cellsToUpdate
+
+instance Prelude.NFData UpdateRowData where
+  rnf UpdateRowData' {..} =
+    Prelude.rnf rowId
+      `Prelude.seq` Prelude.rnf cellsToUpdate
+
+instance Data.ToJSON UpdateRowData where
+  toJSON UpdateRowData' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("rowId" Data..= rowId),
+            Prelude.Just
+              ("cellsToUpdate" Data..= cellsToUpdate)
+          ]
+      )
diff --git a/gen/Amazonka/HoneyCode/Types/UpsertAction.hs b/gen/Amazonka/HoneyCode/Types/UpsertAction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/UpsertAction.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.HoneyCode.Types.UpsertAction
+-- 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.HoneyCode.Types.UpsertAction
+  ( UpsertAction
+      ( ..,
+        UpsertAction_APPENDED,
+        UpsertAction_UPDATED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype UpsertAction = UpsertAction'
+  { fromUpsertAction ::
+      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 UpsertAction_APPENDED :: UpsertAction
+pattern UpsertAction_APPENDED = UpsertAction' "APPENDED"
+
+pattern UpsertAction_UPDATED :: UpsertAction
+pattern UpsertAction_UPDATED = UpsertAction' "UPDATED"
+
+{-# COMPLETE
+  UpsertAction_APPENDED,
+  UpsertAction_UPDATED,
+  UpsertAction'
+  #-}
diff --git a/gen/Amazonka/HoneyCode/Types/UpsertRowData.hs b/gen/Amazonka/HoneyCode/Types/UpsertRowData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/UpsertRowData.hs
@@ -0,0 +1,151 @@
+{-# 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.HoneyCode.Types.UpsertRowData
+-- 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.HoneyCode.Types.UpsertRowData where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types.CellInput
+import Amazonka.HoneyCode.Types.Filter
+import qualified Amazonka.Prelude as Prelude
+
+-- | Data needed to upsert rows in a table as part of a single item in the
+-- BatchUpsertTableRows request.
+--
+-- /See:/ 'newUpsertRowData' smart constructor.
+data UpsertRowData = UpsertRowData'
+  { -- | An external identifier that represents a single item in the request that
+    -- is being upserted as part of the BatchUpsertTableRows request. This can
+    -- be any string that you can use to identify the item in the request. The
+    -- BatchUpsertTableRows API puts the batch item id in the results to allow
+    -- you to link data in the request to data in the results.
+    batchItemId :: Prelude.Text,
+    -- | The filter formula to use to find existing matching rows to update. The
+    -- formula needs to return zero or more rows. If the formula returns 0
+    -- rows, then a new row will be appended in the target table. If the
+    -- formula returns one or more rows, then the returned rows will be
+    -- updated.
+    --
+    -- Note that the filter formula needs to return rows from the target table
+    -- for the upsert operation to succeed. If the filter formula has a syntax
+    -- error or it doesn\'t evaluate to zero or more rows in the target table
+    -- for any one item in the input list, then the entire BatchUpsertTableRows
+    -- request fails and no updates are made to the table.
+    filter' :: Filter,
+    -- | A map representing the cells to update for the matching rows or an
+    -- appended row. The key is the column id of the cell and the value is the
+    -- CellInput object that represents the data to set in that cell.
+    cellsToUpdate :: Prelude.HashMap Prelude.Text CellInput
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpsertRowData' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'batchItemId', 'upsertRowData_batchItemId' - An external identifier that represents a single item in the request that
+-- is being upserted as part of the BatchUpsertTableRows request. This can
+-- be any string that you can use to identify the item in the request. The
+-- BatchUpsertTableRows API puts the batch item id in the results to allow
+-- you to link data in the request to data in the results.
+--
+-- 'filter'', 'upsertRowData_filter' - The filter formula to use to find existing matching rows to update. The
+-- formula needs to return zero or more rows. If the formula returns 0
+-- rows, then a new row will be appended in the target table. If the
+-- formula returns one or more rows, then the returned rows will be
+-- updated.
+--
+-- Note that the filter formula needs to return rows from the target table
+-- for the upsert operation to succeed. If the filter formula has a syntax
+-- error or it doesn\'t evaluate to zero or more rows in the target table
+-- for any one item in the input list, then the entire BatchUpsertTableRows
+-- request fails and no updates are made to the table.
+--
+-- 'cellsToUpdate', 'upsertRowData_cellsToUpdate' - A map representing the cells to update for the matching rows or an
+-- appended row. The key is the column id of the cell and the value is the
+-- CellInput object that represents the data to set in that cell.
+newUpsertRowData ::
+  -- | 'batchItemId'
+  Prelude.Text ->
+  -- | 'filter''
+  Filter ->
+  UpsertRowData
+newUpsertRowData pBatchItemId_ pFilter_ =
+  UpsertRowData'
+    { batchItemId = pBatchItemId_,
+      filter' = pFilter_,
+      cellsToUpdate = Prelude.mempty
+    }
+
+-- | An external identifier that represents a single item in the request that
+-- is being upserted as part of the BatchUpsertTableRows request. This can
+-- be any string that you can use to identify the item in the request. The
+-- BatchUpsertTableRows API puts the batch item id in the results to allow
+-- you to link data in the request to data in the results.
+upsertRowData_batchItemId :: Lens.Lens' UpsertRowData Prelude.Text
+upsertRowData_batchItemId = Lens.lens (\UpsertRowData' {batchItemId} -> batchItemId) (\s@UpsertRowData' {} a -> s {batchItemId = a} :: UpsertRowData)
+
+-- | The filter formula to use to find existing matching rows to update. The
+-- formula needs to return zero or more rows. If the formula returns 0
+-- rows, then a new row will be appended in the target table. If the
+-- formula returns one or more rows, then the returned rows will be
+-- updated.
+--
+-- Note that the filter formula needs to return rows from the target table
+-- for the upsert operation to succeed. If the filter formula has a syntax
+-- error or it doesn\'t evaluate to zero or more rows in the target table
+-- for any one item in the input list, then the entire BatchUpsertTableRows
+-- request fails and no updates are made to the table.
+upsertRowData_filter :: Lens.Lens' UpsertRowData Filter
+upsertRowData_filter = Lens.lens (\UpsertRowData' {filter'} -> filter') (\s@UpsertRowData' {} a -> s {filter' = a} :: UpsertRowData)
+
+-- | A map representing the cells to update for the matching rows or an
+-- appended row. The key is the column id of the cell and the value is the
+-- CellInput object that represents the data to set in that cell.
+upsertRowData_cellsToUpdate :: Lens.Lens' UpsertRowData (Prelude.HashMap Prelude.Text CellInput)
+upsertRowData_cellsToUpdate = Lens.lens (\UpsertRowData' {cellsToUpdate} -> cellsToUpdate) (\s@UpsertRowData' {} a -> s {cellsToUpdate = a} :: UpsertRowData) Prelude.. Lens.coerced
+
+instance Prelude.Hashable UpsertRowData where
+  hashWithSalt _salt UpsertRowData' {..} =
+    _salt
+      `Prelude.hashWithSalt` batchItemId
+      `Prelude.hashWithSalt` filter'
+      `Prelude.hashWithSalt` cellsToUpdate
+
+instance Prelude.NFData UpsertRowData where
+  rnf UpsertRowData' {..} =
+    Prelude.rnf batchItemId
+      `Prelude.seq` Prelude.rnf filter'
+      `Prelude.seq` Prelude.rnf cellsToUpdate
+
+instance Data.ToJSON UpsertRowData where
+  toJSON UpsertRowData' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("batchItemId" Data..= batchItemId),
+            Prelude.Just ("filter" Data..= filter'),
+            Prelude.Just
+              ("cellsToUpdate" Data..= cellsToUpdate)
+          ]
+      )
diff --git a/gen/Amazonka/HoneyCode/Types/UpsertRowsResult.hs b/gen/Amazonka/HoneyCode/Types/UpsertRowsResult.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/UpsertRowsResult.hs
@@ -0,0 +1,102 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.HoneyCode.Types.UpsertRowsResult
+-- 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.HoneyCode.Types.UpsertRowsResult where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types.UpsertAction
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the result of a single upsert row request.
+--
+-- /See:/ 'newUpsertRowsResult' smart constructor.
+data UpsertRowsResult = UpsertRowsResult'
+  { -- | The list of row ids that were changed as part of an upsert row
+    -- operation. If the upsert resulted in an update, this list could
+    -- potentially contain multiple rows that matched the filter and hence got
+    -- updated. If the upsert resulted in an append, this list would only have
+    -- the single row that was appended.
+    rowIds :: Prelude.NonEmpty Prelude.Text,
+    -- | The result of the upsert action.
+    upsertAction :: UpsertAction
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpsertRowsResult' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'rowIds', 'upsertRowsResult_rowIds' - The list of row ids that were changed as part of an upsert row
+-- operation. If the upsert resulted in an update, this list could
+-- potentially contain multiple rows that matched the filter and hence got
+-- updated. If the upsert resulted in an append, this list would only have
+-- the single row that was appended.
+--
+-- 'upsertAction', 'upsertRowsResult_upsertAction' - The result of the upsert action.
+newUpsertRowsResult ::
+  -- | 'rowIds'
+  Prelude.NonEmpty Prelude.Text ->
+  -- | 'upsertAction'
+  UpsertAction ->
+  UpsertRowsResult
+newUpsertRowsResult pRowIds_ pUpsertAction_ =
+  UpsertRowsResult'
+    { rowIds =
+        Lens.coerced Lens.# pRowIds_,
+      upsertAction = pUpsertAction_
+    }
+
+-- | The list of row ids that were changed as part of an upsert row
+-- operation. If the upsert resulted in an update, this list could
+-- potentially contain multiple rows that matched the filter and hence got
+-- updated. If the upsert resulted in an append, this list would only have
+-- the single row that was appended.
+upsertRowsResult_rowIds :: Lens.Lens' UpsertRowsResult (Prelude.NonEmpty Prelude.Text)
+upsertRowsResult_rowIds = Lens.lens (\UpsertRowsResult' {rowIds} -> rowIds) (\s@UpsertRowsResult' {} a -> s {rowIds = a} :: UpsertRowsResult) Prelude.. Lens.coerced
+
+-- | The result of the upsert action.
+upsertRowsResult_upsertAction :: Lens.Lens' UpsertRowsResult UpsertAction
+upsertRowsResult_upsertAction = Lens.lens (\UpsertRowsResult' {upsertAction} -> upsertAction) (\s@UpsertRowsResult' {} a -> s {upsertAction = a} :: UpsertRowsResult)
+
+instance Data.FromJSON UpsertRowsResult where
+  parseJSON =
+    Data.withObject
+      "UpsertRowsResult"
+      ( \x ->
+          UpsertRowsResult'
+            Prelude.<$> (x Data..: "rowIds")
+            Prelude.<*> (x Data..: "upsertAction")
+      )
+
+instance Prelude.Hashable UpsertRowsResult where
+  hashWithSalt _salt UpsertRowsResult' {..} =
+    _salt
+      `Prelude.hashWithSalt` rowIds
+      `Prelude.hashWithSalt` upsertAction
+
+instance Prelude.NFData UpsertRowsResult where
+  rnf UpsertRowsResult' {..} =
+    Prelude.rnf rowIds
+      `Prelude.seq` Prelude.rnf upsertAction
diff --git a/gen/Amazonka/HoneyCode/Types/VariableValue.hs b/gen/Amazonka/HoneyCode/Types/VariableValue.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/Types/VariableValue.hs
@@ -0,0 +1,69 @@
+{-# 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.HoneyCode.Types.VariableValue
+-- 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.HoneyCode.Types.VariableValue 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 input variables to the app to be used by the InvokeScreenAutomation
+-- action request.
+--
+-- /See:/ 'newVariableValue' smart constructor.
+data VariableValue = VariableValue'
+  { -- | Raw value of the variable.
+    rawValue :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VariableValue' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'rawValue', 'variableValue_rawValue' - Raw value of the variable.
+newVariableValue ::
+  -- | 'rawValue'
+  Prelude.Text ->
+  VariableValue
+newVariableValue pRawValue_ =
+  VariableValue' {rawValue = pRawValue_}
+
+-- | Raw value of the variable.
+variableValue_rawValue :: Lens.Lens' VariableValue Prelude.Text
+variableValue_rawValue = Lens.lens (\VariableValue' {rawValue} -> rawValue) (\s@VariableValue' {} a -> s {rawValue = a} :: VariableValue)
+
+instance Prelude.Hashable VariableValue where
+  hashWithSalt _salt VariableValue' {..} =
+    _salt `Prelude.hashWithSalt` rawValue
+
+instance Prelude.NFData VariableValue where
+  rnf VariableValue' {..} = Prelude.rnf rawValue
+
+instance Data.ToJSON VariableValue where
+  toJSON VariableValue' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("rawValue" Data..= rawValue)]
+      )
diff --git a/gen/Amazonka/HoneyCode/UntagResource.hs b/gen/Amazonka/HoneyCode/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/UntagResource.hs
@@ -0,0 +1,163 @@
+{-# 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.HoneyCode.UntagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- The UntagResource API allows you to removes tags from an ARN-able
+-- resource. Resource includes workbook, table, screen and
+-- screen-automation.
+module Amazonka.HoneyCode.UntagResource
+  ( -- * Creating a Request
+    UntagResource (..),
+    newUntagResource,
+
+    -- * Request Lenses
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+
+    -- * Destructuring the Response
+    UntagResourceResponse (..),
+    newUntagResourceResponse,
+
+    -- * Response Lenses
+    untagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUntagResource' smart constructor.
+data UntagResource = UntagResource'
+  { -- | The resource\'s Amazon Resource Name (ARN).
+    resourceArn :: Prelude.Text,
+    -- | A list of tag keys to remove from the resource.
+    tagKeys :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'untagResource_resourceArn' - The resource\'s Amazon Resource Name (ARN).
+--
+-- 'tagKeys', 'untagResource_tagKeys' - A list of tag keys to remove from the resource.
+newUntagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  UntagResource
+newUntagResource pResourceArn_ =
+  UntagResource'
+    { resourceArn = pResourceArn_,
+      tagKeys = Prelude.mempty
+    }
+
+-- | The resource\'s Amazon Resource Name (ARN).
+untagResource_resourceArn :: Lens.Lens' UntagResource Prelude.Text
+untagResource_resourceArn = Lens.lens (\UntagResource' {resourceArn} -> resourceArn) (\s@UntagResource' {} a -> s {resourceArn = a} :: UntagResource)
+
+-- | A list of tag keys to remove from the resource.
+untagResource_tagKeys :: Lens.Lens' UntagResource [Prelude.Text]
+untagResource_tagKeys = Lens.lens (\UntagResource' {tagKeys} -> tagKeys) (\s@UntagResource' {} a -> s {tagKeys = a} :: UntagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest UntagResource where
+  type
+    AWSResponse UntagResource =
+      UntagResourceResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UntagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UntagResource where
+  hashWithSalt _salt UntagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tagKeys
+
+instance Prelude.NFData UntagResource where
+  rnf UntagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tagKeys
+
+instance Data.ToHeaders UntagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath UntagResource where
+  toPath UntagResource' {..} =
+    Prelude.mconcat ["/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery UntagResource where
+  toQuery UntagResource' {..} =
+    Prelude.mconcat
+      ["tagKeys" Data.=: Data.toQueryList "member" tagKeys]
+
+-- | /See:/ 'newUntagResourceResponse' smart constructor.
+data UntagResourceResponse = UntagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'untagResourceResponse_httpStatus' - The response's http status code.
+newUntagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UntagResourceResponse
+newUntagResourceResponse pHttpStatus_ =
+  UntagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+untagResourceResponse_httpStatus :: Lens.Lens' UntagResourceResponse Prelude.Int
+untagResourceResponse_httpStatus = Lens.lens (\UntagResourceResponse' {httpStatus} -> httpStatus) (\s@UntagResourceResponse' {} a -> s {httpStatus = a} :: UntagResourceResponse)
+
+instance Prelude.NFData UntagResourceResponse where
+  rnf UntagResourceResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/HoneyCode/Waiters.hs b/gen/Amazonka/HoneyCode/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/HoneyCode/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.HoneyCode.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.HoneyCode.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.HoneyCode.Lens
+import Amazonka.HoneyCode.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.HoneyCode
+import Test.Amazonka.HoneyCode.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "HoneyCode"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/Gen/HoneyCode.hs b/test/Test/Amazonka/Gen/HoneyCode.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/HoneyCode.hs
@@ -0,0 +1,338 @@
+{-# 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.HoneyCode
+-- 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.HoneyCode where
+
+import Amazonka.HoneyCode
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.Fixture
+import Test.Amazonka.HoneyCode.Internal
+import Test.Amazonka.Prelude
+import Test.Tasty
+
+-- Auto-generated: the actual test selection needs to be manually placed into
+-- the top-level so that real test data can be incrementally added.
+--
+-- This commented snippet is what the entire set should look like:
+
+-- fixtures :: TestTree
+-- fixtures =
+--     [ testGroup "request"
+--         [ requestBatchCreateTableRows $
+--             newBatchCreateTableRows
+--
+--         , requestBatchDeleteTableRows $
+--             newBatchDeleteTableRows
+--
+--         , requestBatchUpdateTableRows $
+--             newBatchUpdateTableRows
+--
+--         , requestBatchUpsertTableRows $
+--             newBatchUpsertTableRows
+--
+--         , requestDescribeTableDataImportJob $
+--             newDescribeTableDataImportJob
+--
+--         , requestGetScreenData $
+--             newGetScreenData
+--
+--         , requestInvokeScreenAutomation $
+--             newInvokeScreenAutomation
+--
+--         , requestListTableColumns $
+--             newListTableColumns
+--
+--         , requestListTableRows $
+--             newListTableRows
+--
+--         , requestListTables $
+--             newListTables
+--
+--         , requestListTagsForResource $
+--             newListTagsForResource
+--
+--         , requestQueryTableRows $
+--             newQueryTableRows
+--
+--         , requestStartTableDataImportJob $
+--             newStartTableDataImportJob
+--
+--         , requestTagResource $
+--             newTagResource
+--
+--         , requestUntagResource $
+--             newUntagResource
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseBatchCreateTableRows $
+--             newBatchCreateTableRowsResponse
+--
+--         , responseBatchDeleteTableRows $
+--             newBatchDeleteTableRowsResponse
+--
+--         , responseBatchUpdateTableRows $
+--             newBatchUpdateTableRowsResponse
+--
+--         , responseBatchUpsertTableRows $
+--             newBatchUpsertTableRowsResponse
+--
+--         , responseDescribeTableDataImportJob $
+--             newDescribeTableDataImportJobResponse
+--
+--         , responseGetScreenData $
+--             newGetScreenDataResponse
+--
+--         , responseInvokeScreenAutomation $
+--             newInvokeScreenAutomationResponse
+--
+--         , responseListTableColumns $
+--             newListTableColumnsResponse
+--
+--         , responseListTableRows $
+--             newListTableRowsResponse
+--
+--         , responseListTables $
+--             newListTablesResponse
+--
+--         , responseListTagsForResource $
+--             newListTagsForResourceResponse
+--
+--         , responseQueryTableRows $
+--             newQueryTableRowsResponse
+--
+--         , responseStartTableDataImportJob $
+--             newStartTableDataImportJobResponse
+--
+--         , responseTagResource $
+--             newTagResourceResponse
+--
+--         , responseUntagResource $
+--             newUntagResourceResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestBatchCreateTableRows :: BatchCreateTableRows -> TestTree
+requestBatchCreateTableRows =
+  req
+    "BatchCreateTableRows"
+    "fixture/BatchCreateTableRows.yaml"
+
+requestBatchDeleteTableRows :: BatchDeleteTableRows -> TestTree
+requestBatchDeleteTableRows =
+  req
+    "BatchDeleteTableRows"
+    "fixture/BatchDeleteTableRows.yaml"
+
+requestBatchUpdateTableRows :: BatchUpdateTableRows -> TestTree
+requestBatchUpdateTableRows =
+  req
+    "BatchUpdateTableRows"
+    "fixture/BatchUpdateTableRows.yaml"
+
+requestBatchUpsertTableRows :: BatchUpsertTableRows -> TestTree
+requestBatchUpsertTableRows =
+  req
+    "BatchUpsertTableRows"
+    "fixture/BatchUpsertTableRows.yaml"
+
+requestDescribeTableDataImportJob :: DescribeTableDataImportJob -> TestTree
+requestDescribeTableDataImportJob =
+  req
+    "DescribeTableDataImportJob"
+    "fixture/DescribeTableDataImportJob.yaml"
+
+requestGetScreenData :: GetScreenData -> TestTree
+requestGetScreenData =
+  req
+    "GetScreenData"
+    "fixture/GetScreenData.yaml"
+
+requestInvokeScreenAutomation :: InvokeScreenAutomation -> TestTree
+requestInvokeScreenAutomation =
+  req
+    "InvokeScreenAutomation"
+    "fixture/InvokeScreenAutomation.yaml"
+
+requestListTableColumns :: ListTableColumns -> TestTree
+requestListTableColumns =
+  req
+    "ListTableColumns"
+    "fixture/ListTableColumns.yaml"
+
+requestListTableRows :: ListTableRows -> TestTree
+requestListTableRows =
+  req
+    "ListTableRows"
+    "fixture/ListTableRows.yaml"
+
+requestListTables :: ListTables -> TestTree
+requestListTables =
+  req
+    "ListTables"
+    "fixture/ListTables.yaml"
+
+requestListTagsForResource :: ListTagsForResource -> TestTree
+requestListTagsForResource =
+  req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource.yaml"
+
+requestQueryTableRows :: QueryTableRows -> TestTree
+requestQueryTableRows =
+  req
+    "QueryTableRows"
+    "fixture/QueryTableRows.yaml"
+
+requestStartTableDataImportJob :: StartTableDataImportJob -> TestTree
+requestStartTableDataImportJob =
+  req
+    "StartTableDataImportJob"
+    "fixture/StartTableDataImportJob.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource =
+  req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource =
+  req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+-- Responses
+
+responseBatchCreateTableRows :: BatchCreateTableRowsResponse -> TestTree
+responseBatchCreateTableRows =
+  res
+    "BatchCreateTableRowsResponse"
+    "fixture/BatchCreateTableRowsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchCreateTableRows)
+
+responseBatchDeleteTableRows :: BatchDeleteTableRowsResponse -> TestTree
+responseBatchDeleteTableRows =
+  res
+    "BatchDeleteTableRowsResponse"
+    "fixture/BatchDeleteTableRowsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchDeleteTableRows)
+
+responseBatchUpdateTableRows :: BatchUpdateTableRowsResponse -> TestTree
+responseBatchUpdateTableRows =
+  res
+    "BatchUpdateTableRowsResponse"
+    "fixture/BatchUpdateTableRowsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchUpdateTableRows)
+
+responseBatchUpsertTableRows :: BatchUpsertTableRowsResponse -> TestTree
+responseBatchUpsertTableRows =
+  res
+    "BatchUpsertTableRowsResponse"
+    "fixture/BatchUpsertTableRowsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchUpsertTableRows)
+
+responseDescribeTableDataImportJob :: DescribeTableDataImportJobResponse -> TestTree
+responseDescribeTableDataImportJob =
+  res
+    "DescribeTableDataImportJobResponse"
+    "fixture/DescribeTableDataImportJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeTableDataImportJob)
+
+responseGetScreenData :: GetScreenDataResponse -> TestTree
+responseGetScreenData =
+  res
+    "GetScreenDataResponse"
+    "fixture/GetScreenDataResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetScreenData)
+
+responseInvokeScreenAutomation :: InvokeScreenAutomationResponse -> TestTree
+responseInvokeScreenAutomation =
+  res
+    "InvokeScreenAutomationResponse"
+    "fixture/InvokeScreenAutomationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy InvokeScreenAutomation)
+
+responseListTableColumns :: ListTableColumnsResponse -> TestTree
+responseListTableColumns =
+  res
+    "ListTableColumnsResponse"
+    "fixture/ListTableColumnsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTableColumns)
+
+responseListTableRows :: ListTableRowsResponse -> TestTree
+responseListTableRows =
+  res
+    "ListTableRowsResponse"
+    "fixture/ListTableRowsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTableRows)
+
+responseListTables :: ListTablesResponse -> TestTree
+responseListTables =
+  res
+    "ListTablesResponse"
+    "fixture/ListTablesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTables)
+
+responseListTagsForResource :: ListTagsForResourceResponse -> TestTree
+responseListTagsForResource =
+  res
+    "ListTagsForResourceResponse"
+    "fixture/ListTagsForResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTagsForResource)
+
+responseQueryTableRows :: QueryTableRowsResponse -> TestTree
+responseQueryTableRows =
+  res
+    "QueryTableRowsResponse"
+    "fixture/QueryTableRowsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy QueryTableRows)
+
+responseStartTableDataImportJob :: StartTableDataImportJobResponse -> TestTree
+responseStartTableDataImportJob =
+  res
+    "StartTableDataImportJobResponse"
+    "fixture/StartTableDataImportJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StartTableDataImportJob)
+
+responseTagResource :: TagResourceResponse -> TestTree
+responseTagResource =
+  res
+    "TagResourceResponse"
+    "fixture/TagResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy TagResource)
+
+responseUntagResource :: UntagResourceResponse -> TestTree
+responseUntagResource =
+  res
+    "UntagResourceResponse"
+    "fixture/UntagResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UntagResource)
diff --git a/test/Test/Amazonka/HoneyCode.hs b/test/Test/Amazonka/HoneyCode.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/HoneyCode.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.HoneyCode
+-- 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.HoneyCode
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/HoneyCode/Internal.hs b/test/Test/Amazonka/HoneyCode/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/HoneyCode/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.HoneyCode.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.HoneyCode.Internal where
