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 Textract SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2018-06-27@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-textract)
+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.Textract](http://hackage.haskell.org/package/amazonka-textract/docs/Amazonka-Textract.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-textract` 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-textract.cabal b/amazonka-textract.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-textract.cabal
@@ -0,0 +1,147 @@
+cabal-version:      2.2
+name:               amazonka-textract
+version:            2.0
+synopsis:           Amazon Textract 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 @2018-06-27@ 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.Textract.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.Textract" 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-textract
+
+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.Textract
+    Amazonka.Textract.AnalyzeDocument
+    Amazonka.Textract.AnalyzeExpense
+    Amazonka.Textract.AnalyzeID
+    Amazonka.Textract.DetectDocumentText
+    Amazonka.Textract.GetDocumentAnalysis
+    Amazonka.Textract.GetDocumentTextDetection
+    Amazonka.Textract.GetExpenseAnalysis
+    Amazonka.Textract.GetLendingAnalysis
+    Amazonka.Textract.GetLendingAnalysisSummary
+    Amazonka.Textract.Lens
+    Amazonka.Textract.StartDocumentAnalysis
+    Amazonka.Textract.StartDocumentTextDetection
+    Amazonka.Textract.StartExpenseAnalysis
+    Amazonka.Textract.StartLendingAnalysis
+    Amazonka.Textract.Types
+    Amazonka.Textract.Types.AnalyzeIDDetections
+    Amazonka.Textract.Types.Block
+    Amazonka.Textract.Types.BlockType
+    Amazonka.Textract.Types.BoundingBox
+    Amazonka.Textract.Types.ContentClassifier
+    Amazonka.Textract.Types.DetectedSignature
+    Amazonka.Textract.Types.Document
+    Amazonka.Textract.Types.DocumentGroup
+    Amazonka.Textract.Types.DocumentLocation
+    Amazonka.Textract.Types.DocumentMetadata
+    Amazonka.Textract.Types.EntityType
+    Amazonka.Textract.Types.ExpenseCurrency
+    Amazonka.Textract.Types.ExpenseDetection
+    Amazonka.Textract.Types.ExpenseDocument
+    Amazonka.Textract.Types.ExpenseField
+    Amazonka.Textract.Types.ExpenseGroupProperty
+    Amazonka.Textract.Types.ExpenseType
+    Amazonka.Textract.Types.Extraction
+    Amazonka.Textract.Types.FeatureType
+    Amazonka.Textract.Types.Geometry
+    Amazonka.Textract.Types.HumanLoopActivationOutput
+    Amazonka.Textract.Types.HumanLoopConfig
+    Amazonka.Textract.Types.HumanLoopDataAttributes
+    Amazonka.Textract.Types.IdentityDocument
+    Amazonka.Textract.Types.IdentityDocumentField
+    Amazonka.Textract.Types.JobStatus
+    Amazonka.Textract.Types.LendingDetection
+    Amazonka.Textract.Types.LendingDocument
+    Amazonka.Textract.Types.LendingField
+    Amazonka.Textract.Types.LendingResult
+    Amazonka.Textract.Types.LendingSummary
+    Amazonka.Textract.Types.LineItemFields
+    Amazonka.Textract.Types.LineItemGroup
+    Amazonka.Textract.Types.NormalizedValue
+    Amazonka.Textract.Types.NotificationChannel
+    Amazonka.Textract.Types.OutputConfig
+    Amazonka.Textract.Types.PageClassification
+    Amazonka.Textract.Types.Point
+    Amazonka.Textract.Types.Prediction
+    Amazonka.Textract.Types.QueriesConfig
+    Amazonka.Textract.Types.Query
+    Amazonka.Textract.Types.Relationship
+    Amazonka.Textract.Types.RelationshipType
+    Amazonka.Textract.Types.S3Object
+    Amazonka.Textract.Types.SelectionStatus
+    Amazonka.Textract.Types.SignatureDetection
+    Amazonka.Textract.Types.SplitDocument
+    Amazonka.Textract.Types.TextType
+    Amazonka.Textract.Types.UndetectedSignature
+    Amazonka.Textract.Types.ValueType
+    Amazonka.Textract.Types.Warning
+    Amazonka.Textract.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-textract-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.Textract
+    Test.Amazonka.Textract
+    Test.Amazonka.Textract.Internal
+
+  build-depends:
+    , amazonka-core         >=2.0 && <2.1
+    , amazonka-test         >=2.0 && <2.1
+    , amazonka-textract
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/AnalyzeDocument.yaml b/fixture/AnalyzeDocument.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/AnalyzeDocument.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/textract/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  textract.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/AnalyzeDocumentResponse.proto b/fixture/AnalyzeDocumentResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/AnalyzeDocumentResponse.proto
diff --git a/fixture/AnalyzeExpense.yaml b/fixture/AnalyzeExpense.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/AnalyzeExpense.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/textract/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  textract.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/AnalyzeExpenseResponse.proto b/fixture/AnalyzeExpenseResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/AnalyzeExpenseResponse.proto
diff --git a/fixture/AnalyzeID.yaml b/fixture/AnalyzeID.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/AnalyzeID.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/textract/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  textract.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/AnalyzeIDResponse.proto b/fixture/AnalyzeIDResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/AnalyzeIDResponse.proto
diff --git a/fixture/DetectDocumentText.yaml b/fixture/DetectDocumentText.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DetectDocumentText.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/textract/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  textract.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/DetectDocumentTextResponse.proto b/fixture/DetectDocumentTextResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DetectDocumentTextResponse.proto
diff --git a/fixture/GetDocumentAnalysis.yaml b/fixture/GetDocumentAnalysis.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetDocumentAnalysis.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/textract/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  textract.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/GetDocumentAnalysisResponse.proto b/fixture/GetDocumentAnalysisResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetDocumentAnalysisResponse.proto
diff --git a/fixture/GetDocumentTextDetection.yaml b/fixture/GetDocumentTextDetection.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetDocumentTextDetection.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/textract/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  textract.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/GetDocumentTextDetectionResponse.proto b/fixture/GetDocumentTextDetectionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetDocumentTextDetectionResponse.proto
diff --git a/fixture/GetExpenseAnalysis.yaml b/fixture/GetExpenseAnalysis.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetExpenseAnalysis.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/textract/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  textract.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/GetExpenseAnalysisResponse.proto b/fixture/GetExpenseAnalysisResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetExpenseAnalysisResponse.proto
diff --git a/fixture/GetLendingAnalysis.yaml b/fixture/GetLendingAnalysis.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetLendingAnalysis.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/textract/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  textract.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/GetLendingAnalysisResponse.proto b/fixture/GetLendingAnalysisResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetLendingAnalysisResponse.proto
diff --git a/fixture/GetLendingAnalysisSummary.yaml b/fixture/GetLendingAnalysisSummary.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetLendingAnalysisSummary.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/textract/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  textract.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/GetLendingAnalysisSummaryResponse.proto b/fixture/GetLendingAnalysisSummaryResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetLendingAnalysisSummaryResponse.proto
diff --git a/fixture/StartDocumentAnalysis.yaml b/fixture/StartDocumentAnalysis.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StartDocumentAnalysis.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/textract/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  textract.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/StartDocumentAnalysisResponse.proto b/fixture/StartDocumentAnalysisResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StartDocumentAnalysisResponse.proto
diff --git a/fixture/StartDocumentTextDetection.yaml b/fixture/StartDocumentTextDetection.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StartDocumentTextDetection.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/textract/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  textract.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/StartDocumentTextDetectionResponse.proto b/fixture/StartDocumentTextDetectionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StartDocumentTextDetectionResponse.proto
diff --git a/fixture/StartExpenseAnalysis.yaml b/fixture/StartExpenseAnalysis.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StartExpenseAnalysis.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/textract/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  textract.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/StartExpenseAnalysisResponse.proto b/fixture/StartExpenseAnalysisResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StartExpenseAnalysisResponse.proto
diff --git a/fixture/StartLendingAnalysis.yaml b/fixture/StartLendingAnalysis.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StartLendingAnalysis.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/textract/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  textract.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/StartLendingAnalysisResponse.proto b/fixture/StartLendingAnalysisResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StartLendingAnalysisResponse.proto
diff --git a/gen/Amazonka/Textract.hs b/gen/Amazonka/Textract.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract.hs
@@ -0,0 +1,391 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.Textract
+-- 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 @2018-06-27@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- Amazon Textract detects and analyzes text in documents and converts it
+-- into machine-readable text. This is the API reference documentation for
+-- Amazon Textract.
+module Amazonka.Textract
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** AccessDeniedException
+    _AccessDeniedException,
+
+    -- ** BadDocumentException
+    _BadDocumentException,
+
+    -- ** DocumentTooLargeException
+    _DocumentTooLargeException,
+
+    -- ** HumanLoopQuotaExceededException
+    _HumanLoopQuotaExceededException,
+
+    -- ** IdempotentParameterMismatchException
+    _IdempotentParameterMismatchException,
+
+    -- ** InternalServerError
+    _InternalServerError,
+
+    -- ** InvalidJobIdException
+    _InvalidJobIdException,
+
+    -- ** InvalidKMSKeyException
+    _InvalidKMSKeyException,
+
+    -- ** InvalidParameterException
+    _InvalidParameterException,
+
+    -- ** InvalidS3ObjectException
+    _InvalidS3ObjectException,
+
+    -- ** LimitExceededException
+    _LimitExceededException,
+
+    -- ** ProvisionedThroughputExceededException
+    _ProvisionedThroughputExceededException,
+
+    -- ** ThrottlingException
+    _ThrottlingException,
+
+    -- ** UnsupportedDocumentException
+    _UnsupportedDocumentException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** AnalyzeDocument
+    AnalyzeDocument (AnalyzeDocument'),
+    newAnalyzeDocument,
+    AnalyzeDocumentResponse (AnalyzeDocumentResponse'),
+    newAnalyzeDocumentResponse,
+
+    -- ** AnalyzeExpense
+    AnalyzeExpense (AnalyzeExpense'),
+    newAnalyzeExpense,
+    AnalyzeExpenseResponse (AnalyzeExpenseResponse'),
+    newAnalyzeExpenseResponse,
+
+    -- ** AnalyzeID
+    AnalyzeID (AnalyzeID'),
+    newAnalyzeID,
+    AnalyzeIDResponse (AnalyzeIDResponse'),
+    newAnalyzeIDResponse,
+
+    -- ** DetectDocumentText
+    DetectDocumentText (DetectDocumentText'),
+    newDetectDocumentText,
+    DetectDocumentTextResponse (DetectDocumentTextResponse'),
+    newDetectDocumentTextResponse,
+
+    -- ** GetDocumentAnalysis
+    GetDocumentAnalysis (GetDocumentAnalysis'),
+    newGetDocumentAnalysis,
+    GetDocumentAnalysisResponse (GetDocumentAnalysisResponse'),
+    newGetDocumentAnalysisResponse,
+
+    -- ** GetDocumentTextDetection
+    GetDocumentTextDetection (GetDocumentTextDetection'),
+    newGetDocumentTextDetection,
+    GetDocumentTextDetectionResponse (GetDocumentTextDetectionResponse'),
+    newGetDocumentTextDetectionResponse,
+
+    -- ** GetExpenseAnalysis
+    GetExpenseAnalysis (GetExpenseAnalysis'),
+    newGetExpenseAnalysis,
+    GetExpenseAnalysisResponse (GetExpenseAnalysisResponse'),
+    newGetExpenseAnalysisResponse,
+
+    -- ** GetLendingAnalysis
+    GetLendingAnalysis (GetLendingAnalysis'),
+    newGetLendingAnalysis,
+    GetLendingAnalysisResponse (GetLendingAnalysisResponse'),
+    newGetLendingAnalysisResponse,
+
+    -- ** GetLendingAnalysisSummary
+    GetLendingAnalysisSummary (GetLendingAnalysisSummary'),
+    newGetLendingAnalysisSummary,
+    GetLendingAnalysisSummaryResponse (GetLendingAnalysisSummaryResponse'),
+    newGetLendingAnalysisSummaryResponse,
+
+    -- ** StartDocumentAnalysis
+    StartDocumentAnalysis (StartDocumentAnalysis'),
+    newStartDocumentAnalysis,
+    StartDocumentAnalysisResponse (StartDocumentAnalysisResponse'),
+    newStartDocumentAnalysisResponse,
+
+    -- ** StartDocumentTextDetection
+    StartDocumentTextDetection (StartDocumentTextDetection'),
+    newStartDocumentTextDetection,
+    StartDocumentTextDetectionResponse (StartDocumentTextDetectionResponse'),
+    newStartDocumentTextDetectionResponse,
+
+    -- ** StartExpenseAnalysis
+    StartExpenseAnalysis (StartExpenseAnalysis'),
+    newStartExpenseAnalysis,
+    StartExpenseAnalysisResponse (StartExpenseAnalysisResponse'),
+    newStartExpenseAnalysisResponse,
+
+    -- ** StartLendingAnalysis
+    StartLendingAnalysis (StartLendingAnalysis'),
+    newStartLendingAnalysis,
+    StartLendingAnalysisResponse (StartLendingAnalysisResponse'),
+    newStartLendingAnalysisResponse,
+
+    -- * Types
+
+    -- ** BlockType
+    BlockType (..),
+
+    -- ** ContentClassifier
+    ContentClassifier (..),
+
+    -- ** EntityType
+    EntityType (..),
+
+    -- ** FeatureType
+    FeatureType (..),
+
+    -- ** JobStatus
+    JobStatus (..),
+
+    -- ** RelationshipType
+    RelationshipType (..),
+
+    -- ** SelectionStatus
+    SelectionStatus (..),
+
+    -- ** TextType
+    TextType (..),
+
+    -- ** ValueType
+    ValueType (..),
+
+    -- ** AnalyzeIDDetections
+    AnalyzeIDDetections (AnalyzeIDDetections'),
+    newAnalyzeIDDetections,
+
+    -- ** Block
+    Block (Block'),
+    newBlock,
+
+    -- ** BoundingBox
+    BoundingBox (BoundingBox'),
+    newBoundingBox,
+
+    -- ** DetectedSignature
+    DetectedSignature (DetectedSignature'),
+    newDetectedSignature,
+
+    -- ** Document
+    Document (Document'),
+    newDocument,
+
+    -- ** DocumentGroup
+    DocumentGroup (DocumentGroup'),
+    newDocumentGroup,
+
+    -- ** DocumentLocation
+    DocumentLocation (DocumentLocation'),
+    newDocumentLocation,
+
+    -- ** DocumentMetadata
+    DocumentMetadata (DocumentMetadata'),
+    newDocumentMetadata,
+
+    -- ** ExpenseCurrency
+    ExpenseCurrency (ExpenseCurrency'),
+    newExpenseCurrency,
+
+    -- ** ExpenseDetection
+    ExpenseDetection (ExpenseDetection'),
+    newExpenseDetection,
+
+    -- ** ExpenseDocument
+    ExpenseDocument (ExpenseDocument'),
+    newExpenseDocument,
+
+    -- ** ExpenseField
+    ExpenseField (ExpenseField'),
+    newExpenseField,
+
+    -- ** ExpenseGroupProperty
+    ExpenseGroupProperty (ExpenseGroupProperty'),
+    newExpenseGroupProperty,
+
+    -- ** ExpenseType
+    ExpenseType (ExpenseType'),
+    newExpenseType,
+
+    -- ** Extraction
+    Extraction (Extraction'),
+    newExtraction,
+
+    -- ** Geometry
+    Geometry (Geometry'),
+    newGeometry,
+
+    -- ** HumanLoopActivationOutput
+    HumanLoopActivationOutput (HumanLoopActivationOutput'),
+    newHumanLoopActivationOutput,
+
+    -- ** HumanLoopConfig
+    HumanLoopConfig (HumanLoopConfig'),
+    newHumanLoopConfig,
+
+    -- ** HumanLoopDataAttributes
+    HumanLoopDataAttributes (HumanLoopDataAttributes'),
+    newHumanLoopDataAttributes,
+
+    -- ** IdentityDocument
+    IdentityDocument (IdentityDocument'),
+    newIdentityDocument,
+
+    -- ** IdentityDocumentField
+    IdentityDocumentField (IdentityDocumentField'),
+    newIdentityDocumentField,
+
+    -- ** LendingDetection
+    LendingDetection (LendingDetection'),
+    newLendingDetection,
+
+    -- ** LendingDocument
+    LendingDocument (LendingDocument'),
+    newLendingDocument,
+
+    -- ** LendingField
+    LendingField (LendingField'),
+    newLendingField,
+
+    -- ** LendingResult
+    LendingResult (LendingResult'),
+    newLendingResult,
+
+    -- ** LendingSummary
+    LendingSummary (LendingSummary'),
+    newLendingSummary,
+
+    -- ** LineItemFields
+    LineItemFields (LineItemFields'),
+    newLineItemFields,
+
+    -- ** LineItemGroup
+    LineItemGroup (LineItemGroup'),
+    newLineItemGroup,
+
+    -- ** NormalizedValue
+    NormalizedValue (NormalizedValue'),
+    newNormalizedValue,
+
+    -- ** NotificationChannel
+    NotificationChannel (NotificationChannel'),
+    newNotificationChannel,
+
+    -- ** OutputConfig
+    OutputConfig (OutputConfig'),
+    newOutputConfig,
+
+    -- ** PageClassification
+    PageClassification (PageClassification'),
+    newPageClassification,
+
+    -- ** Point
+    Point (Point'),
+    newPoint,
+
+    -- ** Prediction
+    Prediction (Prediction'),
+    newPrediction,
+
+    -- ** QueriesConfig
+    QueriesConfig (QueriesConfig'),
+    newQueriesConfig,
+
+    -- ** Query
+    Query (Query'),
+    newQuery,
+
+    -- ** Relationship
+    Relationship (Relationship'),
+    newRelationship,
+
+    -- ** S3Object
+    S3Object (S3Object'),
+    newS3Object,
+
+    -- ** SignatureDetection
+    SignatureDetection (SignatureDetection'),
+    newSignatureDetection,
+
+    -- ** SplitDocument
+    SplitDocument (SplitDocument'),
+    newSplitDocument,
+
+    -- ** UndetectedSignature
+    UndetectedSignature (UndetectedSignature'),
+    newUndetectedSignature,
+
+    -- ** Warning
+    Warning (Warning'),
+    newWarning,
+  )
+where
+
+import Amazonka.Textract.AnalyzeDocument
+import Amazonka.Textract.AnalyzeExpense
+import Amazonka.Textract.AnalyzeID
+import Amazonka.Textract.DetectDocumentText
+import Amazonka.Textract.GetDocumentAnalysis
+import Amazonka.Textract.GetDocumentTextDetection
+import Amazonka.Textract.GetExpenseAnalysis
+import Amazonka.Textract.GetLendingAnalysis
+import Amazonka.Textract.GetLendingAnalysisSummary
+import Amazonka.Textract.Lens
+import Amazonka.Textract.StartDocumentAnalysis
+import Amazonka.Textract.StartDocumentTextDetection
+import Amazonka.Textract.StartExpenseAnalysis
+import Amazonka.Textract.StartLendingAnalysis
+import Amazonka.Textract.Types
+import Amazonka.Textract.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 'Textract'.
+
+-- $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/Textract/AnalyzeDocument.hs b/gen/Amazonka/Textract/AnalyzeDocument.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/AnalyzeDocument.hs
@@ -0,0 +1,340 @@
+{-# 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.Textract.AnalyzeDocument
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Analyzes an input document for relationships between detected items.
+--
+-- The types of information returned are as follows:
+--
+-- -   Form data (key-value pairs). The related information is returned in
+--     two Block objects, each of type @KEY_VALUE_SET@: a KEY @Block@
+--     object and a VALUE @Block@ object. For example, /Name: Ana Silva
+--     Carolina/ contains a key and value. /Name:/ is the key. /Ana Silva
+--     Carolina/ is the value.
+--
+-- -   Table and table cell data. A TABLE @Block@ object contains
+--     information about a detected table. A CELL @Block@ object is
+--     returned for each cell in a table.
+--
+-- -   Lines and words of text. A LINE @Block@ object contains one or more
+--     WORD @Block@ objects. All lines and words that are detected in the
+--     document are returned (including text that doesn\'t have a
+--     relationship with the value of @FeatureTypes@).
+--
+-- -   Signatures. A SIGNATURE @Block@ object contains the location
+--     information of a signature in a document. If used in conjunction
+--     with forms or tables, a signature can be given a Key-Value pairing
+--     or be detected in the cell of a table.
+--
+-- -   Query. A QUERY Block object contains the query text, alias and link
+--     to the associated Query results block object.
+--
+-- -   Query Result. A QUERY_RESULT Block object contains the answer to the
+--     query and an ID that connects it to the query asked. This Block also
+--     contains a confidence score.
+--
+-- Selection elements such as check boxes and option buttons (radio
+-- buttons) can be detected in form data and in tables. A SELECTION_ELEMENT
+-- @Block@ object contains information about a selection element, including
+-- the selection status.
+--
+-- You can choose which type of analysis to perform by specifying the
+-- @FeatureTypes@ list.
+--
+-- The output is returned in a list of @Block@ objects.
+--
+-- @AnalyzeDocument@ is a synchronous operation. To analyze documents
+-- asynchronously, use StartDocumentAnalysis.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/textract/latest/dg/how-it-works-analyzing.html Document Text Analysis>.
+module Amazonka.Textract.AnalyzeDocument
+  ( -- * Creating a Request
+    AnalyzeDocument (..),
+    newAnalyzeDocument,
+
+    -- * Request Lenses
+    analyzeDocument_humanLoopConfig,
+    analyzeDocument_queriesConfig,
+    analyzeDocument_document,
+    analyzeDocument_featureTypes,
+
+    -- * Destructuring the Response
+    AnalyzeDocumentResponse (..),
+    newAnalyzeDocumentResponse,
+
+    -- * Response Lenses
+    analyzeDocumentResponse_analyzeDocumentModelVersion,
+    analyzeDocumentResponse_blocks,
+    analyzeDocumentResponse_documentMetadata,
+    analyzeDocumentResponse_humanLoopActivationOutput,
+    analyzeDocumentResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Textract.Types
+
+-- | /See:/ 'newAnalyzeDocument' smart constructor.
+data AnalyzeDocument = AnalyzeDocument'
+  { -- | Sets the configuration for the human in the loop workflow for analyzing
+    -- documents.
+    humanLoopConfig :: Prelude.Maybe HumanLoopConfig,
+    -- | Contains Queries and the alias for those Queries, as determined by the
+    -- input.
+    queriesConfig :: Prelude.Maybe QueriesConfig,
+    -- | The input document as base64-encoded bytes or an Amazon S3 object. If
+    -- you use the AWS CLI to call Amazon Textract operations, you can\'t pass
+    -- image bytes. The document must be an image in JPEG, PNG, PDF, or TIFF
+    -- format.
+    --
+    -- If you\'re using an AWS SDK to call Amazon Textract, you might not need
+    -- to base64-encode image bytes that are passed using the @Bytes@ field.
+    document :: Document,
+    -- | A list of the types of analysis to perform. Add TABLES to the list to
+    -- return information about the tables that are detected in the input
+    -- document. Add FORMS to return detected form data. Add SIGNATURES to
+    -- return the locations of detected signatures. To perform both forms and
+    -- table analysis, add TABLES and FORMS to @FeatureTypes@. To detect
+    -- signatures within form data and table data, add SIGNATURES to either
+    -- TABLES or FORMS. All lines and words detected in the document are
+    -- included in the response (including text that isn\'t related to the
+    -- value of @FeatureTypes@).
+    featureTypes :: [FeatureType]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AnalyzeDocument' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'humanLoopConfig', 'analyzeDocument_humanLoopConfig' - Sets the configuration for the human in the loop workflow for analyzing
+-- documents.
+--
+-- 'queriesConfig', 'analyzeDocument_queriesConfig' - Contains Queries and the alias for those Queries, as determined by the
+-- input.
+--
+-- 'document', 'analyzeDocument_document' - The input document as base64-encoded bytes or an Amazon S3 object. If
+-- you use the AWS CLI to call Amazon Textract operations, you can\'t pass
+-- image bytes. The document must be an image in JPEG, PNG, PDF, or TIFF
+-- format.
+--
+-- If you\'re using an AWS SDK to call Amazon Textract, you might not need
+-- to base64-encode image bytes that are passed using the @Bytes@ field.
+--
+-- 'featureTypes', 'analyzeDocument_featureTypes' - A list of the types of analysis to perform. Add TABLES to the list to
+-- return information about the tables that are detected in the input
+-- document. Add FORMS to return detected form data. Add SIGNATURES to
+-- return the locations of detected signatures. To perform both forms and
+-- table analysis, add TABLES and FORMS to @FeatureTypes@. To detect
+-- signatures within form data and table data, add SIGNATURES to either
+-- TABLES or FORMS. All lines and words detected in the document are
+-- included in the response (including text that isn\'t related to the
+-- value of @FeatureTypes@).
+newAnalyzeDocument ::
+  -- | 'document'
+  Document ->
+  AnalyzeDocument
+newAnalyzeDocument pDocument_ =
+  AnalyzeDocument'
+    { humanLoopConfig = Prelude.Nothing,
+      queriesConfig = Prelude.Nothing,
+      document = pDocument_,
+      featureTypes = Prelude.mempty
+    }
+
+-- | Sets the configuration for the human in the loop workflow for analyzing
+-- documents.
+analyzeDocument_humanLoopConfig :: Lens.Lens' AnalyzeDocument (Prelude.Maybe HumanLoopConfig)
+analyzeDocument_humanLoopConfig = Lens.lens (\AnalyzeDocument' {humanLoopConfig} -> humanLoopConfig) (\s@AnalyzeDocument' {} a -> s {humanLoopConfig = a} :: AnalyzeDocument)
+
+-- | Contains Queries and the alias for those Queries, as determined by the
+-- input.
+analyzeDocument_queriesConfig :: Lens.Lens' AnalyzeDocument (Prelude.Maybe QueriesConfig)
+analyzeDocument_queriesConfig = Lens.lens (\AnalyzeDocument' {queriesConfig} -> queriesConfig) (\s@AnalyzeDocument' {} a -> s {queriesConfig = a} :: AnalyzeDocument)
+
+-- | The input document as base64-encoded bytes or an Amazon S3 object. If
+-- you use the AWS CLI to call Amazon Textract operations, you can\'t pass
+-- image bytes. The document must be an image in JPEG, PNG, PDF, or TIFF
+-- format.
+--
+-- If you\'re using an AWS SDK to call Amazon Textract, you might not need
+-- to base64-encode image bytes that are passed using the @Bytes@ field.
+analyzeDocument_document :: Lens.Lens' AnalyzeDocument Document
+analyzeDocument_document = Lens.lens (\AnalyzeDocument' {document} -> document) (\s@AnalyzeDocument' {} a -> s {document = a} :: AnalyzeDocument)
+
+-- | A list of the types of analysis to perform. Add TABLES to the list to
+-- return information about the tables that are detected in the input
+-- document. Add FORMS to return detected form data. Add SIGNATURES to
+-- return the locations of detected signatures. To perform both forms and
+-- table analysis, add TABLES and FORMS to @FeatureTypes@. To detect
+-- signatures within form data and table data, add SIGNATURES to either
+-- TABLES or FORMS. All lines and words detected in the document are
+-- included in the response (including text that isn\'t related to the
+-- value of @FeatureTypes@).
+analyzeDocument_featureTypes :: Lens.Lens' AnalyzeDocument [FeatureType]
+analyzeDocument_featureTypes = Lens.lens (\AnalyzeDocument' {featureTypes} -> featureTypes) (\s@AnalyzeDocument' {} a -> s {featureTypes = a} :: AnalyzeDocument) Prelude.. Lens.coerced
+
+instance Core.AWSRequest AnalyzeDocument where
+  type
+    AWSResponse AnalyzeDocument =
+      AnalyzeDocumentResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          AnalyzeDocumentResponse'
+            Prelude.<$> (x Data..?> "AnalyzeDocumentModelVersion")
+            Prelude.<*> (x Data..?> "Blocks" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "DocumentMetadata")
+            Prelude.<*> (x Data..?> "HumanLoopActivationOutput")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable AnalyzeDocument where
+  hashWithSalt _salt AnalyzeDocument' {..} =
+    _salt
+      `Prelude.hashWithSalt` humanLoopConfig
+      `Prelude.hashWithSalt` queriesConfig
+      `Prelude.hashWithSalt` document
+      `Prelude.hashWithSalt` featureTypes
+
+instance Prelude.NFData AnalyzeDocument where
+  rnf AnalyzeDocument' {..} =
+    Prelude.rnf humanLoopConfig
+      `Prelude.seq` Prelude.rnf queriesConfig
+      `Prelude.seq` Prelude.rnf document
+      `Prelude.seq` Prelude.rnf featureTypes
+
+instance Data.ToHeaders AnalyzeDocument where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("Textract.AnalyzeDocument" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON AnalyzeDocument where
+  toJSON AnalyzeDocument' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("HumanLoopConfig" Data..=)
+              Prelude.<$> humanLoopConfig,
+            ("QueriesConfig" Data..=) Prelude.<$> queriesConfig,
+            Prelude.Just ("Document" Data..= document),
+            Prelude.Just ("FeatureTypes" Data..= featureTypes)
+          ]
+      )
+
+instance Data.ToPath AnalyzeDocument where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery AnalyzeDocument where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newAnalyzeDocumentResponse' smart constructor.
+data AnalyzeDocumentResponse = AnalyzeDocumentResponse'
+  { -- | The version of the model used to analyze the document.
+    analyzeDocumentModelVersion :: Prelude.Maybe Prelude.Text,
+    -- | The items that are detected and analyzed by @AnalyzeDocument@.
+    blocks :: Prelude.Maybe [Block],
+    -- | Metadata about the analyzed document. An example is the number of pages.
+    documentMetadata :: Prelude.Maybe DocumentMetadata,
+    -- | Shows the results of the human in the loop evaluation.
+    humanLoopActivationOutput :: Prelude.Maybe HumanLoopActivationOutput,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AnalyzeDocumentResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'analyzeDocumentModelVersion', 'analyzeDocumentResponse_analyzeDocumentModelVersion' - The version of the model used to analyze the document.
+--
+-- 'blocks', 'analyzeDocumentResponse_blocks' - The items that are detected and analyzed by @AnalyzeDocument@.
+--
+-- 'documentMetadata', 'analyzeDocumentResponse_documentMetadata' - Metadata about the analyzed document. An example is the number of pages.
+--
+-- 'humanLoopActivationOutput', 'analyzeDocumentResponse_humanLoopActivationOutput' - Shows the results of the human in the loop evaluation.
+--
+-- 'httpStatus', 'analyzeDocumentResponse_httpStatus' - The response's http status code.
+newAnalyzeDocumentResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  AnalyzeDocumentResponse
+newAnalyzeDocumentResponse pHttpStatus_ =
+  AnalyzeDocumentResponse'
+    { analyzeDocumentModelVersion =
+        Prelude.Nothing,
+      blocks = Prelude.Nothing,
+      documentMetadata = Prelude.Nothing,
+      humanLoopActivationOutput = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The version of the model used to analyze the document.
+analyzeDocumentResponse_analyzeDocumentModelVersion :: Lens.Lens' AnalyzeDocumentResponse (Prelude.Maybe Prelude.Text)
+analyzeDocumentResponse_analyzeDocumentModelVersion = Lens.lens (\AnalyzeDocumentResponse' {analyzeDocumentModelVersion} -> analyzeDocumentModelVersion) (\s@AnalyzeDocumentResponse' {} a -> s {analyzeDocumentModelVersion = a} :: AnalyzeDocumentResponse)
+
+-- | The items that are detected and analyzed by @AnalyzeDocument@.
+analyzeDocumentResponse_blocks :: Lens.Lens' AnalyzeDocumentResponse (Prelude.Maybe [Block])
+analyzeDocumentResponse_blocks = Lens.lens (\AnalyzeDocumentResponse' {blocks} -> blocks) (\s@AnalyzeDocumentResponse' {} a -> s {blocks = a} :: AnalyzeDocumentResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | Metadata about the analyzed document. An example is the number of pages.
+analyzeDocumentResponse_documentMetadata :: Lens.Lens' AnalyzeDocumentResponse (Prelude.Maybe DocumentMetadata)
+analyzeDocumentResponse_documentMetadata = Lens.lens (\AnalyzeDocumentResponse' {documentMetadata} -> documentMetadata) (\s@AnalyzeDocumentResponse' {} a -> s {documentMetadata = a} :: AnalyzeDocumentResponse)
+
+-- | Shows the results of the human in the loop evaluation.
+analyzeDocumentResponse_humanLoopActivationOutput :: Lens.Lens' AnalyzeDocumentResponse (Prelude.Maybe HumanLoopActivationOutput)
+analyzeDocumentResponse_humanLoopActivationOutput = Lens.lens (\AnalyzeDocumentResponse' {humanLoopActivationOutput} -> humanLoopActivationOutput) (\s@AnalyzeDocumentResponse' {} a -> s {humanLoopActivationOutput = a} :: AnalyzeDocumentResponse)
+
+-- | The response's http status code.
+analyzeDocumentResponse_httpStatus :: Lens.Lens' AnalyzeDocumentResponse Prelude.Int
+analyzeDocumentResponse_httpStatus = Lens.lens (\AnalyzeDocumentResponse' {httpStatus} -> httpStatus) (\s@AnalyzeDocumentResponse' {} a -> s {httpStatus = a} :: AnalyzeDocumentResponse)
+
+instance Prelude.NFData AnalyzeDocumentResponse where
+  rnf AnalyzeDocumentResponse' {..} =
+    Prelude.rnf analyzeDocumentModelVersion
+      `Prelude.seq` Prelude.rnf blocks
+      `Prelude.seq` Prelude.rnf documentMetadata
+      `Prelude.seq` Prelude.rnf humanLoopActivationOutput
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Textract/AnalyzeExpense.hs b/gen/Amazonka/Textract/AnalyzeExpense.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/AnalyzeExpense.hs
@@ -0,0 +1,189 @@
+{-# 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.Textract.AnalyzeExpense
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- @AnalyzeExpense@ synchronously analyzes an input document for
+-- financially related relationships between text.
+--
+-- Information is returned as @ExpenseDocuments@ and seperated as follows:
+--
+-- -   @LineItemGroups@- A data set containing @LineItems@ which store
+--     information about the lines of text, such as an item purchased and
+--     its price on a receipt.
+--
+-- -   @SummaryFields@- Contains all other information a receipt, such as
+--     header information or the vendors name.
+module Amazonka.Textract.AnalyzeExpense
+  ( -- * Creating a Request
+    AnalyzeExpense (..),
+    newAnalyzeExpense,
+
+    -- * Request Lenses
+    analyzeExpense_document,
+
+    -- * Destructuring the Response
+    AnalyzeExpenseResponse (..),
+    newAnalyzeExpenseResponse,
+
+    -- * Response Lenses
+    analyzeExpenseResponse_documentMetadata,
+    analyzeExpenseResponse_expenseDocuments,
+    analyzeExpenseResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Textract.Types
+
+-- | /See:/ 'newAnalyzeExpense' smart constructor.
+data AnalyzeExpense = AnalyzeExpense'
+  { document :: Document
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AnalyzeExpense' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'document', 'analyzeExpense_document' - Undocumented member.
+newAnalyzeExpense ::
+  -- | 'document'
+  Document ->
+  AnalyzeExpense
+newAnalyzeExpense pDocument_ =
+  AnalyzeExpense' {document = pDocument_}
+
+-- | Undocumented member.
+analyzeExpense_document :: Lens.Lens' AnalyzeExpense Document
+analyzeExpense_document = Lens.lens (\AnalyzeExpense' {document} -> document) (\s@AnalyzeExpense' {} a -> s {document = a} :: AnalyzeExpense)
+
+instance Core.AWSRequest AnalyzeExpense where
+  type
+    AWSResponse AnalyzeExpense =
+      AnalyzeExpenseResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          AnalyzeExpenseResponse'
+            Prelude.<$> (x Data..?> "DocumentMetadata")
+            Prelude.<*> ( x
+                            Data..?> "ExpenseDocuments"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable AnalyzeExpense where
+  hashWithSalt _salt AnalyzeExpense' {..} =
+    _salt `Prelude.hashWithSalt` document
+
+instance Prelude.NFData AnalyzeExpense where
+  rnf AnalyzeExpense' {..} = Prelude.rnf document
+
+instance Data.ToHeaders AnalyzeExpense where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("Textract.AnalyzeExpense" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON AnalyzeExpense where
+  toJSON AnalyzeExpense' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("Document" Data..= document)]
+      )
+
+instance Data.ToPath AnalyzeExpense where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery AnalyzeExpense where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newAnalyzeExpenseResponse' smart constructor.
+data AnalyzeExpenseResponse = AnalyzeExpenseResponse'
+  { documentMetadata :: Prelude.Maybe DocumentMetadata,
+    -- | The expenses detected by Amazon Textract.
+    expenseDocuments :: Prelude.Maybe [ExpenseDocument],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AnalyzeExpenseResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'documentMetadata', 'analyzeExpenseResponse_documentMetadata' - Undocumented member.
+--
+-- 'expenseDocuments', 'analyzeExpenseResponse_expenseDocuments' - The expenses detected by Amazon Textract.
+--
+-- 'httpStatus', 'analyzeExpenseResponse_httpStatus' - The response's http status code.
+newAnalyzeExpenseResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  AnalyzeExpenseResponse
+newAnalyzeExpenseResponse pHttpStatus_ =
+  AnalyzeExpenseResponse'
+    { documentMetadata =
+        Prelude.Nothing,
+      expenseDocuments = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Undocumented member.
+analyzeExpenseResponse_documentMetadata :: Lens.Lens' AnalyzeExpenseResponse (Prelude.Maybe DocumentMetadata)
+analyzeExpenseResponse_documentMetadata = Lens.lens (\AnalyzeExpenseResponse' {documentMetadata} -> documentMetadata) (\s@AnalyzeExpenseResponse' {} a -> s {documentMetadata = a} :: AnalyzeExpenseResponse)
+
+-- | The expenses detected by Amazon Textract.
+analyzeExpenseResponse_expenseDocuments :: Lens.Lens' AnalyzeExpenseResponse (Prelude.Maybe [ExpenseDocument])
+analyzeExpenseResponse_expenseDocuments = Lens.lens (\AnalyzeExpenseResponse' {expenseDocuments} -> expenseDocuments) (\s@AnalyzeExpenseResponse' {} a -> s {expenseDocuments = a} :: AnalyzeExpenseResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+analyzeExpenseResponse_httpStatus :: Lens.Lens' AnalyzeExpenseResponse Prelude.Int
+analyzeExpenseResponse_httpStatus = Lens.lens (\AnalyzeExpenseResponse' {httpStatus} -> httpStatus) (\s@AnalyzeExpenseResponse' {} a -> s {httpStatus = a} :: AnalyzeExpenseResponse)
+
+instance Prelude.NFData AnalyzeExpenseResponse where
+  rnf AnalyzeExpenseResponse' {..} =
+    Prelude.rnf documentMetadata
+      `Prelude.seq` Prelude.rnf expenseDocuments
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Textract/AnalyzeID.hs b/gen/Amazonka/Textract/AnalyzeID.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/AnalyzeID.hs
@@ -0,0 +1,202 @@
+{-# 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.Textract.AnalyzeID
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Analyzes identity documents for relevant information. This information
+-- is extracted and returned as @IdentityDocumentFields@, which records
+-- both the normalized field and value of the extracted text.Unlike other
+-- Amazon Textract operations, @AnalyzeID@ doesn\'t return any Geometry
+-- data.
+module Amazonka.Textract.AnalyzeID
+  ( -- * Creating a Request
+    AnalyzeID (..),
+    newAnalyzeID,
+
+    -- * Request Lenses
+    analyzeID_documentPages,
+
+    -- * Destructuring the Response
+    AnalyzeIDResponse (..),
+    newAnalyzeIDResponse,
+
+    -- * Response Lenses
+    analyzeIDResponse_analyzeIDModelVersion,
+    analyzeIDResponse_documentMetadata,
+    analyzeIDResponse_identityDocuments,
+    analyzeIDResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Textract.Types
+
+-- | /See:/ 'newAnalyzeID' smart constructor.
+data AnalyzeID = AnalyzeID'
+  { -- | The document being passed to AnalyzeID.
+    documentPages :: Prelude.NonEmpty Document
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AnalyzeID' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'documentPages', 'analyzeID_documentPages' - The document being passed to AnalyzeID.
+newAnalyzeID ::
+  -- | 'documentPages'
+  Prelude.NonEmpty Document ->
+  AnalyzeID
+newAnalyzeID pDocumentPages_ =
+  AnalyzeID'
+    { documentPages =
+        Lens.coerced Lens.# pDocumentPages_
+    }
+
+-- | The document being passed to AnalyzeID.
+analyzeID_documentPages :: Lens.Lens' AnalyzeID (Prelude.NonEmpty Document)
+analyzeID_documentPages = Lens.lens (\AnalyzeID' {documentPages} -> documentPages) (\s@AnalyzeID' {} a -> s {documentPages = a} :: AnalyzeID) Prelude.. Lens.coerced
+
+instance Core.AWSRequest AnalyzeID where
+  type AWSResponse AnalyzeID = AnalyzeIDResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          AnalyzeIDResponse'
+            Prelude.<$> (x Data..?> "AnalyzeIDModelVersion")
+            Prelude.<*> (x Data..?> "DocumentMetadata")
+            Prelude.<*> ( x
+                            Data..?> "IdentityDocuments"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable AnalyzeID where
+  hashWithSalt _salt AnalyzeID' {..} =
+    _salt `Prelude.hashWithSalt` documentPages
+
+instance Prelude.NFData AnalyzeID where
+  rnf AnalyzeID' {..} = Prelude.rnf documentPages
+
+instance Data.ToHeaders AnalyzeID where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("Textract.AnalyzeID" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON AnalyzeID where
+  toJSON AnalyzeID' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("DocumentPages" Data..= documentPages)
+          ]
+      )
+
+instance Data.ToPath AnalyzeID where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery AnalyzeID where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newAnalyzeIDResponse' smart constructor.
+data AnalyzeIDResponse = AnalyzeIDResponse'
+  { -- | The version of the AnalyzeIdentity API being used to process documents.
+    analyzeIDModelVersion :: Prelude.Maybe Prelude.Text,
+    documentMetadata :: Prelude.Maybe DocumentMetadata,
+    -- | The list of documents processed by AnalyzeID. Includes a number denoting
+    -- their place in the list and the response structure for the document.
+    identityDocuments :: Prelude.Maybe [IdentityDocument],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AnalyzeIDResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'analyzeIDModelVersion', 'analyzeIDResponse_analyzeIDModelVersion' - The version of the AnalyzeIdentity API being used to process documents.
+--
+-- 'documentMetadata', 'analyzeIDResponse_documentMetadata' - Undocumented member.
+--
+-- 'identityDocuments', 'analyzeIDResponse_identityDocuments' - The list of documents processed by AnalyzeID. Includes a number denoting
+-- their place in the list and the response structure for the document.
+--
+-- 'httpStatus', 'analyzeIDResponse_httpStatus' - The response's http status code.
+newAnalyzeIDResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  AnalyzeIDResponse
+newAnalyzeIDResponse pHttpStatus_ =
+  AnalyzeIDResponse'
+    { analyzeIDModelVersion =
+        Prelude.Nothing,
+      documentMetadata = Prelude.Nothing,
+      identityDocuments = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The version of the AnalyzeIdentity API being used to process documents.
+analyzeIDResponse_analyzeIDModelVersion :: Lens.Lens' AnalyzeIDResponse (Prelude.Maybe Prelude.Text)
+analyzeIDResponse_analyzeIDModelVersion = Lens.lens (\AnalyzeIDResponse' {analyzeIDModelVersion} -> analyzeIDModelVersion) (\s@AnalyzeIDResponse' {} a -> s {analyzeIDModelVersion = a} :: AnalyzeIDResponse)
+
+-- | Undocumented member.
+analyzeIDResponse_documentMetadata :: Lens.Lens' AnalyzeIDResponse (Prelude.Maybe DocumentMetadata)
+analyzeIDResponse_documentMetadata = Lens.lens (\AnalyzeIDResponse' {documentMetadata} -> documentMetadata) (\s@AnalyzeIDResponse' {} a -> s {documentMetadata = a} :: AnalyzeIDResponse)
+
+-- | The list of documents processed by AnalyzeID. Includes a number denoting
+-- their place in the list and the response structure for the document.
+analyzeIDResponse_identityDocuments :: Lens.Lens' AnalyzeIDResponse (Prelude.Maybe [IdentityDocument])
+analyzeIDResponse_identityDocuments = Lens.lens (\AnalyzeIDResponse' {identityDocuments} -> identityDocuments) (\s@AnalyzeIDResponse' {} a -> s {identityDocuments = a} :: AnalyzeIDResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+analyzeIDResponse_httpStatus :: Lens.Lens' AnalyzeIDResponse Prelude.Int
+analyzeIDResponse_httpStatus = Lens.lens (\AnalyzeIDResponse' {httpStatus} -> httpStatus) (\s@AnalyzeIDResponse' {} a -> s {httpStatus = a} :: AnalyzeIDResponse)
+
+instance Prelude.NFData AnalyzeIDResponse where
+  rnf AnalyzeIDResponse' {..} =
+    Prelude.rnf analyzeIDModelVersion
+      `Prelude.seq` Prelude.rnf documentMetadata
+      `Prelude.seq` Prelude.rnf identityDocuments
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Textract/DetectDocumentText.hs b/gen/Amazonka/Textract/DetectDocumentText.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/DetectDocumentText.hs
@@ -0,0 +1,228 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Textract.DetectDocumentText
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Detects text in the input document. Amazon Textract can detect lines of
+-- text and the words that make up a line of text. The input document must
+-- be in one of the following image formats: JPEG, PNG, PDF, or TIFF.
+-- @DetectDocumentText@ returns the detected text in an array of Block
+-- objects.
+--
+-- Each document page has as an associated @Block@ of type PAGE. Each PAGE
+-- @Block@ object is the parent of LINE @Block@ objects that represent the
+-- lines of detected text on a page. A LINE @Block@ object is a parent for
+-- each word that makes up the line. Words are represented by @Block@
+-- objects of type WORD.
+--
+-- @DetectDocumentText@ is a synchronous operation. To analyze documents
+-- asynchronously, use StartDocumentTextDetection.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/textract/latest/dg/how-it-works-detecting.html Document Text Detection>.
+module Amazonka.Textract.DetectDocumentText
+  ( -- * Creating a Request
+    DetectDocumentText (..),
+    newDetectDocumentText,
+
+    -- * Request Lenses
+    detectDocumentText_document,
+
+    -- * Destructuring the Response
+    DetectDocumentTextResponse (..),
+    newDetectDocumentTextResponse,
+
+    -- * Response Lenses
+    detectDocumentTextResponse_blocks,
+    detectDocumentTextResponse_detectDocumentTextModelVersion,
+    detectDocumentTextResponse_documentMetadata,
+    detectDocumentTextResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Textract.Types
+
+-- | /See:/ 'newDetectDocumentText' smart constructor.
+data DetectDocumentText = DetectDocumentText'
+  { -- | The input document as base64-encoded bytes or an Amazon S3 object. If
+    -- you use the AWS CLI to call Amazon Textract operations, you can\'t pass
+    -- image bytes. The document must be an image in JPEG or PNG format.
+    --
+    -- If you\'re using an AWS SDK to call Amazon Textract, you might not need
+    -- to base64-encode image bytes that are passed using the @Bytes@ field.
+    document :: Document
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DetectDocumentText' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'document', 'detectDocumentText_document' - The input document as base64-encoded bytes or an Amazon S3 object. If
+-- you use the AWS CLI to call Amazon Textract operations, you can\'t pass
+-- image bytes. The document must be an image in JPEG or PNG format.
+--
+-- If you\'re using an AWS SDK to call Amazon Textract, you might not need
+-- to base64-encode image bytes that are passed using the @Bytes@ field.
+newDetectDocumentText ::
+  -- | 'document'
+  Document ->
+  DetectDocumentText
+newDetectDocumentText pDocument_ =
+  DetectDocumentText' {document = pDocument_}
+
+-- | The input document as base64-encoded bytes or an Amazon S3 object. If
+-- you use the AWS CLI to call Amazon Textract operations, you can\'t pass
+-- image bytes. The document must be an image in JPEG or PNG format.
+--
+-- If you\'re using an AWS SDK to call Amazon Textract, you might not need
+-- to base64-encode image bytes that are passed using the @Bytes@ field.
+detectDocumentText_document :: Lens.Lens' DetectDocumentText Document
+detectDocumentText_document = Lens.lens (\DetectDocumentText' {document} -> document) (\s@DetectDocumentText' {} a -> s {document = a} :: DetectDocumentText)
+
+instance Core.AWSRequest DetectDocumentText where
+  type
+    AWSResponse DetectDocumentText =
+      DetectDocumentTextResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DetectDocumentTextResponse'
+            Prelude.<$> (x Data..?> "Blocks" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "DetectDocumentTextModelVersion")
+            Prelude.<*> (x Data..?> "DocumentMetadata")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DetectDocumentText where
+  hashWithSalt _salt DetectDocumentText' {..} =
+    _salt `Prelude.hashWithSalt` document
+
+instance Prelude.NFData DetectDocumentText where
+  rnf DetectDocumentText' {..} = Prelude.rnf document
+
+instance Data.ToHeaders DetectDocumentText where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Textract.DetectDocumentText" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DetectDocumentText where
+  toJSON DetectDocumentText' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("Document" Data..= document)]
+      )
+
+instance Data.ToPath DetectDocumentText where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DetectDocumentText where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDetectDocumentTextResponse' smart constructor.
+data DetectDocumentTextResponse = DetectDocumentTextResponse'
+  { -- | An array of @Block@ objects that contain the text that\'s detected in
+    -- the document.
+    blocks :: Prelude.Maybe [Block],
+    detectDocumentTextModelVersion :: Prelude.Maybe Prelude.Text,
+    -- | Metadata about the document. It contains the number of pages that are
+    -- detected in the document.
+    documentMetadata :: Prelude.Maybe DocumentMetadata,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DetectDocumentTextResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'blocks', 'detectDocumentTextResponse_blocks' - An array of @Block@ objects that contain the text that\'s detected in
+-- the document.
+--
+-- 'detectDocumentTextModelVersion', 'detectDocumentTextResponse_detectDocumentTextModelVersion' -
+--
+-- 'documentMetadata', 'detectDocumentTextResponse_documentMetadata' - Metadata about the document. It contains the number of pages that are
+-- detected in the document.
+--
+-- 'httpStatus', 'detectDocumentTextResponse_httpStatus' - The response's http status code.
+newDetectDocumentTextResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DetectDocumentTextResponse
+newDetectDocumentTextResponse pHttpStatus_ =
+  DetectDocumentTextResponse'
+    { blocks =
+        Prelude.Nothing,
+      detectDocumentTextModelVersion =
+        Prelude.Nothing,
+      documentMetadata = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | An array of @Block@ objects that contain the text that\'s detected in
+-- the document.
+detectDocumentTextResponse_blocks :: Lens.Lens' DetectDocumentTextResponse (Prelude.Maybe [Block])
+detectDocumentTextResponse_blocks = Lens.lens (\DetectDocumentTextResponse' {blocks} -> blocks) (\s@DetectDocumentTextResponse' {} a -> s {blocks = a} :: DetectDocumentTextResponse) Prelude.. Lens.mapping Lens.coerced
+
+detectDocumentTextResponse_detectDocumentTextModelVersion :: Lens.Lens' DetectDocumentTextResponse (Prelude.Maybe Prelude.Text)
+detectDocumentTextResponse_detectDocumentTextModelVersion = Lens.lens (\DetectDocumentTextResponse' {detectDocumentTextModelVersion} -> detectDocumentTextModelVersion) (\s@DetectDocumentTextResponse' {} a -> s {detectDocumentTextModelVersion = a} :: DetectDocumentTextResponse)
+
+-- | Metadata about the document. It contains the number of pages that are
+-- detected in the document.
+detectDocumentTextResponse_documentMetadata :: Lens.Lens' DetectDocumentTextResponse (Prelude.Maybe DocumentMetadata)
+detectDocumentTextResponse_documentMetadata = Lens.lens (\DetectDocumentTextResponse' {documentMetadata} -> documentMetadata) (\s@DetectDocumentTextResponse' {} a -> s {documentMetadata = a} :: DetectDocumentTextResponse)
+
+-- | The response's http status code.
+detectDocumentTextResponse_httpStatus :: Lens.Lens' DetectDocumentTextResponse Prelude.Int
+detectDocumentTextResponse_httpStatus = Lens.lens (\DetectDocumentTextResponse' {httpStatus} -> httpStatus) (\s@DetectDocumentTextResponse' {} a -> s {httpStatus = a} :: DetectDocumentTextResponse)
+
+instance Prelude.NFData DetectDocumentTextResponse where
+  rnf DetectDocumentTextResponse' {..} =
+    Prelude.rnf blocks
+      `Prelude.seq` Prelude.rnf detectDocumentTextModelVersion
+      `Prelude.seq` Prelude.rnf documentMetadata
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Textract/GetDocumentAnalysis.hs b/gen/Amazonka/Textract/GetDocumentAnalysis.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/GetDocumentAnalysis.hs
@@ -0,0 +1,363 @@
+{-# 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.Textract.GetDocumentAnalysis
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets the results for an Amazon Textract asynchronous operation that
+-- analyzes text in a document.
+--
+-- You start asynchronous text analysis by calling StartDocumentAnalysis,
+-- which returns a job identifier (@JobId@). When the text analysis
+-- operation finishes, Amazon Textract publishes a completion status to the
+-- Amazon Simple Notification Service (Amazon SNS) topic that\'s registered
+-- in the initial call to @StartDocumentAnalysis@. To get the results of
+-- the text-detection operation, first check that the status value
+-- published to the Amazon SNS topic is @SUCCEEDED@. If so, call
+-- @GetDocumentAnalysis@, and pass the job identifier (@JobId@) from the
+-- initial call to @StartDocumentAnalysis@.
+--
+-- @GetDocumentAnalysis@ returns an array of Block objects. The following
+-- types of information are returned:
+--
+-- -   Form data (key-value pairs). The related information is returned in
+--     two Block objects, each of type @KEY_VALUE_SET@: a KEY @Block@
+--     object and a VALUE @Block@ object. For example, /Name: Ana Silva
+--     Carolina/ contains a key and value. /Name:/ is the key. /Ana Silva
+--     Carolina/ is the value.
+--
+-- -   Table and table cell data. A TABLE @Block@ object contains
+--     information about a detected table. A CELL @Block@ object is
+--     returned for each cell in a table.
+--
+-- -   Lines and words of text. A LINE @Block@ object contains one or more
+--     WORD @Block@ objects. All lines and words that are detected in the
+--     document are returned (including text that doesn\'t have a
+--     relationship with the value of the @StartDocumentAnalysis@
+--     @FeatureTypes@ input parameter).
+--
+-- -   Query. A QUERY Block object contains the query text, alias and link
+--     to the associated Query results block object.
+--
+-- -   Query Results. A QUERY_RESULT Block object contains the answer to
+--     the query and an ID that connects it to the query asked. This Block
+--     also contains a confidence score.
+--
+-- While processing a document with queries, look out for
+-- @INVALID_REQUEST_PARAMETERS@ output. This indicates that either the per
+-- page query limit has been exceeded or that the operation is trying to
+-- query a page in the document which doesn’t exist.
+--
+-- Selection elements such as check boxes and option buttons (radio
+-- buttons) can be detected in form data and in tables. A SELECTION_ELEMENT
+-- @Block@ object contains information about a selection element, including
+-- the selection status.
+--
+-- Use the @MaxResults@ parameter to limit the number of blocks that are
+-- returned. If there are more results than specified in @MaxResults@, the
+-- value of @NextToken@ in the operation response contains a pagination
+-- token for getting the next set of results. To get the next page of
+-- results, call @GetDocumentAnalysis@, and populate the @NextToken@
+-- request parameter with the token value that\'s returned from the
+-- previous call to @GetDocumentAnalysis@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/textract/latest/dg/how-it-works-analyzing.html Document Text Analysis>.
+module Amazonka.Textract.GetDocumentAnalysis
+  ( -- * Creating a Request
+    GetDocumentAnalysis (..),
+    newGetDocumentAnalysis,
+
+    -- * Request Lenses
+    getDocumentAnalysis_maxResults,
+    getDocumentAnalysis_nextToken,
+    getDocumentAnalysis_jobId,
+
+    -- * Destructuring the Response
+    GetDocumentAnalysisResponse (..),
+    newGetDocumentAnalysisResponse,
+
+    -- * Response Lenses
+    getDocumentAnalysisResponse_analyzeDocumentModelVersion,
+    getDocumentAnalysisResponse_blocks,
+    getDocumentAnalysisResponse_documentMetadata,
+    getDocumentAnalysisResponse_jobStatus,
+    getDocumentAnalysisResponse_nextToken,
+    getDocumentAnalysisResponse_statusMessage,
+    getDocumentAnalysisResponse_warnings,
+    getDocumentAnalysisResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Textract.Types
+
+-- | /See:/ 'newGetDocumentAnalysis' smart constructor.
+data GetDocumentAnalysis = GetDocumentAnalysis'
+  { -- | The maximum number of results to return per paginated call. The largest
+    -- value that you can specify is 1,000. If you specify a value greater than
+    -- 1,000, a maximum of 1,000 results is returned. The default value is
+    -- 1,000.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | If the previous response was incomplete (because there are more blocks
+    -- to retrieve), Amazon Textract returns a pagination token in the
+    -- response. You can use this pagination token to retrieve the next set of
+    -- blocks.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A unique identifier for the text-detection job. The @JobId@ is returned
+    -- from @StartDocumentAnalysis@. A @JobId@ value is only valid for 7 days.
+    jobId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetDocumentAnalysis' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'getDocumentAnalysis_maxResults' - The maximum number of results to return per paginated call. The largest
+-- value that you can specify is 1,000. If you specify a value greater than
+-- 1,000, a maximum of 1,000 results is returned. The default value is
+-- 1,000.
+--
+-- 'nextToken', 'getDocumentAnalysis_nextToken' - If the previous response was incomplete (because there are more blocks
+-- to retrieve), Amazon Textract returns a pagination token in the
+-- response. You can use this pagination token to retrieve the next set of
+-- blocks.
+--
+-- 'jobId', 'getDocumentAnalysis_jobId' - A unique identifier for the text-detection job. The @JobId@ is returned
+-- from @StartDocumentAnalysis@. A @JobId@ value is only valid for 7 days.
+newGetDocumentAnalysis ::
+  -- | 'jobId'
+  Prelude.Text ->
+  GetDocumentAnalysis
+newGetDocumentAnalysis pJobId_ =
+  GetDocumentAnalysis'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      jobId = pJobId_
+    }
+
+-- | The maximum number of results to return per paginated call. The largest
+-- value that you can specify is 1,000. If you specify a value greater than
+-- 1,000, a maximum of 1,000 results is returned. The default value is
+-- 1,000.
+getDocumentAnalysis_maxResults :: Lens.Lens' GetDocumentAnalysis (Prelude.Maybe Prelude.Natural)
+getDocumentAnalysis_maxResults = Lens.lens (\GetDocumentAnalysis' {maxResults} -> maxResults) (\s@GetDocumentAnalysis' {} a -> s {maxResults = a} :: GetDocumentAnalysis)
+
+-- | If the previous response was incomplete (because there are more blocks
+-- to retrieve), Amazon Textract returns a pagination token in the
+-- response. You can use this pagination token to retrieve the next set of
+-- blocks.
+getDocumentAnalysis_nextToken :: Lens.Lens' GetDocumentAnalysis (Prelude.Maybe Prelude.Text)
+getDocumentAnalysis_nextToken = Lens.lens (\GetDocumentAnalysis' {nextToken} -> nextToken) (\s@GetDocumentAnalysis' {} a -> s {nextToken = a} :: GetDocumentAnalysis)
+
+-- | A unique identifier for the text-detection job. The @JobId@ is returned
+-- from @StartDocumentAnalysis@. A @JobId@ value is only valid for 7 days.
+getDocumentAnalysis_jobId :: Lens.Lens' GetDocumentAnalysis Prelude.Text
+getDocumentAnalysis_jobId = Lens.lens (\GetDocumentAnalysis' {jobId} -> jobId) (\s@GetDocumentAnalysis' {} a -> s {jobId = a} :: GetDocumentAnalysis)
+
+instance Core.AWSRequest GetDocumentAnalysis where
+  type
+    AWSResponse GetDocumentAnalysis =
+      GetDocumentAnalysisResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetDocumentAnalysisResponse'
+            Prelude.<$> (x Data..?> "AnalyzeDocumentModelVersion")
+            Prelude.<*> (x Data..?> "Blocks" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "DocumentMetadata")
+            Prelude.<*> (x Data..?> "JobStatus")
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "StatusMessage")
+            Prelude.<*> (x Data..?> "Warnings" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetDocumentAnalysis where
+  hashWithSalt _salt GetDocumentAnalysis' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` jobId
+
+instance Prelude.NFData GetDocumentAnalysis where
+  rnf GetDocumentAnalysis' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf jobId
+
+instance Data.ToHeaders GetDocumentAnalysis where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Textract.GetDocumentAnalysis" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetDocumentAnalysis where
+  toJSON GetDocumentAnalysis' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("JobId" Data..= jobId)
+          ]
+      )
+
+instance Data.ToPath GetDocumentAnalysis where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetDocumentAnalysis where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetDocumentAnalysisResponse' smart constructor.
+data GetDocumentAnalysisResponse = GetDocumentAnalysisResponse'
+  { analyzeDocumentModelVersion :: Prelude.Maybe Prelude.Text,
+    -- | The results of the text-analysis operation.
+    blocks :: Prelude.Maybe [Block],
+    -- | Information about a document that Amazon Textract processed.
+    -- @DocumentMetadata@ is returned in every page of paginated responses from
+    -- an Amazon Textract video operation.
+    documentMetadata :: Prelude.Maybe DocumentMetadata,
+    -- | The current status of the text detection job.
+    jobStatus :: Prelude.Maybe JobStatus,
+    -- | If the response is truncated, Amazon Textract returns this token. You
+    -- can use this token in the subsequent request to retrieve the next set of
+    -- text detection results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Returns if the detection job could not be completed. Contains
+    -- explanation for what error occured.
+    statusMessage :: Prelude.Maybe Prelude.Text,
+    -- | A list of warnings that occurred during the document-analysis operation.
+    warnings :: Prelude.Maybe [Warning],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetDocumentAnalysisResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'analyzeDocumentModelVersion', 'getDocumentAnalysisResponse_analyzeDocumentModelVersion' -
+--
+-- 'blocks', 'getDocumentAnalysisResponse_blocks' - The results of the text-analysis operation.
+--
+-- 'documentMetadata', 'getDocumentAnalysisResponse_documentMetadata' - Information about a document that Amazon Textract processed.
+-- @DocumentMetadata@ is returned in every page of paginated responses from
+-- an Amazon Textract video operation.
+--
+-- 'jobStatus', 'getDocumentAnalysisResponse_jobStatus' - The current status of the text detection job.
+--
+-- 'nextToken', 'getDocumentAnalysisResponse_nextToken' - If the response is truncated, Amazon Textract returns this token. You
+-- can use this token in the subsequent request to retrieve the next set of
+-- text detection results.
+--
+-- 'statusMessage', 'getDocumentAnalysisResponse_statusMessage' - Returns if the detection job could not be completed. Contains
+-- explanation for what error occured.
+--
+-- 'warnings', 'getDocumentAnalysisResponse_warnings' - A list of warnings that occurred during the document-analysis operation.
+--
+-- 'httpStatus', 'getDocumentAnalysisResponse_httpStatus' - The response's http status code.
+newGetDocumentAnalysisResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetDocumentAnalysisResponse
+newGetDocumentAnalysisResponse pHttpStatus_ =
+  GetDocumentAnalysisResponse'
+    { analyzeDocumentModelVersion =
+        Prelude.Nothing,
+      blocks = Prelude.Nothing,
+      documentMetadata = Prelude.Nothing,
+      jobStatus = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      statusMessage = Prelude.Nothing,
+      warnings = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+getDocumentAnalysisResponse_analyzeDocumentModelVersion :: Lens.Lens' GetDocumentAnalysisResponse (Prelude.Maybe Prelude.Text)
+getDocumentAnalysisResponse_analyzeDocumentModelVersion = Lens.lens (\GetDocumentAnalysisResponse' {analyzeDocumentModelVersion} -> analyzeDocumentModelVersion) (\s@GetDocumentAnalysisResponse' {} a -> s {analyzeDocumentModelVersion = a} :: GetDocumentAnalysisResponse)
+
+-- | The results of the text-analysis operation.
+getDocumentAnalysisResponse_blocks :: Lens.Lens' GetDocumentAnalysisResponse (Prelude.Maybe [Block])
+getDocumentAnalysisResponse_blocks = Lens.lens (\GetDocumentAnalysisResponse' {blocks} -> blocks) (\s@GetDocumentAnalysisResponse' {} a -> s {blocks = a} :: GetDocumentAnalysisResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | Information about a document that Amazon Textract processed.
+-- @DocumentMetadata@ is returned in every page of paginated responses from
+-- an Amazon Textract video operation.
+getDocumentAnalysisResponse_documentMetadata :: Lens.Lens' GetDocumentAnalysisResponse (Prelude.Maybe DocumentMetadata)
+getDocumentAnalysisResponse_documentMetadata = Lens.lens (\GetDocumentAnalysisResponse' {documentMetadata} -> documentMetadata) (\s@GetDocumentAnalysisResponse' {} a -> s {documentMetadata = a} :: GetDocumentAnalysisResponse)
+
+-- | The current status of the text detection job.
+getDocumentAnalysisResponse_jobStatus :: Lens.Lens' GetDocumentAnalysisResponse (Prelude.Maybe JobStatus)
+getDocumentAnalysisResponse_jobStatus = Lens.lens (\GetDocumentAnalysisResponse' {jobStatus} -> jobStatus) (\s@GetDocumentAnalysisResponse' {} a -> s {jobStatus = a} :: GetDocumentAnalysisResponse)
+
+-- | If the response is truncated, Amazon Textract returns this token. You
+-- can use this token in the subsequent request to retrieve the next set of
+-- text detection results.
+getDocumentAnalysisResponse_nextToken :: Lens.Lens' GetDocumentAnalysisResponse (Prelude.Maybe Prelude.Text)
+getDocumentAnalysisResponse_nextToken = Lens.lens (\GetDocumentAnalysisResponse' {nextToken} -> nextToken) (\s@GetDocumentAnalysisResponse' {} a -> s {nextToken = a} :: GetDocumentAnalysisResponse)
+
+-- | Returns if the detection job could not be completed. Contains
+-- explanation for what error occured.
+getDocumentAnalysisResponse_statusMessage :: Lens.Lens' GetDocumentAnalysisResponse (Prelude.Maybe Prelude.Text)
+getDocumentAnalysisResponse_statusMessage = Lens.lens (\GetDocumentAnalysisResponse' {statusMessage} -> statusMessage) (\s@GetDocumentAnalysisResponse' {} a -> s {statusMessage = a} :: GetDocumentAnalysisResponse)
+
+-- | A list of warnings that occurred during the document-analysis operation.
+getDocumentAnalysisResponse_warnings :: Lens.Lens' GetDocumentAnalysisResponse (Prelude.Maybe [Warning])
+getDocumentAnalysisResponse_warnings = Lens.lens (\GetDocumentAnalysisResponse' {warnings} -> warnings) (\s@GetDocumentAnalysisResponse' {} a -> s {warnings = a} :: GetDocumentAnalysisResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+getDocumentAnalysisResponse_httpStatus :: Lens.Lens' GetDocumentAnalysisResponse Prelude.Int
+getDocumentAnalysisResponse_httpStatus = Lens.lens (\GetDocumentAnalysisResponse' {httpStatus} -> httpStatus) (\s@GetDocumentAnalysisResponse' {} a -> s {httpStatus = a} :: GetDocumentAnalysisResponse)
+
+instance Prelude.NFData GetDocumentAnalysisResponse where
+  rnf GetDocumentAnalysisResponse' {..} =
+    Prelude.rnf analyzeDocumentModelVersion
+      `Prelude.seq` Prelude.rnf blocks
+      `Prelude.seq` Prelude.rnf documentMetadata
+      `Prelude.seq` Prelude.rnf jobStatus
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf statusMessage
+      `Prelude.seq` Prelude.rnf warnings
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Textract/GetDocumentTextDetection.hs b/gen/Amazonka/Textract/GetDocumentTextDetection.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/GetDocumentTextDetection.hs
@@ -0,0 +1,348 @@
+{-# 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.Textract.GetDocumentTextDetection
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets the results for an Amazon Textract asynchronous operation that
+-- detects text in a document. Amazon Textract can detect lines of text and
+-- the words that make up a line of text.
+--
+-- You start asynchronous text detection by calling
+-- StartDocumentTextDetection, which returns a job identifier (@JobId@).
+-- When the text detection operation finishes, Amazon Textract publishes a
+-- completion status to the Amazon Simple Notification Service (Amazon SNS)
+-- topic that\'s registered in the initial call to
+-- @StartDocumentTextDetection@. To get the results of the text-detection
+-- operation, first check that the status value published to the Amazon SNS
+-- topic is @SUCCEEDED@. If so, call @GetDocumentTextDetection@, and pass
+-- the job identifier (@JobId@) from the initial call to
+-- @StartDocumentTextDetection@.
+--
+-- @GetDocumentTextDetection@ returns an array of Block objects.
+--
+-- Each document page has as an associated @Block@ of type PAGE. Each PAGE
+-- @Block@ object is the parent of LINE @Block@ objects that represent the
+-- lines of detected text on a page. A LINE @Block@ object is a parent for
+-- each word that makes up the line. Words are represented by @Block@
+-- objects of type WORD.
+--
+-- Use the MaxResults parameter to limit the number of blocks that are
+-- returned. If there are more results than specified in @MaxResults@, the
+-- value of @NextToken@ in the operation response contains a pagination
+-- token for getting the next set of results. To get the next page of
+-- results, call @GetDocumentTextDetection@, and populate the @NextToken@
+-- request parameter with the token value that\'s returned from the
+-- previous call to @GetDocumentTextDetection@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/textract/latest/dg/how-it-works-detecting.html Document Text Detection>.
+module Amazonka.Textract.GetDocumentTextDetection
+  ( -- * Creating a Request
+    GetDocumentTextDetection (..),
+    newGetDocumentTextDetection,
+
+    -- * Request Lenses
+    getDocumentTextDetection_maxResults,
+    getDocumentTextDetection_nextToken,
+    getDocumentTextDetection_jobId,
+
+    -- * Destructuring the Response
+    GetDocumentTextDetectionResponse (..),
+    newGetDocumentTextDetectionResponse,
+
+    -- * Response Lenses
+    getDocumentTextDetectionResponse_blocks,
+    getDocumentTextDetectionResponse_detectDocumentTextModelVersion,
+    getDocumentTextDetectionResponse_documentMetadata,
+    getDocumentTextDetectionResponse_jobStatus,
+    getDocumentTextDetectionResponse_nextToken,
+    getDocumentTextDetectionResponse_statusMessage,
+    getDocumentTextDetectionResponse_warnings,
+    getDocumentTextDetectionResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Textract.Types
+
+-- | /See:/ 'newGetDocumentTextDetection' smart constructor.
+data GetDocumentTextDetection = GetDocumentTextDetection'
+  { -- | The maximum number of results to return per paginated call. The largest
+    -- value you can specify is 1,000. If you specify a value greater than
+    -- 1,000, a maximum of 1,000 results is returned. The default value is
+    -- 1,000.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | If the previous response was incomplete (because there are more blocks
+    -- to retrieve), Amazon Textract returns a pagination token in the
+    -- response. You can use this pagination token to retrieve the next set of
+    -- blocks.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A unique identifier for the text detection job. The @JobId@ is returned
+    -- from @StartDocumentTextDetection@. A @JobId@ value is only valid for 7
+    -- days.
+    jobId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetDocumentTextDetection' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'getDocumentTextDetection_maxResults' - The maximum number of results to return per paginated call. The largest
+-- value you can specify is 1,000. If you specify a value greater than
+-- 1,000, a maximum of 1,000 results is returned. The default value is
+-- 1,000.
+--
+-- 'nextToken', 'getDocumentTextDetection_nextToken' - If the previous response was incomplete (because there are more blocks
+-- to retrieve), Amazon Textract returns a pagination token in the
+-- response. You can use this pagination token to retrieve the next set of
+-- blocks.
+--
+-- 'jobId', 'getDocumentTextDetection_jobId' - A unique identifier for the text detection job. The @JobId@ is returned
+-- from @StartDocumentTextDetection@. A @JobId@ value is only valid for 7
+-- days.
+newGetDocumentTextDetection ::
+  -- | 'jobId'
+  Prelude.Text ->
+  GetDocumentTextDetection
+newGetDocumentTextDetection pJobId_ =
+  GetDocumentTextDetection'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      jobId = pJobId_
+    }
+
+-- | The maximum number of results to return per paginated call. The largest
+-- value you can specify is 1,000. If you specify a value greater than
+-- 1,000, a maximum of 1,000 results is returned. The default value is
+-- 1,000.
+getDocumentTextDetection_maxResults :: Lens.Lens' GetDocumentTextDetection (Prelude.Maybe Prelude.Natural)
+getDocumentTextDetection_maxResults = Lens.lens (\GetDocumentTextDetection' {maxResults} -> maxResults) (\s@GetDocumentTextDetection' {} a -> s {maxResults = a} :: GetDocumentTextDetection)
+
+-- | If the previous response was incomplete (because there are more blocks
+-- to retrieve), Amazon Textract returns a pagination token in the
+-- response. You can use this pagination token to retrieve the next set of
+-- blocks.
+getDocumentTextDetection_nextToken :: Lens.Lens' GetDocumentTextDetection (Prelude.Maybe Prelude.Text)
+getDocumentTextDetection_nextToken = Lens.lens (\GetDocumentTextDetection' {nextToken} -> nextToken) (\s@GetDocumentTextDetection' {} a -> s {nextToken = a} :: GetDocumentTextDetection)
+
+-- | A unique identifier for the text detection job. The @JobId@ is returned
+-- from @StartDocumentTextDetection@. A @JobId@ value is only valid for 7
+-- days.
+getDocumentTextDetection_jobId :: Lens.Lens' GetDocumentTextDetection Prelude.Text
+getDocumentTextDetection_jobId = Lens.lens (\GetDocumentTextDetection' {jobId} -> jobId) (\s@GetDocumentTextDetection' {} a -> s {jobId = a} :: GetDocumentTextDetection)
+
+instance Core.AWSRequest GetDocumentTextDetection where
+  type
+    AWSResponse GetDocumentTextDetection =
+      GetDocumentTextDetectionResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetDocumentTextDetectionResponse'
+            Prelude.<$> (x Data..?> "Blocks" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "DetectDocumentTextModelVersion")
+            Prelude.<*> (x Data..?> "DocumentMetadata")
+            Prelude.<*> (x Data..?> "JobStatus")
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "StatusMessage")
+            Prelude.<*> (x Data..?> "Warnings" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetDocumentTextDetection where
+  hashWithSalt _salt GetDocumentTextDetection' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` jobId
+
+instance Prelude.NFData GetDocumentTextDetection where
+  rnf GetDocumentTextDetection' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf jobId
+
+instance Data.ToHeaders GetDocumentTextDetection where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Textract.GetDocumentTextDetection" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetDocumentTextDetection where
+  toJSON GetDocumentTextDetection' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("JobId" Data..= jobId)
+          ]
+      )
+
+instance Data.ToPath GetDocumentTextDetection where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetDocumentTextDetection where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetDocumentTextDetectionResponse' smart constructor.
+data GetDocumentTextDetectionResponse = GetDocumentTextDetectionResponse'
+  { -- | The results of the text-detection operation.
+    blocks :: Prelude.Maybe [Block],
+    detectDocumentTextModelVersion :: Prelude.Maybe Prelude.Text,
+    -- | Information about a document that Amazon Textract processed.
+    -- @DocumentMetadata@ is returned in every page of paginated responses from
+    -- an Amazon Textract video operation.
+    documentMetadata :: Prelude.Maybe DocumentMetadata,
+    -- | The current status of the text detection job.
+    jobStatus :: Prelude.Maybe JobStatus,
+    -- | If the response is truncated, Amazon Textract returns this token. You
+    -- can use this token in the subsequent request to retrieve the next set of
+    -- text-detection results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Returns if the detection job could not be completed. Contains
+    -- explanation for what error occured.
+    statusMessage :: Prelude.Maybe Prelude.Text,
+    -- | A list of warnings that occurred during the text-detection operation for
+    -- the document.
+    warnings :: Prelude.Maybe [Warning],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetDocumentTextDetectionResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'blocks', 'getDocumentTextDetectionResponse_blocks' - The results of the text-detection operation.
+--
+-- 'detectDocumentTextModelVersion', 'getDocumentTextDetectionResponse_detectDocumentTextModelVersion' -
+--
+-- 'documentMetadata', 'getDocumentTextDetectionResponse_documentMetadata' - Information about a document that Amazon Textract processed.
+-- @DocumentMetadata@ is returned in every page of paginated responses from
+-- an Amazon Textract video operation.
+--
+-- 'jobStatus', 'getDocumentTextDetectionResponse_jobStatus' - The current status of the text detection job.
+--
+-- 'nextToken', 'getDocumentTextDetectionResponse_nextToken' - If the response is truncated, Amazon Textract returns this token. You
+-- can use this token in the subsequent request to retrieve the next set of
+-- text-detection results.
+--
+-- 'statusMessage', 'getDocumentTextDetectionResponse_statusMessage' - Returns if the detection job could not be completed. Contains
+-- explanation for what error occured.
+--
+-- 'warnings', 'getDocumentTextDetectionResponse_warnings' - A list of warnings that occurred during the text-detection operation for
+-- the document.
+--
+-- 'httpStatus', 'getDocumentTextDetectionResponse_httpStatus' - The response's http status code.
+newGetDocumentTextDetectionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetDocumentTextDetectionResponse
+newGetDocumentTextDetectionResponse pHttpStatus_ =
+  GetDocumentTextDetectionResponse'
+    { blocks =
+        Prelude.Nothing,
+      detectDocumentTextModelVersion =
+        Prelude.Nothing,
+      documentMetadata = Prelude.Nothing,
+      jobStatus = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      statusMessage = Prelude.Nothing,
+      warnings = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The results of the text-detection operation.
+getDocumentTextDetectionResponse_blocks :: Lens.Lens' GetDocumentTextDetectionResponse (Prelude.Maybe [Block])
+getDocumentTextDetectionResponse_blocks = Lens.lens (\GetDocumentTextDetectionResponse' {blocks} -> blocks) (\s@GetDocumentTextDetectionResponse' {} a -> s {blocks = a} :: GetDocumentTextDetectionResponse) Prelude.. Lens.mapping Lens.coerced
+
+getDocumentTextDetectionResponse_detectDocumentTextModelVersion :: Lens.Lens' GetDocumentTextDetectionResponse (Prelude.Maybe Prelude.Text)
+getDocumentTextDetectionResponse_detectDocumentTextModelVersion = Lens.lens (\GetDocumentTextDetectionResponse' {detectDocumentTextModelVersion} -> detectDocumentTextModelVersion) (\s@GetDocumentTextDetectionResponse' {} a -> s {detectDocumentTextModelVersion = a} :: GetDocumentTextDetectionResponse)
+
+-- | Information about a document that Amazon Textract processed.
+-- @DocumentMetadata@ is returned in every page of paginated responses from
+-- an Amazon Textract video operation.
+getDocumentTextDetectionResponse_documentMetadata :: Lens.Lens' GetDocumentTextDetectionResponse (Prelude.Maybe DocumentMetadata)
+getDocumentTextDetectionResponse_documentMetadata = Lens.lens (\GetDocumentTextDetectionResponse' {documentMetadata} -> documentMetadata) (\s@GetDocumentTextDetectionResponse' {} a -> s {documentMetadata = a} :: GetDocumentTextDetectionResponse)
+
+-- | The current status of the text detection job.
+getDocumentTextDetectionResponse_jobStatus :: Lens.Lens' GetDocumentTextDetectionResponse (Prelude.Maybe JobStatus)
+getDocumentTextDetectionResponse_jobStatus = Lens.lens (\GetDocumentTextDetectionResponse' {jobStatus} -> jobStatus) (\s@GetDocumentTextDetectionResponse' {} a -> s {jobStatus = a} :: GetDocumentTextDetectionResponse)
+
+-- | If the response is truncated, Amazon Textract returns this token. You
+-- can use this token in the subsequent request to retrieve the next set of
+-- text-detection results.
+getDocumentTextDetectionResponse_nextToken :: Lens.Lens' GetDocumentTextDetectionResponse (Prelude.Maybe Prelude.Text)
+getDocumentTextDetectionResponse_nextToken = Lens.lens (\GetDocumentTextDetectionResponse' {nextToken} -> nextToken) (\s@GetDocumentTextDetectionResponse' {} a -> s {nextToken = a} :: GetDocumentTextDetectionResponse)
+
+-- | Returns if the detection job could not be completed. Contains
+-- explanation for what error occured.
+getDocumentTextDetectionResponse_statusMessage :: Lens.Lens' GetDocumentTextDetectionResponse (Prelude.Maybe Prelude.Text)
+getDocumentTextDetectionResponse_statusMessage = Lens.lens (\GetDocumentTextDetectionResponse' {statusMessage} -> statusMessage) (\s@GetDocumentTextDetectionResponse' {} a -> s {statusMessage = a} :: GetDocumentTextDetectionResponse)
+
+-- | A list of warnings that occurred during the text-detection operation for
+-- the document.
+getDocumentTextDetectionResponse_warnings :: Lens.Lens' GetDocumentTextDetectionResponse (Prelude.Maybe [Warning])
+getDocumentTextDetectionResponse_warnings = Lens.lens (\GetDocumentTextDetectionResponse' {warnings} -> warnings) (\s@GetDocumentTextDetectionResponse' {} a -> s {warnings = a} :: GetDocumentTextDetectionResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+getDocumentTextDetectionResponse_httpStatus :: Lens.Lens' GetDocumentTextDetectionResponse Prelude.Int
+getDocumentTextDetectionResponse_httpStatus = Lens.lens (\GetDocumentTextDetectionResponse' {httpStatus} -> httpStatus) (\s@GetDocumentTextDetectionResponse' {} a -> s {httpStatus = a} :: GetDocumentTextDetectionResponse)
+
+instance
+  Prelude.NFData
+    GetDocumentTextDetectionResponse
+  where
+  rnf GetDocumentTextDetectionResponse' {..} =
+    Prelude.rnf blocks
+      `Prelude.seq` Prelude.rnf detectDocumentTextModelVersion
+      `Prelude.seq` Prelude.rnf documentMetadata
+      `Prelude.seq` Prelude.rnf jobStatus
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf statusMessage
+      `Prelude.seq` Prelude.rnf warnings
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Textract/GetExpenseAnalysis.hs b/gen/Amazonka/Textract/GetExpenseAnalysis.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/GetExpenseAnalysis.hs
@@ -0,0 +1,335 @@
+{-# 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.Textract.GetExpenseAnalysis
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets the results for an Amazon Textract asynchronous operation that
+-- analyzes invoices and receipts. Amazon Textract finds contact
+-- information, items purchased, and vendor name, from input invoices and
+-- receipts.
+--
+-- You start asynchronous invoice\/receipt analysis by calling
+-- StartExpenseAnalysis, which returns a job identifier (@JobId@). Upon
+-- completion of the invoice\/receipt analysis, Amazon Textract publishes
+-- the completion status to the Amazon Simple Notification Service (Amazon
+-- SNS) topic. This topic must be registered in the initial call to
+-- @StartExpenseAnalysis@. To get the results of the invoice\/receipt
+-- analysis operation, first ensure that the status value published to the
+-- Amazon SNS topic is @SUCCEEDED@. If so, call @GetExpenseAnalysis@, and
+-- pass the job identifier (@JobId@) from the initial call to
+-- @StartExpenseAnalysis@.
+--
+-- Use the MaxResults parameter to limit the number of blocks that are
+-- returned. If there are more results than specified in @MaxResults@, the
+-- value of @NextToken@ in the operation response contains a pagination
+-- token for getting the next set of results. To get the next page of
+-- results, call @GetExpenseAnalysis@, and populate the @NextToken@ request
+-- parameter with the token value that\'s returned from the previous call
+-- to @GetExpenseAnalysis@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/textract/latest/dg/invoices-receipts.html Analyzing Invoices and Receipts>.
+module Amazonka.Textract.GetExpenseAnalysis
+  ( -- * Creating a Request
+    GetExpenseAnalysis (..),
+    newGetExpenseAnalysis,
+
+    -- * Request Lenses
+    getExpenseAnalysis_maxResults,
+    getExpenseAnalysis_nextToken,
+    getExpenseAnalysis_jobId,
+
+    -- * Destructuring the Response
+    GetExpenseAnalysisResponse (..),
+    newGetExpenseAnalysisResponse,
+
+    -- * Response Lenses
+    getExpenseAnalysisResponse_analyzeExpenseModelVersion,
+    getExpenseAnalysisResponse_documentMetadata,
+    getExpenseAnalysisResponse_expenseDocuments,
+    getExpenseAnalysisResponse_jobStatus,
+    getExpenseAnalysisResponse_nextToken,
+    getExpenseAnalysisResponse_statusMessage,
+    getExpenseAnalysisResponse_warnings,
+    getExpenseAnalysisResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Textract.Types
+
+-- | /See:/ 'newGetExpenseAnalysis' smart constructor.
+data GetExpenseAnalysis = GetExpenseAnalysis'
+  { -- | The maximum number of results to return per paginated call. The largest
+    -- value you can specify is 20. If you specify a value greater than 20, a
+    -- maximum of 20 results is returned. The default value is 20.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | If the previous response was incomplete (because there are more blocks
+    -- to retrieve), Amazon Textract returns a pagination token in the
+    -- response. You can use this pagination token to retrieve the next set of
+    -- blocks.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A unique identifier for the text detection job. The @JobId@ is returned
+    -- from @StartExpenseAnalysis@. A @JobId@ value is only valid for 7 days.
+    jobId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetExpenseAnalysis' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'getExpenseAnalysis_maxResults' - The maximum number of results to return per paginated call. The largest
+-- value you can specify is 20. If you specify a value greater than 20, a
+-- maximum of 20 results is returned. The default value is 20.
+--
+-- 'nextToken', 'getExpenseAnalysis_nextToken' - If the previous response was incomplete (because there are more blocks
+-- to retrieve), Amazon Textract returns a pagination token in the
+-- response. You can use this pagination token to retrieve the next set of
+-- blocks.
+--
+-- 'jobId', 'getExpenseAnalysis_jobId' - A unique identifier for the text detection job. The @JobId@ is returned
+-- from @StartExpenseAnalysis@. A @JobId@ value is only valid for 7 days.
+newGetExpenseAnalysis ::
+  -- | 'jobId'
+  Prelude.Text ->
+  GetExpenseAnalysis
+newGetExpenseAnalysis pJobId_ =
+  GetExpenseAnalysis'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      jobId = pJobId_
+    }
+
+-- | The maximum number of results to return per paginated call. The largest
+-- value you can specify is 20. If you specify a value greater than 20, a
+-- maximum of 20 results is returned. The default value is 20.
+getExpenseAnalysis_maxResults :: Lens.Lens' GetExpenseAnalysis (Prelude.Maybe Prelude.Natural)
+getExpenseAnalysis_maxResults = Lens.lens (\GetExpenseAnalysis' {maxResults} -> maxResults) (\s@GetExpenseAnalysis' {} a -> s {maxResults = a} :: GetExpenseAnalysis)
+
+-- | If the previous response was incomplete (because there are more blocks
+-- to retrieve), Amazon Textract returns a pagination token in the
+-- response. You can use this pagination token to retrieve the next set of
+-- blocks.
+getExpenseAnalysis_nextToken :: Lens.Lens' GetExpenseAnalysis (Prelude.Maybe Prelude.Text)
+getExpenseAnalysis_nextToken = Lens.lens (\GetExpenseAnalysis' {nextToken} -> nextToken) (\s@GetExpenseAnalysis' {} a -> s {nextToken = a} :: GetExpenseAnalysis)
+
+-- | A unique identifier for the text detection job. The @JobId@ is returned
+-- from @StartExpenseAnalysis@. A @JobId@ value is only valid for 7 days.
+getExpenseAnalysis_jobId :: Lens.Lens' GetExpenseAnalysis Prelude.Text
+getExpenseAnalysis_jobId = Lens.lens (\GetExpenseAnalysis' {jobId} -> jobId) (\s@GetExpenseAnalysis' {} a -> s {jobId = a} :: GetExpenseAnalysis)
+
+instance Core.AWSRequest GetExpenseAnalysis where
+  type
+    AWSResponse GetExpenseAnalysis =
+      GetExpenseAnalysisResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetExpenseAnalysisResponse'
+            Prelude.<$> (x Data..?> "AnalyzeExpenseModelVersion")
+            Prelude.<*> (x Data..?> "DocumentMetadata")
+            Prelude.<*> ( x
+                            Data..?> "ExpenseDocuments"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "JobStatus")
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "StatusMessage")
+            Prelude.<*> (x Data..?> "Warnings" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetExpenseAnalysis where
+  hashWithSalt _salt GetExpenseAnalysis' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` jobId
+
+instance Prelude.NFData GetExpenseAnalysis where
+  rnf GetExpenseAnalysis' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf jobId
+
+instance Data.ToHeaders GetExpenseAnalysis where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Textract.GetExpenseAnalysis" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetExpenseAnalysis where
+  toJSON GetExpenseAnalysis' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("JobId" Data..= jobId)
+          ]
+      )
+
+instance Data.ToPath GetExpenseAnalysis where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetExpenseAnalysis where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetExpenseAnalysisResponse' smart constructor.
+data GetExpenseAnalysisResponse = GetExpenseAnalysisResponse'
+  { -- | The current model version of AnalyzeExpense.
+    analyzeExpenseModelVersion :: Prelude.Maybe Prelude.Text,
+    -- | Information about a document that Amazon Textract processed.
+    -- @DocumentMetadata@ is returned in every page of paginated responses from
+    -- an Amazon Textract operation.
+    documentMetadata :: Prelude.Maybe DocumentMetadata,
+    -- | The expenses detected by Amazon Textract.
+    expenseDocuments :: Prelude.Maybe [ExpenseDocument],
+    -- | The current status of the text detection job.
+    jobStatus :: Prelude.Maybe JobStatus,
+    -- | If the response is truncated, Amazon Textract returns this token. You
+    -- can use this token in the subsequent request to retrieve the next set of
+    -- text-detection results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Returns if the detection job could not be completed. Contains
+    -- explanation for what error occured.
+    statusMessage :: Prelude.Maybe Prelude.Text,
+    -- | A list of warnings that occurred during the text-detection operation for
+    -- the document.
+    warnings :: Prelude.Maybe [Warning],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetExpenseAnalysisResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'analyzeExpenseModelVersion', 'getExpenseAnalysisResponse_analyzeExpenseModelVersion' - The current model version of AnalyzeExpense.
+--
+-- 'documentMetadata', 'getExpenseAnalysisResponse_documentMetadata' - Information about a document that Amazon Textract processed.
+-- @DocumentMetadata@ is returned in every page of paginated responses from
+-- an Amazon Textract operation.
+--
+-- 'expenseDocuments', 'getExpenseAnalysisResponse_expenseDocuments' - The expenses detected by Amazon Textract.
+--
+-- 'jobStatus', 'getExpenseAnalysisResponse_jobStatus' - The current status of the text detection job.
+--
+-- 'nextToken', 'getExpenseAnalysisResponse_nextToken' - If the response is truncated, Amazon Textract returns this token. You
+-- can use this token in the subsequent request to retrieve the next set of
+-- text-detection results.
+--
+-- 'statusMessage', 'getExpenseAnalysisResponse_statusMessage' - Returns if the detection job could not be completed. Contains
+-- explanation for what error occured.
+--
+-- 'warnings', 'getExpenseAnalysisResponse_warnings' - A list of warnings that occurred during the text-detection operation for
+-- the document.
+--
+-- 'httpStatus', 'getExpenseAnalysisResponse_httpStatus' - The response's http status code.
+newGetExpenseAnalysisResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetExpenseAnalysisResponse
+newGetExpenseAnalysisResponse pHttpStatus_ =
+  GetExpenseAnalysisResponse'
+    { analyzeExpenseModelVersion =
+        Prelude.Nothing,
+      documentMetadata = Prelude.Nothing,
+      expenseDocuments = Prelude.Nothing,
+      jobStatus = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      statusMessage = Prelude.Nothing,
+      warnings = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The current model version of AnalyzeExpense.
+getExpenseAnalysisResponse_analyzeExpenseModelVersion :: Lens.Lens' GetExpenseAnalysisResponse (Prelude.Maybe Prelude.Text)
+getExpenseAnalysisResponse_analyzeExpenseModelVersion = Lens.lens (\GetExpenseAnalysisResponse' {analyzeExpenseModelVersion} -> analyzeExpenseModelVersion) (\s@GetExpenseAnalysisResponse' {} a -> s {analyzeExpenseModelVersion = a} :: GetExpenseAnalysisResponse)
+
+-- | Information about a document that Amazon Textract processed.
+-- @DocumentMetadata@ is returned in every page of paginated responses from
+-- an Amazon Textract operation.
+getExpenseAnalysisResponse_documentMetadata :: Lens.Lens' GetExpenseAnalysisResponse (Prelude.Maybe DocumentMetadata)
+getExpenseAnalysisResponse_documentMetadata = Lens.lens (\GetExpenseAnalysisResponse' {documentMetadata} -> documentMetadata) (\s@GetExpenseAnalysisResponse' {} a -> s {documentMetadata = a} :: GetExpenseAnalysisResponse)
+
+-- | The expenses detected by Amazon Textract.
+getExpenseAnalysisResponse_expenseDocuments :: Lens.Lens' GetExpenseAnalysisResponse (Prelude.Maybe [ExpenseDocument])
+getExpenseAnalysisResponse_expenseDocuments = Lens.lens (\GetExpenseAnalysisResponse' {expenseDocuments} -> expenseDocuments) (\s@GetExpenseAnalysisResponse' {} a -> s {expenseDocuments = a} :: GetExpenseAnalysisResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The current status of the text detection job.
+getExpenseAnalysisResponse_jobStatus :: Lens.Lens' GetExpenseAnalysisResponse (Prelude.Maybe JobStatus)
+getExpenseAnalysisResponse_jobStatus = Lens.lens (\GetExpenseAnalysisResponse' {jobStatus} -> jobStatus) (\s@GetExpenseAnalysisResponse' {} a -> s {jobStatus = a} :: GetExpenseAnalysisResponse)
+
+-- | If the response is truncated, Amazon Textract returns this token. You
+-- can use this token in the subsequent request to retrieve the next set of
+-- text-detection results.
+getExpenseAnalysisResponse_nextToken :: Lens.Lens' GetExpenseAnalysisResponse (Prelude.Maybe Prelude.Text)
+getExpenseAnalysisResponse_nextToken = Lens.lens (\GetExpenseAnalysisResponse' {nextToken} -> nextToken) (\s@GetExpenseAnalysisResponse' {} a -> s {nextToken = a} :: GetExpenseAnalysisResponse)
+
+-- | Returns if the detection job could not be completed. Contains
+-- explanation for what error occured.
+getExpenseAnalysisResponse_statusMessage :: Lens.Lens' GetExpenseAnalysisResponse (Prelude.Maybe Prelude.Text)
+getExpenseAnalysisResponse_statusMessage = Lens.lens (\GetExpenseAnalysisResponse' {statusMessage} -> statusMessage) (\s@GetExpenseAnalysisResponse' {} a -> s {statusMessage = a} :: GetExpenseAnalysisResponse)
+
+-- | A list of warnings that occurred during the text-detection operation for
+-- the document.
+getExpenseAnalysisResponse_warnings :: Lens.Lens' GetExpenseAnalysisResponse (Prelude.Maybe [Warning])
+getExpenseAnalysisResponse_warnings = Lens.lens (\GetExpenseAnalysisResponse' {warnings} -> warnings) (\s@GetExpenseAnalysisResponse' {} a -> s {warnings = a} :: GetExpenseAnalysisResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+getExpenseAnalysisResponse_httpStatus :: Lens.Lens' GetExpenseAnalysisResponse Prelude.Int
+getExpenseAnalysisResponse_httpStatus = Lens.lens (\GetExpenseAnalysisResponse' {httpStatus} -> httpStatus) (\s@GetExpenseAnalysisResponse' {} a -> s {httpStatus = a} :: GetExpenseAnalysisResponse)
+
+instance Prelude.NFData GetExpenseAnalysisResponse where
+  rnf GetExpenseAnalysisResponse' {..} =
+    Prelude.rnf analyzeExpenseModelVersion
+      `Prelude.seq` Prelude.rnf documentMetadata
+      `Prelude.seq` Prelude.rnf expenseDocuments
+      `Prelude.seq` Prelude.rnf jobStatus
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf statusMessage
+      `Prelude.seq` Prelude.rnf warnings
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Textract/GetLendingAnalysis.hs b/gen/Amazonka/Textract/GetLendingAnalysis.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/GetLendingAnalysis.hs
@@ -0,0 +1,312 @@
+{-# 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.Textract.GetLendingAnalysis
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets the results for an Amazon Textract asynchronous operation that
+-- analyzes text in a lending document.
+--
+-- You start asynchronous text analysis by calling @StartLendingAnalysis@,
+-- which returns a job identifier (@JobId@). When the text analysis
+-- operation finishes, Amazon Textract publishes a completion status to the
+-- Amazon Simple Notification Service (Amazon SNS) topic that\'s registered
+-- in the initial call to @StartLendingAnalysis@.
+--
+-- To get the results of the text analysis operation, first check that the
+-- status value published to the Amazon SNS topic is SUCCEEDED. If so, call
+-- GetLendingAnalysis, and pass the job identifier (@JobId@) from the
+-- initial call to @StartLendingAnalysis@.
+module Amazonka.Textract.GetLendingAnalysis
+  ( -- * Creating a Request
+    GetLendingAnalysis (..),
+    newGetLendingAnalysis,
+
+    -- * Request Lenses
+    getLendingAnalysis_maxResults,
+    getLendingAnalysis_nextToken,
+    getLendingAnalysis_jobId,
+
+    -- * Destructuring the Response
+    GetLendingAnalysisResponse (..),
+    newGetLendingAnalysisResponse,
+
+    -- * Response Lenses
+    getLendingAnalysisResponse_analyzeLendingModelVersion,
+    getLendingAnalysisResponse_documentMetadata,
+    getLendingAnalysisResponse_jobStatus,
+    getLendingAnalysisResponse_nextToken,
+    getLendingAnalysisResponse_results,
+    getLendingAnalysisResponse_statusMessage,
+    getLendingAnalysisResponse_warnings,
+    getLendingAnalysisResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Textract.Types
+
+-- | /See:/ 'newGetLendingAnalysis' smart constructor.
+data GetLendingAnalysis = GetLendingAnalysis'
+  { -- | The maximum number of results to return per paginated call. The largest
+    -- value that you can specify is 30. If you specify a value greater than
+    -- 30, a maximum of 30 results is returned. The default value is 30.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | If the previous response was incomplete, Amazon Textract returns a
+    -- pagination token in the response. You can use this pagination token to
+    -- retrieve the next set of lending results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A unique identifier for the lending or text-detection job. The @JobId@
+    -- is returned from @StartLendingAnalysis@. A @JobId@ value is only valid
+    -- for 7 days.
+    jobId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetLendingAnalysis' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'getLendingAnalysis_maxResults' - The maximum number of results to return per paginated call. The largest
+-- value that you can specify is 30. If you specify a value greater than
+-- 30, a maximum of 30 results is returned. The default value is 30.
+--
+-- 'nextToken', 'getLendingAnalysis_nextToken' - If the previous response was incomplete, Amazon Textract returns a
+-- pagination token in the response. You can use this pagination token to
+-- retrieve the next set of lending results.
+--
+-- 'jobId', 'getLendingAnalysis_jobId' - A unique identifier for the lending or text-detection job. The @JobId@
+-- is returned from @StartLendingAnalysis@. A @JobId@ value is only valid
+-- for 7 days.
+newGetLendingAnalysis ::
+  -- | 'jobId'
+  Prelude.Text ->
+  GetLendingAnalysis
+newGetLendingAnalysis pJobId_ =
+  GetLendingAnalysis'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      jobId = pJobId_
+    }
+
+-- | The maximum number of results to return per paginated call. The largest
+-- value that you can specify is 30. If you specify a value greater than
+-- 30, a maximum of 30 results is returned. The default value is 30.
+getLendingAnalysis_maxResults :: Lens.Lens' GetLendingAnalysis (Prelude.Maybe Prelude.Natural)
+getLendingAnalysis_maxResults = Lens.lens (\GetLendingAnalysis' {maxResults} -> maxResults) (\s@GetLendingAnalysis' {} a -> s {maxResults = a} :: GetLendingAnalysis)
+
+-- | If the previous response was incomplete, Amazon Textract returns a
+-- pagination token in the response. You can use this pagination token to
+-- retrieve the next set of lending results.
+getLendingAnalysis_nextToken :: Lens.Lens' GetLendingAnalysis (Prelude.Maybe Prelude.Text)
+getLendingAnalysis_nextToken = Lens.lens (\GetLendingAnalysis' {nextToken} -> nextToken) (\s@GetLendingAnalysis' {} a -> s {nextToken = a} :: GetLendingAnalysis)
+
+-- | A unique identifier for the lending or text-detection job. The @JobId@
+-- is returned from @StartLendingAnalysis@. A @JobId@ value is only valid
+-- for 7 days.
+getLendingAnalysis_jobId :: Lens.Lens' GetLendingAnalysis Prelude.Text
+getLendingAnalysis_jobId = Lens.lens (\GetLendingAnalysis' {jobId} -> jobId) (\s@GetLendingAnalysis' {} a -> s {jobId = a} :: GetLendingAnalysis)
+
+instance Core.AWSRequest GetLendingAnalysis where
+  type
+    AWSResponse GetLendingAnalysis =
+      GetLendingAnalysisResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetLendingAnalysisResponse'
+            Prelude.<$> (x Data..?> "AnalyzeLendingModelVersion")
+            Prelude.<*> (x Data..?> "DocumentMetadata")
+            Prelude.<*> (x Data..?> "JobStatus")
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "Results" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "StatusMessage")
+            Prelude.<*> (x Data..?> "Warnings" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetLendingAnalysis where
+  hashWithSalt _salt GetLendingAnalysis' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` jobId
+
+instance Prelude.NFData GetLendingAnalysis where
+  rnf GetLendingAnalysis' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf jobId
+
+instance Data.ToHeaders GetLendingAnalysis where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Textract.GetLendingAnalysis" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetLendingAnalysis where
+  toJSON GetLendingAnalysis' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("JobId" Data..= jobId)
+          ]
+      )
+
+instance Data.ToPath GetLendingAnalysis where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetLendingAnalysis where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetLendingAnalysisResponse' smart constructor.
+data GetLendingAnalysisResponse = GetLendingAnalysisResponse'
+  { -- | The current model version of the Analyze Lending API.
+    analyzeLendingModelVersion :: Prelude.Maybe Prelude.Text,
+    documentMetadata :: Prelude.Maybe DocumentMetadata,
+    -- | The current status of the lending analysis job.
+    jobStatus :: Prelude.Maybe JobStatus,
+    -- | If the response is truncated, Amazon Textract returns this token. You
+    -- can use this token in the subsequent request to retrieve the next set of
+    -- lending results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Holds the information returned by one of AmazonTextract\'s document
+    -- analysis operations for the pinstripe.
+    results :: Prelude.Maybe [LendingResult],
+    -- | Returns if the lending analysis job could not be completed. Contains
+    -- explanation for what error occurred.
+    statusMessage :: Prelude.Maybe Prelude.Text,
+    -- | A list of warnings that occurred during the lending analysis operation.
+    warnings :: Prelude.Maybe [Warning],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetLendingAnalysisResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'analyzeLendingModelVersion', 'getLendingAnalysisResponse_analyzeLendingModelVersion' - The current model version of the Analyze Lending API.
+--
+-- 'documentMetadata', 'getLendingAnalysisResponse_documentMetadata' - Undocumented member.
+--
+-- 'jobStatus', 'getLendingAnalysisResponse_jobStatus' - The current status of the lending analysis job.
+--
+-- 'nextToken', 'getLendingAnalysisResponse_nextToken' - If the response is truncated, Amazon Textract returns this token. You
+-- can use this token in the subsequent request to retrieve the next set of
+-- lending results.
+--
+-- 'results', 'getLendingAnalysisResponse_results' - Holds the information returned by one of AmazonTextract\'s document
+-- analysis operations for the pinstripe.
+--
+-- 'statusMessage', 'getLendingAnalysisResponse_statusMessage' - Returns if the lending analysis job could not be completed. Contains
+-- explanation for what error occurred.
+--
+-- 'warnings', 'getLendingAnalysisResponse_warnings' - A list of warnings that occurred during the lending analysis operation.
+--
+-- 'httpStatus', 'getLendingAnalysisResponse_httpStatus' - The response's http status code.
+newGetLendingAnalysisResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetLendingAnalysisResponse
+newGetLendingAnalysisResponse pHttpStatus_ =
+  GetLendingAnalysisResponse'
+    { analyzeLendingModelVersion =
+        Prelude.Nothing,
+      documentMetadata = Prelude.Nothing,
+      jobStatus = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      results = Prelude.Nothing,
+      statusMessage = Prelude.Nothing,
+      warnings = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The current model version of the Analyze Lending API.
+getLendingAnalysisResponse_analyzeLendingModelVersion :: Lens.Lens' GetLendingAnalysisResponse (Prelude.Maybe Prelude.Text)
+getLendingAnalysisResponse_analyzeLendingModelVersion = Lens.lens (\GetLendingAnalysisResponse' {analyzeLendingModelVersion} -> analyzeLendingModelVersion) (\s@GetLendingAnalysisResponse' {} a -> s {analyzeLendingModelVersion = a} :: GetLendingAnalysisResponse)
+
+-- | Undocumented member.
+getLendingAnalysisResponse_documentMetadata :: Lens.Lens' GetLendingAnalysisResponse (Prelude.Maybe DocumentMetadata)
+getLendingAnalysisResponse_documentMetadata = Lens.lens (\GetLendingAnalysisResponse' {documentMetadata} -> documentMetadata) (\s@GetLendingAnalysisResponse' {} a -> s {documentMetadata = a} :: GetLendingAnalysisResponse)
+
+-- | The current status of the lending analysis job.
+getLendingAnalysisResponse_jobStatus :: Lens.Lens' GetLendingAnalysisResponse (Prelude.Maybe JobStatus)
+getLendingAnalysisResponse_jobStatus = Lens.lens (\GetLendingAnalysisResponse' {jobStatus} -> jobStatus) (\s@GetLendingAnalysisResponse' {} a -> s {jobStatus = a} :: GetLendingAnalysisResponse)
+
+-- | If the response is truncated, Amazon Textract returns this token. You
+-- can use this token in the subsequent request to retrieve the next set of
+-- lending results.
+getLendingAnalysisResponse_nextToken :: Lens.Lens' GetLendingAnalysisResponse (Prelude.Maybe Prelude.Text)
+getLendingAnalysisResponse_nextToken = Lens.lens (\GetLendingAnalysisResponse' {nextToken} -> nextToken) (\s@GetLendingAnalysisResponse' {} a -> s {nextToken = a} :: GetLendingAnalysisResponse)
+
+-- | Holds the information returned by one of AmazonTextract\'s document
+-- analysis operations for the pinstripe.
+getLendingAnalysisResponse_results :: Lens.Lens' GetLendingAnalysisResponse (Prelude.Maybe [LendingResult])
+getLendingAnalysisResponse_results = Lens.lens (\GetLendingAnalysisResponse' {results} -> results) (\s@GetLendingAnalysisResponse' {} a -> s {results = a} :: GetLendingAnalysisResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | Returns if the lending analysis job could not be completed. Contains
+-- explanation for what error occurred.
+getLendingAnalysisResponse_statusMessage :: Lens.Lens' GetLendingAnalysisResponse (Prelude.Maybe Prelude.Text)
+getLendingAnalysisResponse_statusMessage = Lens.lens (\GetLendingAnalysisResponse' {statusMessage} -> statusMessage) (\s@GetLendingAnalysisResponse' {} a -> s {statusMessage = a} :: GetLendingAnalysisResponse)
+
+-- | A list of warnings that occurred during the lending analysis operation.
+getLendingAnalysisResponse_warnings :: Lens.Lens' GetLendingAnalysisResponse (Prelude.Maybe [Warning])
+getLendingAnalysisResponse_warnings = Lens.lens (\GetLendingAnalysisResponse' {warnings} -> warnings) (\s@GetLendingAnalysisResponse' {} a -> s {warnings = a} :: GetLendingAnalysisResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+getLendingAnalysisResponse_httpStatus :: Lens.Lens' GetLendingAnalysisResponse Prelude.Int
+getLendingAnalysisResponse_httpStatus = Lens.lens (\GetLendingAnalysisResponse' {httpStatus} -> httpStatus) (\s@GetLendingAnalysisResponse' {} a -> s {httpStatus = a} :: GetLendingAnalysisResponse)
+
+instance Prelude.NFData GetLendingAnalysisResponse where
+  rnf GetLendingAnalysisResponse' {..} =
+    Prelude.rnf analyzeLendingModelVersion
+      `Prelude.seq` Prelude.rnf documentMetadata
+      `Prelude.seq` Prelude.rnf jobStatus
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf results
+      `Prelude.seq` Prelude.rnf statusMessage
+      `Prelude.seq` Prelude.rnf warnings
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Textract/GetLendingAnalysisSummary.hs b/gen/Amazonka/Textract/GetLendingAnalysisSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/GetLendingAnalysisSummary.hs
@@ -0,0 +1,255 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Textract.GetLendingAnalysisSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets summarized results for the @StartLendingAnalysis@ operation, which
+-- analyzes text in a lending document. The returned summary consists of
+-- information about documents grouped together by a common document type.
+-- Information like detected signatures, page numbers, and split documents
+-- is returned with respect to the type of grouped document.
+--
+-- You start asynchronous text analysis by calling @StartLendingAnalysis@,
+-- which returns a job identifier (@JobId@). When the text analysis
+-- operation finishes, Amazon Textract publishes a completion status to the
+-- Amazon Simple Notification Service (Amazon SNS) topic that\'s registered
+-- in the initial call to @StartLendingAnalysis@.
+--
+-- To get the results of the text analysis operation, first check that the
+-- status value published to the Amazon SNS topic is SUCCEEDED. If so, call
+-- @GetLendingAnalysisSummary@, and pass the job identifier (@JobId@) from
+-- the initial call to @StartLendingAnalysis@.
+module Amazonka.Textract.GetLendingAnalysisSummary
+  ( -- * Creating a Request
+    GetLendingAnalysisSummary (..),
+    newGetLendingAnalysisSummary,
+
+    -- * Request Lenses
+    getLendingAnalysisSummary_jobId,
+
+    -- * Destructuring the Response
+    GetLendingAnalysisSummaryResponse (..),
+    newGetLendingAnalysisSummaryResponse,
+
+    -- * Response Lenses
+    getLendingAnalysisSummaryResponse_analyzeLendingModelVersion,
+    getLendingAnalysisSummaryResponse_documentMetadata,
+    getLendingAnalysisSummaryResponse_jobStatus,
+    getLendingAnalysisSummaryResponse_statusMessage,
+    getLendingAnalysisSummaryResponse_summary,
+    getLendingAnalysisSummaryResponse_warnings,
+    getLendingAnalysisSummaryResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Textract.Types
+
+-- | /See:/ 'newGetLendingAnalysisSummary' smart constructor.
+data GetLendingAnalysisSummary = GetLendingAnalysisSummary'
+  { -- | A unique identifier for the lending or text-detection job. The @JobId@
+    -- is returned from StartLendingAnalysis. A @JobId@ value is only valid for
+    -- 7 days.
+    jobId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetLendingAnalysisSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'jobId', 'getLendingAnalysisSummary_jobId' - A unique identifier for the lending or text-detection job. The @JobId@
+-- is returned from StartLendingAnalysis. A @JobId@ value is only valid for
+-- 7 days.
+newGetLendingAnalysisSummary ::
+  -- | 'jobId'
+  Prelude.Text ->
+  GetLendingAnalysisSummary
+newGetLendingAnalysisSummary pJobId_ =
+  GetLendingAnalysisSummary' {jobId = pJobId_}
+
+-- | A unique identifier for the lending or text-detection job. The @JobId@
+-- is returned from StartLendingAnalysis. A @JobId@ value is only valid for
+-- 7 days.
+getLendingAnalysisSummary_jobId :: Lens.Lens' GetLendingAnalysisSummary Prelude.Text
+getLendingAnalysisSummary_jobId = Lens.lens (\GetLendingAnalysisSummary' {jobId} -> jobId) (\s@GetLendingAnalysisSummary' {} a -> s {jobId = a} :: GetLendingAnalysisSummary)
+
+instance Core.AWSRequest GetLendingAnalysisSummary where
+  type
+    AWSResponse GetLendingAnalysisSummary =
+      GetLendingAnalysisSummaryResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetLendingAnalysisSummaryResponse'
+            Prelude.<$> (x Data..?> "AnalyzeLendingModelVersion")
+            Prelude.<*> (x Data..?> "DocumentMetadata")
+            Prelude.<*> (x Data..?> "JobStatus")
+            Prelude.<*> (x Data..?> "StatusMessage")
+            Prelude.<*> (x Data..?> "Summary")
+            Prelude.<*> (x Data..?> "Warnings" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetLendingAnalysisSummary where
+  hashWithSalt _salt GetLendingAnalysisSummary' {..} =
+    _salt `Prelude.hashWithSalt` jobId
+
+instance Prelude.NFData GetLendingAnalysisSummary where
+  rnf GetLendingAnalysisSummary' {..} =
+    Prelude.rnf jobId
+
+instance Data.ToHeaders GetLendingAnalysisSummary where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Textract.GetLendingAnalysisSummary" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetLendingAnalysisSummary where
+  toJSON GetLendingAnalysisSummary' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("JobId" Data..= jobId)]
+      )
+
+instance Data.ToPath GetLendingAnalysisSummary where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetLendingAnalysisSummary where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetLendingAnalysisSummaryResponse' smart constructor.
+data GetLendingAnalysisSummaryResponse = GetLendingAnalysisSummaryResponse'
+  { -- | The current model version of the Analyze Lending API.
+    analyzeLendingModelVersion :: Prelude.Maybe Prelude.Text,
+    documentMetadata :: Prelude.Maybe DocumentMetadata,
+    -- | The current status of the lending analysis job.
+    jobStatus :: Prelude.Maybe JobStatus,
+    -- | Returns if the lending analysis could not be completed. Contains
+    -- explanation for what error occurred.
+    statusMessage :: Prelude.Maybe Prelude.Text,
+    -- | Contains summary information for documents grouped by type.
+    summary :: Prelude.Maybe LendingSummary,
+    -- | A list of warnings that occurred during the lending analysis operation.
+    warnings :: Prelude.Maybe [Warning],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetLendingAnalysisSummaryResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'analyzeLendingModelVersion', 'getLendingAnalysisSummaryResponse_analyzeLendingModelVersion' - The current model version of the Analyze Lending API.
+--
+-- 'documentMetadata', 'getLendingAnalysisSummaryResponse_documentMetadata' - Undocumented member.
+--
+-- 'jobStatus', 'getLendingAnalysisSummaryResponse_jobStatus' - The current status of the lending analysis job.
+--
+-- 'statusMessage', 'getLendingAnalysisSummaryResponse_statusMessage' - Returns if the lending analysis could not be completed. Contains
+-- explanation for what error occurred.
+--
+-- 'summary', 'getLendingAnalysisSummaryResponse_summary' - Contains summary information for documents grouped by type.
+--
+-- 'warnings', 'getLendingAnalysisSummaryResponse_warnings' - A list of warnings that occurred during the lending analysis operation.
+--
+-- 'httpStatus', 'getLendingAnalysisSummaryResponse_httpStatus' - The response's http status code.
+newGetLendingAnalysisSummaryResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetLendingAnalysisSummaryResponse
+newGetLendingAnalysisSummaryResponse pHttpStatus_ =
+  GetLendingAnalysisSummaryResponse'
+    { analyzeLendingModelVersion =
+        Prelude.Nothing,
+      documentMetadata = Prelude.Nothing,
+      jobStatus = Prelude.Nothing,
+      statusMessage = Prelude.Nothing,
+      summary = Prelude.Nothing,
+      warnings = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The current model version of the Analyze Lending API.
+getLendingAnalysisSummaryResponse_analyzeLendingModelVersion :: Lens.Lens' GetLendingAnalysisSummaryResponse (Prelude.Maybe Prelude.Text)
+getLendingAnalysisSummaryResponse_analyzeLendingModelVersion = Lens.lens (\GetLendingAnalysisSummaryResponse' {analyzeLendingModelVersion} -> analyzeLendingModelVersion) (\s@GetLendingAnalysisSummaryResponse' {} a -> s {analyzeLendingModelVersion = a} :: GetLendingAnalysisSummaryResponse)
+
+-- | Undocumented member.
+getLendingAnalysisSummaryResponse_documentMetadata :: Lens.Lens' GetLendingAnalysisSummaryResponse (Prelude.Maybe DocumentMetadata)
+getLendingAnalysisSummaryResponse_documentMetadata = Lens.lens (\GetLendingAnalysisSummaryResponse' {documentMetadata} -> documentMetadata) (\s@GetLendingAnalysisSummaryResponse' {} a -> s {documentMetadata = a} :: GetLendingAnalysisSummaryResponse)
+
+-- | The current status of the lending analysis job.
+getLendingAnalysisSummaryResponse_jobStatus :: Lens.Lens' GetLendingAnalysisSummaryResponse (Prelude.Maybe JobStatus)
+getLendingAnalysisSummaryResponse_jobStatus = Lens.lens (\GetLendingAnalysisSummaryResponse' {jobStatus} -> jobStatus) (\s@GetLendingAnalysisSummaryResponse' {} a -> s {jobStatus = a} :: GetLendingAnalysisSummaryResponse)
+
+-- | Returns if the lending analysis could not be completed. Contains
+-- explanation for what error occurred.
+getLendingAnalysisSummaryResponse_statusMessage :: Lens.Lens' GetLendingAnalysisSummaryResponse (Prelude.Maybe Prelude.Text)
+getLendingAnalysisSummaryResponse_statusMessage = Lens.lens (\GetLendingAnalysisSummaryResponse' {statusMessage} -> statusMessage) (\s@GetLendingAnalysisSummaryResponse' {} a -> s {statusMessage = a} :: GetLendingAnalysisSummaryResponse)
+
+-- | Contains summary information for documents grouped by type.
+getLendingAnalysisSummaryResponse_summary :: Lens.Lens' GetLendingAnalysisSummaryResponse (Prelude.Maybe LendingSummary)
+getLendingAnalysisSummaryResponse_summary = Lens.lens (\GetLendingAnalysisSummaryResponse' {summary} -> summary) (\s@GetLendingAnalysisSummaryResponse' {} a -> s {summary = a} :: GetLendingAnalysisSummaryResponse)
+
+-- | A list of warnings that occurred during the lending analysis operation.
+getLendingAnalysisSummaryResponse_warnings :: Lens.Lens' GetLendingAnalysisSummaryResponse (Prelude.Maybe [Warning])
+getLendingAnalysisSummaryResponse_warnings = Lens.lens (\GetLendingAnalysisSummaryResponse' {warnings} -> warnings) (\s@GetLendingAnalysisSummaryResponse' {} a -> s {warnings = a} :: GetLendingAnalysisSummaryResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+getLendingAnalysisSummaryResponse_httpStatus :: Lens.Lens' GetLendingAnalysisSummaryResponse Prelude.Int
+getLendingAnalysisSummaryResponse_httpStatus = Lens.lens (\GetLendingAnalysisSummaryResponse' {httpStatus} -> httpStatus) (\s@GetLendingAnalysisSummaryResponse' {} a -> s {httpStatus = a} :: GetLendingAnalysisSummaryResponse)
+
+instance
+  Prelude.NFData
+    GetLendingAnalysisSummaryResponse
+  where
+  rnf GetLendingAnalysisSummaryResponse' {..} =
+    Prelude.rnf analyzeLendingModelVersion
+      `Prelude.seq` Prelude.rnf documentMetadata
+      `Prelude.seq` Prelude.rnf jobStatus
+      `Prelude.seq` Prelude.rnf statusMessage
+      `Prelude.seq` Prelude.rnf summary
+      `Prelude.seq` Prelude.rnf warnings
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Textract/Lens.hs b/gen/Amazonka/Textract/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Lens.hs
@@ -0,0 +1,406 @@
+{-# 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.Textract.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.Textract.Lens
+  ( -- * Operations
+
+    -- ** AnalyzeDocument
+    analyzeDocument_humanLoopConfig,
+    analyzeDocument_queriesConfig,
+    analyzeDocument_document,
+    analyzeDocument_featureTypes,
+    analyzeDocumentResponse_analyzeDocumentModelVersion,
+    analyzeDocumentResponse_blocks,
+    analyzeDocumentResponse_documentMetadata,
+    analyzeDocumentResponse_humanLoopActivationOutput,
+    analyzeDocumentResponse_httpStatus,
+
+    -- ** AnalyzeExpense
+    analyzeExpense_document,
+    analyzeExpenseResponse_documentMetadata,
+    analyzeExpenseResponse_expenseDocuments,
+    analyzeExpenseResponse_httpStatus,
+
+    -- ** AnalyzeID
+    analyzeID_documentPages,
+    analyzeIDResponse_analyzeIDModelVersion,
+    analyzeIDResponse_documentMetadata,
+    analyzeIDResponse_identityDocuments,
+    analyzeIDResponse_httpStatus,
+
+    -- ** DetectDocumentText
+    detectDocumentText_document,
+    detectDocumentTextResponse_blocks,
+    detectDocumentTextResponse_detectDocumentTextModelVersion,
+    detectDocumentTextResponse_documentMetadata,
+    detectDocumentTextResponse_httpStatus,
+
+    -- ** GetDocumentAnalysis
+    getDocumentAnalysis_maxResults,
+    getDocumentAnalysis_nextToken,
+    getDocumentAnalysis_jobId,
+    getDocumentAnalysisResponse_analyzeDocumentModelVersion,
+    getDocumentAnalysisResponse_blocks,
+    getDocumentAnalysisResponse_documentMetadata,
+    getDocumentAnalysisResponse_jobStatus,
+    getDocumentAnalysisResponse_nextToken,
+    getDocumentAnalysisResponse_statusMessage,
+    getDocumentAnalysisResponse_warnings,
+    getDocumentAnalysisResponse_httpStatus,
+
+    -- ** GetDocumentTextDetection
+    getDocumentTextDetection_maxResults,
+    getDocumentTextDetection_nextToken,
+    getDocumentTextDetection_jobId,
+    getDocumentTextDetectionResponse_blocks,
+    getDocumentTextDetectionResponse_detectDocumentTextModelVersion,
+    getDocumentTextDetectionResponse_documentMetadata,
+    getDocumentTextDetectionResponse_jobStatus,
+    getDocumentTextDetectionResponse_nextToken,
+    getDocumentTextDetectionResponse_statusMessage,
+    getDocumentTextDetectionResponse_warnings,
+    getDocumentTextDetectionResponse_httpStatus,
+
+    -- ** GetExpenseAnalysis
+    getExpenseAnalysis_maxResults,
+    getExpenseAnalysis_nextToken,
+    getExpenseAnalysis_jobId,
+    getExpenseAnalysisResponse_analyzeExpenseModelVersion,
+    getExpenseAnalysisResponse_documentMetadata,
+    getExpenseAnalysisResponse_expenseDocuments,
+    getExpenseAnalysisResponse_jobStatus,
+    getExpenseAnalysisResponse_nextToken,
+    getExpenseAnalysisResponse_statusMessage,
+    getExpenseAnalysisResponse_warnings,
+    getExpenseAnalysisResponse_httpStatus,
+
+    -- ** GetLendingAnalysis
+    getLendingAnalysis_maxResults,
+    getLendingAnalysis_nextToken,
+    getLendingAnalysis_jobId,
+    getLendingAnalysisResponse_analyzeLendingModelVersion,
+    getLendingAnalysisResponse_documentMetadata,
+    getLendingAnalysisResponse_jobStatus,
+    getLendingAnalysisResponse_nextToken,
+    getLendingAnalysisResponse_results,
+    getLendingAnalysisResponse_statusMessage,
+    getLendingAnalysisResponse_warnings,
+    getLendingAnalysisResponse_httpStatus,
+
+    -- ** GetLendingAnalysisSummary
+    getLendingAnalysisSummary_jobId,
+    getLendingAnalysisSummaryResponse_analyzeLendingModelVersion,
+    getLendingAnalysisSummaryResponse_documentMetadata,
+    getLendingAnalysisSummaryResponse_jobStatus,
+    getLendingAnalysisSummaryResponse_statusMessage,
+    getLendingAnalysisSummaryResponse_summary,
+    getLendingAnalysisSummaryResponse_warnings,
+    getLendingAnalysisSummaryResponse_httpStatus,
+
+    -- ** StartDocumentAnalysis
+    startDocumentAnalysis_clientRequestToken,
+    startDocumentAnalysis_jobTag,
+    startDocumentAnalysis_kmsKeyId,
+    startDocumentAnalysis_notificationChannel,
+    startDocumentAnalysis_outputConfig,
+    startDocumentAnalysis_queriesConfig,
+    startDocumentAnalysis_documentLocation,
+    startDocumentAnalysis_featureTypes,
+    startDocumentAnalysisResponse_jobId,
+    startDocumentAnalysisResponse_httpStatus,
+
+    -- ** StartDocumentTextDetection
+    startDocumentTextDetection_clientRequestToken,
+    startDocumentTextDetection_jobTag,
+    startDocumentTextDetection_kmsKeyId,
+    startDocumentTextDetection_notificationChannel,
+    startDocumentTextDetection_outputConfig,
+    startDocumentTextDetection_documentLocation,
+    startDocumentTextDetectionResponse_jobId,
+    startDocumentTextDetectionResponse_httpStatus,
+
+    -- ** StartExpenseAnalysis
+    startExpenseAnalysis_clientRequestToken,
+    startExpenseAnalysis_jobTag,
+    startExpenseAnalysis_kmsKeyId,
+    startExpenseAnalysis_notificationChannel,
+    startExpenseAnalysis_outputConfig,
+    startExpenseAnalysis_documentLocation,
+    startExpenseAnalysisResponse_jobId,
+    startExpenseAnalysisResponse_httpStatus,
+
+    -- ** StartLendingAnalysis
+    startLendingAnalysis_clientRequestToken,
+    startLendingAnalysis_jobTag,
+    startLendingAnalysis_kmsKeyId,
+    startLendingAnalysis_notificationChannel,
+    startLendingAnalysis_outputConfig,
+    startLendingAnalysis_documentLocation,
+    startLendingAnalysisResponse_jobId,
+    startLendingAnalysisResponse_httpStatus,
+
+    -- * Types
+
+    -- ** AnalyzeIDDetections
+    analyzeIDDetections_confidence,
+    analyzeIDDetections_normalizedValue,
+    analyzeIDDetections_text,
+
+    -- ** Block
+    block_blockType,
+    block_columnIndex,
+    block_columnSpan,
+    block_confidence,
+    block_entityTypes,
+    block_geometry,
+    block_id,
+    block_page,
+    block_query,
+    block_relationships,
+    block_rowIndex,
+    block_rowSpan,
+    block_selectionStatus,
+    block_text,
+    block_textType,
+
+    -- ** BoundingBox
+    boundingBox_height,
+    boundingBox_left,
+    boundingBox_top,
+    boundingBox_width,
+
+    -- ** DetectedSignature
+    detectedSignature_page,
+
+    -- ** Document
+    document_bytes,
+    document_s3Object,
+
+    -- ** DocumentGroup
+    documentGroup_detectedSignatures,
+    documentGroup_splitDocuments,
+    documentGroup_type,
+    documentGroup_undetectedSignatures,
+
+    -- ** DocumentLocation
+    documentLocation_s3Object,
+
+    -- ** DocumentMetadata
+    documentMetadata_pages,
+
+    -- ** ExpenseCurrency
+    expenseCurrency_code,
+    expenseCurrency_confidence,
+
+    -- ** ExpenseDetection
+    expenseDetection_confidence,
+    expenseDetection_geometry,
+    expenseDetection_text,
+
+    -- ** ExpenseDocument
+    expenseDocument_blocks,
+    expenseDocument_expenseIndex,
+    expenseDocument_lineItemGroups,
+    expenseDocument_summaryFields,
+
+    -- ** ExpenseField
+    expenseField_currency,
+    expenseField_groupProperties,
+    expenseField_labelDetection,
+    expenseField_pageNumber,
+    expenseField_type,
+    expenseField_valueDetection,
+
+    -- ** ExpenseGroupProperty
+    expenseGroupProperty_id,
+    expenseGroupProperty_types,
+
+    -- ** ExpenseType
+    expenseType_confidence,
+    expenseType_text,
+
+    -- ** Extraction
+    extraction_expenseDocument,
+    extraction_identityDocument,
+    extraction_lendingDocument,
+
+    -- ** Geometry
+    geometry_boundingBox,
+    geometry_polygon,
+
+    -- ** HumanLoopActivationOutput
+    humanLoopActivationOutput_humanLoopActivationConditionsEvaluationResults,
+    humanLoopActivationOutput_humanLoopActivationReasons,
+    humanLoopActivationOutput_humanLoopArn,
+
+    -- ** HumanLoopConfig
+    humanLoopConfig_dataAttributes,
+    humanLoopConfig_humanLoopName,
+    humanLoopConfig_flowDefinitionArn,
+
+    -- ** HumanLoopDataAttributes
+    humanLoopDataAttributes_contentClassifiers,
+
+    -- ** IdentityDocument
+    identityDocument_blocks,
+    identityDocument_documentIndex,
+    identityDocument_identityDocumentFields,
+
+    -- ** IdentityDocumentField
+    identityDocumentField_type,
+    identityDocumentField_valueDetection,
+
+    -- ** LendingDetection
+    lendingDetection_confidence,
+    lendingDetection_geometry,
+    lendingDetection_selectionStatus,
+    lendingDetection_text,
+
+    -- ** LendingDocument
+    lendingDocument_lendingFields,
+    lendingDocument_signatureDetections,
+
+    -- ** LendingField
+    lendingField_keyDetection,
+    lendingField_type,
+    lendingField_valueDetections,
+
+    -- ** LendingResult
+    lendingResult_extractions,
+    lendingResult_page,
+    lendingResult_pageClassification,
+
+    -- ** LendingSummary
+    lendingSummary_documentGroups,
+    lendingSummary_undetectedDocumentTypes,
+
+    -- ** LineItemFields
+    lineItemFields_lineItemExpenseFields,
+
+    -- ** LineItemGroup
+    lineItemGroup_lineItemGroupIndex,
+    lineItemGroup_lineItems,
+
+    -- ** NormalizedValue
+    normalizedValue_value,
+    normalizedValue_valueType,
+
+    -- ** NotificationChannel
+    notificationChannel_sNSTopicArn,
+    notificationChannel_roleArn,
+
+    -- ** OutputConfig
+    outputConfig_s3Prefix,
+    outputConfig_s3Bucket,
+
+    -- ** PageClassification
+    pageClassification_pageType,
+    pageClassification_pageNumber,
+
+    -- ** Point
+    point_x,
+    point_y,
+
+    -- ** Prediction
+    prediction_confidence,
+    prediction_value,
+
+    -- ** QueriesConfig
+    queriesConfig_queries,
+
+    -- ** Query
+    query_alias,
+    query_pages,
+    query_text,
+
+    -- ** Relationship
+    relationship_ids,
+    relationship_type,
+
+    -- ** S3Object
+    s3Object_bucket,
+    s3Object_name,
+    s3Object_version,
+
+    -- ** SignatureDetection
+    signatureDetection_confidence,
+    signatureDetection_geometry,
+
+    -- ** SplitDocument
+    splitDocument_index,
+    splitDocument_pages,
+
+    -- ** UndetectedSignature
+    undetectedSignature_page,
+
+    -- ** Warning
+    warning_errorCode,
+    warning_pages,
+  )
+where
+
+import Amazonka.Textract.AnalyzeDocument
+import Amazonka.Textract.AnalyzeExpense
+import Amazonka.Textract.AnalyzeID
+import Amazonka.Textract.DetectDocumentText
+import Amazonka.Textract.GetDocumentAnalysis
+import Amazonka.Textract.GetDocumentTextDetection
+import Amazonka.Textract.GetExpenseAnalysis
+import Amazonka.Textract.GetLendingAnalysis
+import Amazonka.Textract.GetLendingAnalysisSummary
+import Amazonka.Textract.StartDocumentAnalysis
+import Amazonka.Textract.StartDocumentTextDetection
+import Amazonka.Textract.StartExpenseAnalysis
+import Amazonka.Textract.StartLendingAnalysis
+import Amazonka.Textract.Types.AnalyzeIDDetections
+import Amazonka.Textract.Types.Block
+import Amazonka.Textract.Types.BoundingBox
+import Amazonka.Textract.Types.DetectedSignature
+import Amazonka.Textract.Types.Document
+import Amazonka.Textract.Types.DocumentGroup
+import Amazonka.Textract.Types.DocumentLocation
+import Amazonka.Textract.Types.DocumentMetadata
+import Amazonka.Textract.Types.ExpenseCurrency
+import Amazonka.Textract.Types.ExpenseDetection
+import Amazonka.Textract.Types.ExpenseDocument
+import Amazonka.Textract.Types.ExpenseField
+import Amazonka.Textract.Types.ExpenseGroupProperty
+import Amazonka.Textract.Types.ExpenseType
+import Amazonka.Textract.Types.Extraction
+import Amazonka.Textract.Types.Geometry
+import Amazonka.Textract.Types.HumanLoopActivationOutput
+import Amazonka.Textract.Types.HumanLoopConfig
+import Amazonka.Textract.Types.HumanLoopDataAttributes
+import Amazonka.Textract.Types.IdentityDocument
+import Amazonka.Textract.Types.IdentityDocumentField
+import Amazonka.Textract.Types.LendingDetection
+import Amazonka.Textract.Types.LendingDocument
+import Amazonka.Textract.Types.LendingField
+import Amazonka.Textract.Types.LendingResult
+import Amazonka.Textract.Types.LendingSummary
+import Amazonka.Textract.Types.LineItemFields
+import Amazonka.Textract.Types.LineItemGroup
+import Amazonka.Textract.Types.NormalizedValue
+import Amazonka.Textract.Types.NotificationChannel
+import Amazonka.Textract.Types.OutputConfig
+import Amazonka.Textract.Types.PageClassification
+import Amazonka.Textract.Types.Point
+import Amazonka.Textract.Types.Prediction
+import Amazonka.Textract.Types.QueriesConfig
+import Amazonka.Textract.Types.Query
+import Amazonka.Textract.Types.Relationship
+import Amazonka.Textract.Types.S3Object
+import Amazonka.Textract.Types.SignatureDetection
+import Amazonka.Textract.Types.SplitDocument
+import Amazonka.Textract.Types.UndetectedSignature
+import Amazonka.Textract.Types.Warning
diff --git a/gen/Amazonka/Textract/StartDocumentAnalysis.hs b/gen/Amazonka/Textract/StartDocumentAnalysis.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/StartDocumentAnalysis.hs
@@ -0,0 +1,352 @@
+{-# 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.Textract.StartDocumentAnalysis
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Starts the asynchronous analysis of an input document for relationships
+-- between detected items such as key-value pairs, tables, and selection
+-- elements.
+--
+-- @StartDocumentAnalysis@ can analyze text in documents that are in JPEG,
+-- PNG, TIFF, and PDF format. The documents are stored in an Amazon S3
+-- bucket. Use DocumentLocation to specify the bucket name and file name of
+-- the document.
+--
+-- @StartDocumentAnalysis@ returns a job identifier (@JobId@) that you use
+-- to get the results of the operation. When text analysis is finished,
+-- Amazon Textract publishes a completion status to the Amazon Simple
+-- Notification Service (Amazon SNS) topic that you specify in
+-- @NotificationChannel@. To get the results of the text analysis
+-- operation, first check that the status value published to the Amazon SNS
+-- topic is @SUCCEEDED@. If so, call GetDocumentAnalysis, and pass the job
+-- identifier (@JobId@) from the initial call to @StartDocumentAnalysis@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/textract/latest/dg/how-it-works-analyzing.html Document Text Analysis>.
+module Amazonka.Textract.StartDocumentAnalysis
+  ( -- * Creating a Request
+    StartDocumentAnalysis (..),
+    newStartDocumentAnalysis,
+
+    -- * Request Lenses
+    startDocumentAnalysis_clientRequestToken,
+    startDocumentAnalysis_jobTag,
+    startDocumentAnalysis_kmsKeyId,
+    startDocumentAnalysis_notificationChannel,
+    startDocumentAnalysis_outputConfig,
+    startDocumentAnalysis_queriesConfig,
+    startDocumentAnalysis_documentLocation,
+    startDocumentAnalysis_featureTypes,
+
+    -- * Destructuring the Response
+    StartDocumentAnalysisResponse (..),
+    newStartDocumentAnalysisResponse,
+
+    -- * Response Lenses
+    startDocumentAnalysisResponse_jobId,
+    startDocumentAnalysisResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Textract.Types
+
+-- | /See:/ 'newStartDocumentAnalysis' smart constructor.
+data StartDocumentAnalysis = StartDocumentAnalysis'
+  { -- | The idempotent token that you use to identify the start request. If you
+    -- use the same token with multiple @StartDocumentAnalysis@ requests, the
+    -- same @JobId@ is returned. Use @ClientRequestToken@ to prevent the same
+    -- job from being accidentally started more than once. For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/textract/latest/dg/api-async.html Calling Amazon Textract Asynchronous Operations>.
+    clientRequestToken :: Prelude.Maybe Prelude.Text,
+    -- | An identifier that you specify that\'s included in the completion
+    -- notification published to the Amazon SNS topic. For example, you can use
+    -- @JobTag@ to identify the type of document that the completion
+    -- notification corresponds to (such as a tax form or a receipt).
+    jobTag :: Prelude.Maybe Prelude.Text,
+    -- | The KMS key used to encrypt the inference results. This can be in either
+    -- Key ID or Key Alias format. When a KMS key is provided, the KMS key will
+    -- be used for server-side encryption of the objects in the customer
+    -- bucket. When this parameter is not enabled, the result will be encrypted
+    -- server side,using SSE-S3.
+    kmsKeyId :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon SNS topic ARN that you want Amazon Textract to publish the
+    -- completion status of the operation to.
+    notificationChannel :: Prelude.Maybe NotificationChannel,
+    -- | Sets if the output will go to a customer defined bucket. By default,
+    -- Amazon Textract will save the results internally to be accessed by the
+    -- GetDocumentAnalysis operation.
+    outputConfig :: Prelude.Maybe OutputConfig,
+    queriesConfig :: Prelude.Maybe QueriesConfig,
+    -- | The location of the document to be processed.
+    documentLocation :: DocumentLocation,
+    -- | A list of the types of analysis to perform. Add TABLES to the list to
+    -- return information about the tables that are detected in the input
+    -- document. Add FORMS to return detected form data. To perform both types
+    -- of analysis, add TABLES and FORMS to @FeatureTypes@. All lines and words
+    -- detected in the document are included in the response (including text
+    -- that isn\'t related to the value of @FeatureTypes@).
+    featureTypes :: [FeatureType]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartDocumentAnalysis' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'startDocumentAnalysis_clientRequestToken' - The idempotent token that you use to identify the start request. If you
+-- use the same token with multiple @StartDocumentAnalysis@ requests, the
+-- same @JobId@ is returned. Use @ClientRequestToken@ to prevent the same
+-- job from being accidentally started more than once. For more
+-- information, see
+-- <https://docs.aws.amazon.com/textract/latest/dg/api-async.html Calling Amazon Textract Asynchronous Operations>.
+--
+-- 'jobTag', 'startDocumentAnalysis_jobTag' - An identifier that you specify that\'s included in the completion
+-- notification published to the Amazon SNS topic. For example, you can use
+-- @JobTag@ to identify the type of document that the completion
+-- notification corresponds to (such as a tax form or a receipt).
+--
+-- 'kmsKeyId', 'startDocumentAnalysis_kmsKeyId' - The KMS key used to encrypt the inference results. This can be in either
+-- Key ID or Key Alias format. When a KMS key is provided, the KMS key will
+-- be used for server-side encryption of the objects in the customer
+-- bucket. When this parameter is not enabled, the result will be encrypted
+-- server side,using SSE-S3.
+--
+-- 'notificationChannel', 'startDocumentAnalysis_notificationChannel' - The Amazon SNS topic ARN that you want Amazon Textract to publish the
+-- completion status of the operation to.
+--
+-- 'outputConfig', 'startDocumentAnalysis_outputConfig' - Sets if the output will go to a customer defined bucket. By default,
+-- Amazon Textract will save the results internally to be accessed by the
+-- GetDocumentAnalysis operation.
+--
+-- 'queriesConfig', 'startDocumentAnalysis_queriesConfig' - Undocumented member.
+--
+-- 'documentLocation', 'startDocumentAnalysis_documentLocation' - The location of the document to be processed.
+--
+-- 'featureTypes', 'startDocumentAnalysis_featureTypes' - A list of the types of analysis to perform. Add TABLES to the list to
+-- return information about the tables that are detected in the input
+-- document. Add FORMS to return detected form data. To perform both types
+-- of analysis, add TABLES and FORMS to @FeatureTypes@. All lines and words
+-- detected in the document are included in the response (including text
+-- that isn\'t related to the value of @FeatureTypes@).
+newStartDocumentAnalysis ::
+  -- | 'documentLocation'
+  DocumentLocation ->
+  StartDocumentAnalysis
+newStartDocumentAnalysis pDocumentLocation_ =
+  StartDocumentAnalysis'
+    { clientRequestToken =
+        Prelude.Nothing,
+      jobTag = Prelude.Nothing,
+      kmsKeyId = Prelude.Nothing,
+      notificationChannel = Prelude.Nothing,
+      outputConfig = Prelude.Nothing,
+      queriesConfig = Prelude.Nothing,
+      documentLocation = pDocumentLocation_,
+      featureTypes = Prelude.mempty
+    }
+
+-- | The idempotent token that you use to identify the start request. If you
+-- use the same token with multiple @StartDocumentAnalysis@ requests, the
+-- same @JobId@ is returned. Use @ClientRequestToken@ to prevent the same
+-- job from being accidentally started more than once. For more
+-- information, see
+-- <https://docs.aws.amazon.com/textract/latest/dg/api-async.html Calling Amazon Textract Asynchronous Operations>.
+startDocumentAnalysis_clientRequestToken :: Lens.Lens' StartDocumentAnalysis (Prelude.Maybe Prelude.Text)
+startDocumentAnalysis_clientRequestToken = Lens.lens (\StartDocumentAnalysis' {clientRequestToken} -> clientRequestToken) (\s@StartDocumentAnalysis' {} a -> s {clientRequestToken = a} :: StartDocumentAnalysis)
+
+-- | An identifier that you specify that\'s included in the completion
+-- notification published to the Amazon SNS topic. For example, you can use
+-- @JobTag@ to identify the type of document that the completion
+-- notification corresponds to (such as a tax form or a receipt).
+startDocumentAnalysis_jobTag :: Lens.Lens' StartDocumentAnalysis (Prelude.Maybe Prelude.Text)
+startDocumentAnalysis_jobTag = Lens.lens (\StartDocumentAnalysis' {jobTag} -> jobTag) (\s@StartDocumentAnalysis' {} a -> s {jobTag = a} :: StartDocumentAnalysis)
+
+-- | The KMS key used to encrypt the inference results. This can be in either
+-- Key ID or Key Alias format. When a KMS key is provided, the KMS key will
+-- be used for server-side encryption of the objects in the customer
+-- bucket. When this parameter is not enabled, the result will be encrypted
+-- server side,using SSE-S3.
+startDocumentAnalysis_kmsKeyId :: Lens.Lens' StartDocumentAnalysis (Prelude.Maybe Prelude.Text)
+startDocumentAnalysis_kmsKeyId = Lens.lens (\StartDocumentAnalysis' {kmsKeyId} -> kmsKeyId) (\s@StartDocumentAnalysis' {} a -> s {kmsKeyId = a} :: StartDocumentAnalysis)
+
+-- | The Amazon SNS topic ARN that you want Amazon Textract to publish the
+-- completion status of the operation to.
+startDocumentAnalysis_notificationChannel :: Lens.Lens' StartDocumentAnalysis (Prelude.Maybe NotificationChannel)
+startDocumentAnalysis_notificationChannel = Lens.lens (\StartDocumentAnalysis' {notificationChannel} -> notificationChannel) (\s@StartDocumentAnalysis' {} a -> s {notificationChannel = a} :: StartDocumentAnalysis)
+
+-- | Sets if the output will go to a customer defined bucket. By default,
+-- Amazon Textract will save the results internally to be accessed by the
+-- GetDocumentAnalysis operation.
+startDocumentAnalysis_outputConfig :: Lens.Lens' StartDocumentAnalysis (Prelude.Maybe OutputConfig)
+startDocumentAnalysis_outputConfig = Lens.lens (\StartDocumentAnalysis' {outputConfig} -> outputConfig) (\s@StartDocumentAnalysis' {} a -> s {outputConfig = a} :: StartDocumentAnalysis)
+
+-- | Undocumented member.
+startDocumentAnalysis_queriesConfig :: Lens.Lens' StartDocumentAnalysis (Prelude.Maybe QueriesConfig)
+startDocumentAnalysis_queriesConfig = Lens.lens (\StartDocumentAnalysis' {queriesConfig} -> queriesConfig) (\s@StartDocumentAnalysis' {} a -> s {queriesConfig = a} :: StartDocumentAnalysis)
+
+-- | The location of the document to be processed.
+startDocumentAnalysis_documentLocation :: Lens.Lens' StartDocumentAnalysis DocumentLocation
+startDocumentAnalysis_documentLocation = Lens.lens (\StartDocumentAnalysis' {documentLocation} -> documentLocation) (\s@StartDocumentAnalysis' {} a -> s {documentLocation = a} :: StartDocumentAnalysis)
+
+-- | A list of the types of analysis to perform. Add TABLES to the list to
+-- return information about the tables that are detected in the input
+-- document. Add FORMS to return detected form data. To perform both types
+-- of analysis, add TABLES and FORMS to @FeatureTypes@. All lines and words
+-- detected in the document are included in the response (including text
+-- that isn\'t related to the value of @FeatureTypes@).
+startDocumentAnalysis_featureTypes :: Lens.Lens' StartDocumentAnalysis [FeatureType]
+startDocumentAnalysis_featureTypes = Lens.lens (\StartDocumentAnalysis' {featureTypes} -> featureTypes) (\s@StartDocumentAnalysis' {} a -> s {featureTypes = a} :: StartDocumentAnalysis) Prelude.. Lens.coerced
+
+instance Core.AWSRequest StartDocumentAnalysis where
+  type
+    AWSResponse StartDocumentAnalysis =
+      StartDocumentAnalysisResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          StartDocumentAnalysisResponse'
+            Prelude.<$> (x Data..?> "JobId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable StartDocumentAnalysis where
+  hashWithSalt _salt StartDocumentAnalysis' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientRequestToken
+      `Prelude.hashWithSalt` jobTag
+      `Prelude.hashWithSalt` kmsKeyId
+      `Prelude.hashWithSalt` notificationChannel
+      `Prelude.hashWithSalt` outputConfig
+      `Prelude.hashWithSalt` queriesConfig
+      `Prelude.hashWithSalt` documentLocation
+      `Prelude.hashWithSalt` featureTypes
+
+instance Prelude.NFData StartDocumentAnalysis where
+  rnf StartDocumentAnalysis' {..} =
+    Prelude.rnf clientRequestToken
+      `Prelude.seq` Prelude.rnf jobTag
+      `Prelude.seq` Prelude.rnf kmsKeyId
+      `Prelude.seq` Prelude.rnf notificationChannel
+      `Prelude.seq` Prelude.rnf outputConfig
+      `Prelude.seq` Prelude.rnf queriesConfig
+      `Prelude.seq` Prelude.rnf documentLocation
+      `Prelude.seq` Prelude.rnf featureTypes
+
+instance Data.ToHeaders StartDocumentAnalysis where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Textract.StartDocumentAnalysis" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON StartDocumentAnalysis where
+  toJSON StartDocumentAnalysis' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ClientRequestToken" Data..=)
+              Prelude.<$> clientRequestToken,
+            ("JobTag" Data..=) Prelude.<$> jobTag,
+            ("KMSKeyId" Data..=) Prelude.<$> kmsKeyId,
+            ("NotificationChannel" Data..=)
+              Prelude.<$> notificationChannel,
+            ("OutputConfig" Data..=) Prelude.<$> outputConfig,
+            ("QueriesConfig" Data..=) Prelude.<$> queriesConfig,
+            Prelude.Just
+              ("DocumentLocation" Data..= documentLocation),
+            Prelude.Just ("FeatureTypes" Data..= featureTypes)
+          ]
+      )
+
+instance Data.ToPath StartDocumentAnalysis where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery StartDocumentAnalysis where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newStartDocumentAnalysisResponse' smart constructor.
+data StartDocumentAnalysisResponse = StartDocumentAnalysisResponse'
+  { -- | The identifier for the document text detection job. Use @JobId@ to
+    -- identify the job in a subsequent call to @GetDocumentAnalysis@. A
+    -- @JobId@ value is only valid for 7 days.
+    jobId :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartDocumentAnalysisResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'jobId', 'startDocumentAnalysisResponse_jobId' - The identifier for the document text detection job. Use @JobId@ to
+-- identify the job in a subsequent call to @GetDocumentAnalysis@. A
+-- @JobId@ value is only valid for 7 days.
+--
+-- 'httpStatus', 'startDocumentAnalysisResponse_httpStatus' - The response's http status code.
+newStartDocumentAnalysisResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  StartDocumentAnalysisResponse
+newStartDocumentAnalysisResponse pHttpStatus_ =
+  StartDocumentAnalysisResponse'
+    { jobId =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The identifier for the document text detection job. Use @JobId@ to
+-- identify the job in a subsequent call to @GetDocumentAnalysis@. A
+-- @JobId@ value is only valid for 7 days.
+startDocumentAnalysisResponse_jobId :: Lens.Lens' StartDocumentAnalysisResponse (Prelude.Maybe Prelude.Text)
+startDocumentAnalysisResponse_jobId = Lens.lens (\StartDocumentAnalysisResponse' {jobId} -> jobId) (\s@StartDocumentAnalysisResponse' {} a -> s {jobId = a} :: StartDocumentAnalysisResponse)
+
+-- | The response's http status code.
+startDocumentAnalysisResponse_httpStatus :: Lens.Lens' StartDocumentAnalysisResponse Prelude.Int
+startDocumentAnalysisResponse_httpStatus = Lens.lens (\StartDocumentAnalysisResponse' {httpStatus} -> httpStatus) (\s@StartDocumentAnalysisResponse' {} a -> s {httpStatus = a} :: StartDocumentAnalysisResponse)
+
+instance Prelude.NFData StartDocumentAnalysisResponse where
+  rnf StartDocumentAnalysisResponse' {..} =
+    Prelude.rnf jobId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Textract/StartDocumentTextDetection.hs b/gen/Amazonka/Textract/StartDocumentTextDetection.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/StartDocumentTextDetection.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.Textract.StartDocumentTextDetection
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Starts the asynchronous detection of text in a document. Amazon Textract
+-- can detect lines of text and the words that make up a line of text.
+--
+-- @StartDocumentTextDetection@ can analyze text in documents that are in
+-- JPEG, PNG, TIFF, and PDF format. The documents are stored in an Amazon
+-- S3 bucket. Use DocumentLocation to specify the bucket name and file name
+-- of the document.
+--
+-- @StartTextDetection@ returns a job identifier (@JobId@) that you use to
+-- get the results of the operation. When text detection is finished,
+-- Amazon Textract publishes a completion status to the Amazon Simple
+-- Notification Service (Amazon SNS) topic that you specify in
+-- @NotificationChannel@. To get the results of the text detection
+-- operation, first check that the status value published to the Amazon SNS
+-- topic is @SUCCEEDED@. If so, call GetDocumentTextDetection, and pass the
+-- job identifier (@JobId@) from the initial call to
+-- @StartDocumentTextDetection@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/textract/latest/dg/how-it-works-detecting.html Document Text Detection>.
+module Amazonka.Textract.StartDocumentTextDetection
+  ( -- * Creating a Request
+    StartDocumentTextDetection (..),
+    newStartDocumentTextDetection,
+
+    -- * Request Lenses
+    startDocumentTextDetection_clientRequestToken,
+    startDocumentTextDetection_jobTag,
+    startDocumentTextDetection_kmsKeyId,
+    startDocumentTextDetection_notificationChannel,
+    startDocumentTextDetection_outputConfig,
+    startDocumentTextDetection_documentLocation,
+
+    -- * Destructuring the Response
+    StartDocumentTextDetectionResponse (..),
+    newStartDocumentTextDetectionResponse,
+
+    -- * Response Lenses
+    startDocumentTextDetectionResponse_jobId,
+    startDocumentTextDetectionResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Textract.Types
+
+-- | /See:/ 'newStartDocumentTextDetection' smart constructor.
+data StartDocumentTextDetection = StartDocumentTextDetection'
+  { -- | The idempotent token that\'s used to identify the start request. If you
+    -- use the same token with multiple @StartDocumentTextDetection@ requests,
+    -- the same @JobId@ is returned. Use @ClientRequestToken@ to prevent the
+    -- same job from being accidentally started more than once. For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/textract/latest/dg/api-async.html Calling Amazon Textract Asynchronous Operations>.
+    clientRequestToken :: Prelude.Maybe Prelude.Text,
+    -- | An identifier that you specify that\'s included in the completion
+    -- notification published to the Amazon SNS topic. For example, you can use
+    -- @JobTag@ to identify the type of document that the completion
+    -- notification corresponds to (such as a tax form or a receipt).
+    jobTag :: Prelude.Maybe Prelude.Text,
+    -- | The KMS key used to encrypt the inference results. This can be in either
+    -- Key ID or Key Alias format. When a KMS key is provided, the KMS key will
+    -- be used for server-side encryption of the objects in the customer
+    -- bucket. When this parameter is not enabled, the result will be encrypted
+    -- server side,using SSE-S3.
+    kmsKeyId :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon SNS topic ARN that you want Amazon Textract to publish the
+    -- completion status of the operation to.
+    notificationChannel :: Prelude.Maybe NotificationChannel,
+    -- | Sets if the output will go to a customer defined bucket. By default
+    -- Amazon Textract will save the results internally to be accessed with the
+    -- GetDocumentTextDetection operation.
+    outputConfig :: Prelude.Maybe OutputConfig,
+    -- | The location of the document to be processed.
+    documentLocation :: DocumentLocation
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartDocumentTextDetection' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'startDocumentTextDetection_clientRequestToken' - The idempotent token that\'s used to identify the start request. If you
+-- use the same token with multiple @StartDocumentTextDetection@ requests,
+-- the same @JobId@ is returned. Use @ClientRequestToken@ to prevent the
+-- same job from being accidentally started more than once. For more
+-- information, see
+-- <https://docs.aws.amazon.com/textract/latest/dg/api-async.html Calling Amazon Textract Asynchronous Operations>.
+--
+-- 'jobTag', 'startDocumentTextDetection_jobTag' - An identifier that you specify that\'s included in the completion
+-- notification published to the Amazon SNS topic. For example, you can use
+-- @JobTag@ to identify the type of document that the completion
+-- notification corresponds to (such as a tax form or a receipt).
+--
+-- 'kmsKeyId', 'startDocumentTextDetection_kmsKeyId' - The KMS key used to encrypt the inference results. This can be in either
+-- Key ID or Key Alias format. When a KMS key is provided, the KMS key will
+-- be used for server-side encryption of the objects in the customer
+-- bucket. When this parameter is not enabled, the result will be encrypted
+-- server side,using SSE-S3.
+--
+-- 'notificationChannel', 'startDocumentTextDetection_notificationChannel' - The Amazon SNS topic ARN that you want Amazon Textract to publish the
+-- completion status of the operation to.
+--
+-- 'outputConfig', 'startDocumentTextDetection_outputConfig' - Sets if the output will go to a customer defined bucket. By default
+-- Amazon Textract will save the results internally to be accessed with the
+-- GetDocumentTextDetection operation.
+--
+-- 'documentLocation', 'startDocumentTextDetection_documentLocation' - The location of the document to be processed.
+newStartDocumentTextDetection ::
+  -- | 'documentLocation'
+  DocumentLocation ->
+  StartDocumentTextDetection
+newStartDocumentTextDetection pDocumentLocation_ =
+  StartDocumentTextDetection'
+    { clientRequestToken =
+        Prelude.Nothing,
+      jobTag = Prelude.Nothing,
+      kmsKeyId = Prelude.Nothing,
+      notificationChannel = Prelude.Nothing,
+      outputConfig = Prelude.Nothing,
+      documentLocation = pDocumentLocation_
+    }
+
+-- | The idempotent token that\'s used to identify the start request. If you
+-- use the same token with multiple @StartDocumentTextDetection@ requests,
+-- the same @JobId@ is returned. Use @ClientRequestToken@ to prevent the
+-- same job from being accidentally started more than once. For more
+-- information, see
+-- <https://docs.aws.amazon.com/textract/latest/dg/api-async.html Calling Amazon Textract Asynchronous Operations>.
+startDocumentTextDetection_clientRequestToken :: Lens.Lens' StartDocumentTextDetection (Prelude.Maybe Prelude.Text)
+startDocumentTextDetection_clientRequestToken = Lens.lens (\StartDocumentTextDetection' {clientRequestToken} -> clientRequestToken) (\s@StartDocumentTextDetection' {} a -> s {clientRequestToken = a} :: StartDocumentTextDetection)
+
+-- | An identifier that you specify that\'s included in the completion
+-- notification published to the Amazon SNS topic. For example, you can use
+-- @JobTag@ to identify the type of document that the completion
+-- notification corresponds to (such as a tax form or a receipt).
+startDocumentTextDetection_jobTag :: Lens.Lens' StartDocumentTextDetection (Prelude.Maybe Prelude.Text)
+startDocumentTextDetection_jobTag = Lens.lens (\StartDocumentTextDetection' {jobTag} -> jobTag) (\s@StartDocumentTextDetection' {} a -> s {jobTag = a} :: StartDocumentTextDetection)
+
+-- | The KMS key used to encrypt the inference results. This can be in either
+-- Key ID or Key Alias format. When a KMS key is provided, the KMS key will
+-- be used for server-side encryption of the objects in the customer
+-- bucket. When this parameter is not enabled, the result will be encrypted
+-- server side,using SSE-S3.
+startDocumentTextDetection_kmsKeyId :: Lens.Lens' StartDocumentTextDetection (Prelude.Maybe Prelude.Text)
+startDocumentTextDetection_kmsKeyId = Lens.lens (\StartDocumentTextDetection' {kmsKeyId} -> kmsKeyId) (\s@StartDocumentTextDetection' {} a -> s {kmsKeyId = a} :: StartDocumentTextDetection)
+
+-- | The Amazon SNS topic ARN that you want Amazon Textract to publish the
+-- completion status of the operation to.
+startDocumentTextDetection_notificationChannel :: Lens.Lens' StartDocumentTextDetection (Prelude.Maybe NotificationChannel)
+startDocumentTextDetection_notificationChannel = Lens.lens (\StartDocumentTextDetection' {notificationChannel} -> notificationChannel) (\s@StartDocumentTextDetection' {} a -> s {notificationChannel = a} :: StartDocumentTextDetection)
+
+-- | Sets if the output will go to a customer defined bucket. By default
+-- Amazon Textract will save the results internally to be accessed with the
+-- GetDocumentTextDetection operation.
+startDocumentTextDetection_outputConfig :: Lens.Lens' StartDocumentTextDetection (Prelude.Maybe OutputConfig)
+startDocumentTextDetection_outputConfig = Lens.lens (\StartDocumentTextDetection' {outputConfig} -> outputConfig) (\s@StartDocumentTextDetection' {} a -> s {outputConfig = a} :: StartDocumentTextDetection)
+
+-- | The location of the document to be processed.
+startDocumentTextDetection_documentLocation :: Lens.Lens' StartDocumentTextDetection DocumentLocation
+startDocumentTextDetection_documentLocation = Lens.lens (\StartDocumentTextDetection' {documentLocation} -> documentLocation) (\s@StartDocumentTextDetection' {} a -> s {documentLocation = a} :: StartDocumentTextDetection)
+
+instance Core.AWSRequest StartDocumentTextDetection where
+  type
+    AWSResponse StartDocumentTextDetection =
+      StartDocumentTextDetectionResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          StartDocumentTextDetectionResponse'
+            Prelude.<$> (x Data..?> "JobId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable StartDocumentTextDetection where
+  hashWithSalt _salt StartDocumentTextDetection' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientRequestToken
+      `Prelude.hashWithSalt` jobTag
+      `Prelude.hashWithSalt` kmsKeyId
+      `Prelude.hashWithSalt` notificationChannel
+      `Prelude.hashWithSalt` outputConfig
+      `Prelude.hashWithSalt` documentLocation
+
+instance Prelude.NFData StartDocumentTextDetection where
+  rnf StartDocumentTextDetection' {..} =
+    Prelude.rnf clientRequestToken
+      `Prelude.seq` Prelude.rnf jobTag
+      `Prelude.seq` Prelude.rnf kmsKeyId
+      `Prelude.seq` Prelude.rnf notificationChannel
+      `Prelude.seq` Prelude.rnf outputConfig
+      `Prelude.seq` Prelude.rnf documentLocation
+
+instance Data.ToHeaders StartDocumentTextDetection where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Textract.StartDocumentTextDetection" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON StartDocumentTextDetection where
+  toJSON StartDocumentTextDetection' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ClientRequestToken" Data..=)
+              Prelude.<$> clientRequestToken,
+            ("JobTag" Data..=) Prelude.<$> jobTag,
+            ("KMSKeyId" Data..=) Prelude.<$> kmsKeyId,
+            ("NotificationChannel" Data..=)
+              Prelude.<$> notificationChannel,
+            ("OutputConfig" Data..=) Prelude.<$> outputConfig,
+            Prelude.Just
+              ("DocumentLocation" Data..= documentLocation)
+          ]
+      )
+
+instance Data.ToPath StartDocumentTextDetection where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery StartDocumentTextDetection where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newStartDocumentTextDetectionResponse' smart constructor.
+data StartDocumentTextDetectionResponse = StartDocumentTextDetectionResponse'
+  { -- | The identifier of the text detection job for the document. Use @JobId@
+    -- to identify the job in a subsequent call to @GetDocumentTextDetection@.
+    -- A @JobId@ value is only valid for 7 days.
+    jobId :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartDocumentTextDetectionResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'jobId', 'startDocumentTextDetectionResponse_jobId' - The identifier of the text detection job for the document. Use @JobId@
+-- to identify the job in a subsequent call to @GetDocumentTextDetection@.
+-- A @JobId@ value is only valid for 7 days.
+--
+-- 'httpStatus', 'startDocumentTextDetectionResponse_httpStatus' - The response's http status code.
+newStartDocumentTextDetectionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  StartDocumentTextDetectionResponse
+newStartDocumentTextDetectionResponse pHttpStatus_ =
+  StartDocumentTextDetectionResponse'
+    { jobId =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The identifier of the text detection job for the document. Use @JobId@
+-- to identify the job in a subsequent call to @GetDocumentTextDetection@.
+-- A @JobId@ value is only valid for 7 days.
+startDocumentTextDetectionResponse_jobId :: Lens.Lens' StartDocumentTextDetectionResponse (Prelude.Maybe Prelude.Text)
+startDocumentTextDetectionResponse_jobId = Lens.lens (\StartDocumentTextDetectionResponse' {jobId} -> jobId) (\s@StartDocumentTextDetectionResponse' {} a -> s {jobId = a} :: StartDocumentTextDetectionResponse)
+
+-- | The response's http status code.
+startDocumentTextDetectionResponse_httpStatus :: Lens.Lens' StartDocumentTextDetectionResponse Prelude.Int
+startDocumentTextDetectionResponse_httpStatus = Lens.lens (\StartDocumentTextDetectionResponse' {httpStatus} -> httpStatus) (\s@StartDocumentTextDetectionResponse' {} a -> s {httpStatus = a} :: StartDocumentTextDetectionResponse)
+
+instance
+  Prelude.NFData
+    StartDocumentTextDetectionResponse
+  where
+  rnf StartDocumentTextDetectionResponse' {..} =
+    Prelude.rnf jobId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Textract/StartExpenseAnalysis.hs b/gen/Amazonka/Textract/StartExpenseAnalysis.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/StartExpenseAnalysis.hs
@@ -0,0 +1,310 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Textract.StartExpenseAnalysis
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Starts the asynchronous analysis of invoices or receipts for data like
+-- contact information, items purchased, and vendor names.
+--
+-- @StartExpenseAnalysis@ can analyze text in documents that are in JPEG,
+-- PNG, and PDF format. The documents must be stored in an Amazon S3
+-- bucket. Use the DocumentLocation parameter to specify the name of your
+-- S3 bucket and the name of the document in that bucket.
+--
+-- @StartExpenseAnalysis@ returns a job identifier (@JobId@) that you will
+-- provide to @GetExpenseAnalysis@ to retrieve the results of the
+-- operation. When the analysis of the input invoices\/receipts is
+-- finished, Amazon Textract publishes a completion status to the Amazon
+-- Simple Notification Service (Amazon SNS) topic that you provide to the
+-- @NotificationChannel@. To obtain the results of the invoice and receipt
+-- analysis operation, ensure that the status value published to the Amazon
+-- SNS topic is @SUCCEEDED@. If so, call GetExpenseAnalysis, and pass the
+-- job identifier (@JobId@) that was returned by your call to
+-- @StartExpenseAnalysis@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/textract/latest/dg/invoice-receipts.html Analyzing Invoices and Receipts>.
+module Amazonka.Textract.StartExpenseAnalysis
+  ( -- * Creating a Request
+    StartExpenseAnalysis (..),
+    newStartExpenseAnalysis,
+
+    -- * Request Lenses
+    startExpenseAnalysis_clientRequestToken,
+    startExpenseAnalysis_jobTag,
+    startExpenseAnalysis_kmsKeyId,
+    startExpenseAnalysis_notificationChannel,
+    startExpenseAnalysis_outputConfig,
+    startExpenseAnalysis_documentLocation,
+
+    -- * Destructuring the Response
+    StartExpenseAnalysisResponse (..),
+    newStartExpenseAnalysisResponse,
+
+    -- * Response Lenses
+    startExpenseAnalysisResponse_jobId,
+    startExpenseAnalysisResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Textract.Types
+
+-- | /See:/ 'newStartExpenseAnalysis' smart constructor.
+data StartExpenseAnalysis = StartExpenseAnalysis'
+  { -- | The idempotent token that\'s used to identify the start request. If you
+    -- use the same token with multiple @StartDocumentTextDetection@ requests,
+    -- the same @JobId@ is returned. Use @ClientRequestToken@ to prevent the
+    -- same job from being accidentally started more than once. For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/textract/latest/dg/api-async.html Calling Amazon Textract Asynchronous Operations>
+    clientRequestToken :: Prelude.Maybe Prelude.Text,
+    -- | An identifier you specify that\'s included in the completion
+    -- notification published to the Amazon SNS topic. For example, you can use
+    -- @JobTag@ to identify the type of document that the completion
+    -- notification corresponds to (such as a tax form or a receipt).
+    jobTag :: Prelude.Maybe Prelude.Text,
+    -- | The KMS key used to encrypt the inference results. This can be in either
+    -- Key ID or Key Alias format. When a KMS key is provided, the KMS key will
+    -- be used for server-side encryption of the objects in the customer
+    -- bucket. When this parameter is not enabled, the result will be encrypted
+    -- server side,using SSE-S3.
+    kmsKeyId :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon SNS topic ARN that you want Amazon Textract to publish the
+    -- completion status of the operation to.
+    notificationChannel :: Prelude.Maybe NotificationChannel,
+    -- | Sets if the output will go to a customer defined bucket. By default,
+    -- Amazon Textract will save the results internally to be accessed by the
+    -- @GetExpenseAnalysis@ operation.
+    outputConfig :: Prelude.Maybe OutputConfig,
+    -- | The location of the document to be processed.
+    documentLocation :: DocumentLocation
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartExpenseAnalysis' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'startExpenseAnalysis_clientRequestToken' - The idempotent token that\'s used to identify the start request. If you
+-- use the same token with multiple @StartDocumentTextDetection@ requests,
+-- the same @JobId@ is returned. Use @ClientRequestToken@ to prevent the
+-- same job from being accidentally started more than once. For more
+-- information, see
+-- <https://docs.aws.amazon.com/textract/latest/dg/api-async.html Calling Amazon Textract Asynchronous Operations>
+--
+-- 'jobTag', 'startExpenseAnalysis_jobTag' - An identifier you specify that\'s included in the completion
+-- notification published to the Amazon SNS topic. For example, you can use
+-- @JobTag@ to identify the type of document that the completion
+-- notification corresponds to (such as a tax form or a receipt).
+--
+-- 'kmsKeyId', 'startExpenseAnalysis_kmsKeyId' - The KMS key used to encrypt the inference results. This can be in either
+-- Key ID or Key Alias format. When a KMS key is provided, the KMS key will
+-- be used for server-side encryption of the objects in the customer
+-- bucket. When this parameter is not enabled, the result will be encrypted
+-- server side,using SSE-S3.
+--
+-- 'notificationChannel', 'startExpenseAnalysis_notificationChannel' - The Amazon SNS topic ARN that you want Amazon Textract to publish the
+-- completion status of the operation to.
+--
+-- 'outputConfig', 'startExpenseAnalysis_outputConfig' - Sets if the output will go to a customer defined bucket. By default,
+-- Amazon Textract will save the results internally to be accessed by the
+-- @GetExpenseAnalysis@ operation.
+--
+-- 'documentLocation', 'startExpenseAnalysis_documentLocation' - The location of the document to be processed.
+newStartExpenseAnalysis ::
+  -- | 'documentLocation'
+  DocumentLocation ->
+  StartExpenseAnalysis
+newStartExpenseAnalysis pDocumentLocation_ =
+  StartExpenseAnalysis'
+    { clientRequestToken =
+        Prelude.Nothing,
+      jobTag = Prelude.Nothing,
+      kmsKeyId = Prelude.Nothing,
+      notificationChannel = Prelude.Nothing,
+      outputConfig = Prelude.Nothing,
+      documentLocation = pDocumentLocation_
+    }
+
+-- | The idempotent token that\'s used to identify the start request. If you
+-- use the same token with multiple @StartDocumentTextDetection@ requests,
+-- the same @JobId@ is returned. Use @ClientRequestToken@ to prevent the
+-- same job from being accidentally started more than once. For more
+-- information, see
+-- <https://docs.aws.amazon.com/textract/latest/dg/api-async.html Calling Amazon Textract Asynchronous Operations>
+startExpenseAnalysis_clientRequestToken :: Lens.Lens' StartExpenseAnalysis (Prelude.Maybe Prelude.Text)
+startExpenseAnalysis_clientRequestToken = Lens.lens (\StartExpenseAnalysis' {clientRequestToken} -> clientRequestToken) (\s@StartExpenseAnalysis' {} a -> s {clientRequestToken = a} :: StartExpenseAnalysis)
+
+-- | An identifier you specify that\'s included in the completion
+-- notification published to the Amazon SNS topic. For example, you can use
+-- @JobTag@ to identify the type of document that the completion
+-- notification corresponds to (such as a tax form or a receipt).
+startExpenseAnalysis_jobTag :: Lens.Lens' StartExpenseAnalysis (Prelude.Maybe Prelude.Text)
+startExpenseAnalysis_jobTag = Lens.lens (\StartExpenseAnalysis' {jobTag} -> jobTag) (\s@StartExpenseAnalysis' {} a -> s {jobTag = a} :: StartExpenseAnalysis)
+
+-- | The KMS key used to encrypt the inference results. This can be in either
+-- Key ID or Key Alias format. When a KMS key is provided, the KMS key will
+-- be used for server-side encryption of the objects in the customer
+-- bucket. When this parameter is not enabled, the result will be encrypted
+-- server side,using SSE-S3.
+startExpenseAnalysis_kmsKeyId :: Lens.Lens' StartExpenseAnalysis (Prelude.Maybe Prelude.Text)
+startExpenseAnalysis_kmsKeyId = Lens.lens (\StartExpenseAnalysis' {kmsKeyId} -> kmsKeyId) (\s@StartExpenseAnalysis' {} a -> s {kmsKeyId = a} :: StartExpenseAnalysis)
+
+-- | The Amazon SNS topic ARN that you want Amazon Textract to publish the
+-- completion status of the operation to.
+startExpenseAnalysis_notificationChannel :: Lens.Lens' StartExpenseAnalysis (Prelude.Maybe NotificationChannel)
+startExpenseAnalysis_notificationChannel = Lens.lens (\StartExpenseAnalysis' {notificationChannel} -> notificationChannel) (\s@StartExpenseAnalysis' {} a -> s {notificationChannel = a} :: StartExpenseAnalysis)
+
+-- | Sets if the output will go to a customer defined bucket. By default,
+-- Amazon Textract will save the results internally to be accessed by the
+-- @GetExpenseAnalysis@ operation.
+startExpenseAnalysis_outputConfig :: Lens.Lens' StartExpenseAnalysis (Prelude.Maybe OutputConfig)
+startExpenseAnalysis_outputConfig = Lens.lens (\StartExpenseAnalysis' {outputConfig} -> outputConfig) (\s@StartExpenseAnalysis' {} a -> s {outputConfig = a} :: StartExpenseAnalysis)
+
+-- | The location of the document to be processed.
+startExpenseAnalysis_documentLocation :: Lens.Lens' StartExpenseAnalysis DocumentLocation
+startExpenseAnalysis_documentLocation = Lens.lens (\StartExpenseAnalysis' {documentLocation} -> documentLocation) (\s@StartExpenseAnalysis' {} a -> s {documentLocation = a} :: StartExpenseAnalysis)
+
+instance Core.AWSRequest StartExpenseAnalysis where
+  type
+    AWSResponse StartExpenseAnalysis =
+      StartExpenseAnalysisResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          StartExpenseAnalysisResponse'
+            Prelude.<$> (x Data..?> "JobId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable StartExpenseAnalysis where
+  hashWithSalt _salt StartExpenseAnalysis' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientRequestToken
+      `Prelude.hashWithSalt` jobTag
+      `Prelude.hashWithSalt` kmsKeyId
+      `Prelude.hashWithSalt` notificationChannel
+      `Prelude.hashWithSalt` outputConfig
+      `Prelude.hashWithSalt` documentLocation
+
+instance Prelude.NFData StartExpenseAnalysis where
+  rnf StartExpenseAnalysis' {..} =
+    Prelude.rnf clientRequestToken
+      `Prelude.seq` Prelude.rnf jobTag
+      `Prelude.seq` Prelude.rnf kmsKeyId
+      `Prelude.seq` Prelude.rnf notificationChannel
+      `Prelude.seq` Prelude.rnf outputConfig
+      `Prelude.seq` Prelude.rnf documentLocation
+
+instance Data.ToHeaders StartExpenseAnalysis where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Textract.StartExpenseAnalysis" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON StartExpenseAnalysis where
+  toJSON StartExpenseAnalysis' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ClientRequestToken" Data..=)
+              Prelude.<$> clientRequestToken,
+            ("JobTag" Data..=) Prelude.<$> jobTag,
+            ("KMSKeyId" Data..=) Prelude.<$> kmsKeyId,
+            ("NotificationChannel" Data..=)
+              Prelude.<$> notificationChannel,
+            ("OutputConfig" Data..=) Prelude.<$> outputConfig,
+            Prelude.Just
+              ("DocumentLocation" Data..= documentLocation)
+          ]
+      )
+
+instance Data.ToPath StartExpenseAnalysis where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery StartExpenseAnalysis where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newStartExpenseAnalysisResponse' smart constructor.
+data StartExpenseAnalysisResponse = StartExpenseAnalysisResponse'
+  { -- | A unique identifier for the text detection job. The @JobId@ is returned
+    -- from @StartExpenseAnalysis@. A @JobId@ value is only valid for 7 days.
+    jobId :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartExpenseAnalysisResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'jobId', 'startExpenseAnalysisResponse_jobId' - A unique identifier for the text detection job. The @JobId@ is returned
+-- from @StartExpenseAnalysis@. A @JobId@ value is only valid for 7 days.
+--
+-- 'httpStatus', 'startExpenseAnalysisResponse_httpStatus' - The response's http status code.
+newStartExpenseAnalysisResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  StartExpenseAnalysisResponse
+newStartExpenseAnalysisResponse pHttpStatus_ =
+  StartExpenseAnalysisResponse'
+    { jobId =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A unique identifier for the text detection job. The @JobId@ is returned
+-- from @StartExpenseAnalysis@. A @JobId@ value is only valid for 7 days.
+startExpenseAnalysisResponse_jobId :: Lens.Lens' StartExpenseAnalysisResponse (Prelude.Maybe Prelude.Text)
+startExpenseAnalysisResponse_jobId = Lens.lens (\StartExpenseAnalysisResponse' {jobId} -> jobId) (\s@StartExpenseAnalysisResponse' {} a -> s {jobId = a} :: StartExpenseAnalysisResponse)
+
+-- | The response's http status code.
+startExpenseAnalysisResponse_httpStatus :: Lens.Lens' StartExpenseAnalysisResponse Prelude.Int
+startExpenseAnalysisResponse_httpStatus = Lens.lens (\StartExpenseAnalysisResponse' {httpStatus} -> httpStatus) (\s@StartExpenseAnalysisResponse' {} a -> s {httpStatus = a} :: StartExpenseAnalysisResponse)
+
+instance Prelude.NFData StartExpenseAnalysisResponse where
+  rnf StartExpenseAnalysisResponse' {..} =
+    Prelude.rnf jobId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Textract/StartLendingAnalysis.hs b/gen/Amazonka/Textract/StartLendingAnalysis.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/StartLendingAnalysis.hs
@@ -0,0 +1,308 @@
+{-# 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.Textract.StartLendingAnalysis
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Starts the classification and analysis of an input document.
+-- @StartLendingAnalysis@ initiates the classification and analysis of a
+-- packet of lending documents. @StartLendingAnalysis@ operates on a
+-- document file located in an Amazon S3 bucket.
+--
+-- @StartLendingAnalysis@ can analyze text in documents that are in one of
+-- the following formats: JPEG, PNG, TIFF, PDF. Use @DocumentLocation@ to
+-- specify the bucket name and the file name of the document.
+--
+-- @StartLendingAnalysis@ returns a job identifier (@JobId@) that you use
+-- to get the results of the operation. When the text analysis is finished,
+-- Amazon Textract publishes a completion status to the Amazon Simple
+-- Notification Service (Amazon SNS) topic that you specify in
+-- @NotificationChannel@. To get the results of the text analysis
+-- operation, first check that the status value published to the Amazon SNS
+-- topic is SUCCEEDED. If the status is SUCCEEDED you can call either
+-- @GetLendingAnalysis@ or @GetLendingAnalysisSummary@ and provide the
+-- @JobId@ to obtain the results of the analysis.
+--
+-- If using @OutputConfig@ to specify an Amazon S3 bucket, the output will
+-- be contained within the specified prefix in a directory labeled with the
+-- job-id. In the directory there are 3 sub-directories:
+--
+-- -   detailedResponse (contains the GetLendingAnalysis response)
+--
+-- -   summaryResponse (for the GetLendingAnalysisSummary response)
+--
+-- -   splitDocuments (documents split across logical boundaries)
+module Amazonka.Textract.StartLendingAnalysis
+  ( -- * Creating a Request
+    StartLendingAnalysis (..),
+    newStartLendingAnalysis,
+
+    -- * Request Lenses
+    startLendingAnalysis_clientRequestToken,
+    startLendingAnalysis_jobTag,
+    startLendingAnalysis_kmsKeyId,
+    startLendingAnalysis_notificationChannel,
+    startLendingAnalysis_outputConfig,
+    startLendingAnalysis_documentLocation,
+
+    -- * Destructuring the Response
+    StartLendingAnalysisResponse (..),
+    newStartLendingAnalysisResponse,
+
+    -- * Response Lenses
+    startLendingAnalysisResponse_jobId,
+    startLendingAnalysisResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Textract.Types
+
+-- | /See:/ 'newStartLendingAnalysis' smart constructor.
+data StartLendingAnalysis = StartLendingAnalysis'
+  { -- | The idempotent token that you use to identify the start request. If you
+    -- use the same token with multiple @StartLendingAnalysis@ requests, the
+    -- same @JobId@ is returned. Use @ClientRequestToken@ to prevent the same
+    -- job from being accidentally started more than once. For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/textract/latest/dg/api-sync.html Calling Amazon Textract Asynchronous Operations>.
+    clientRequestToken :: Prelude.Maybe Prelude.Text,
+    -- | An identifier that you specify to be included in the completion
+    -- notification published to the Amazon SNS topic. For example, you can use
+    -- @JobTag@ to identify the type of document that the completion
+    -- notification corresponds to (such as a tax form or a receipt).
+    jobTag :: Prelude.Maybe Prelude.Text,
+    -- | The KMS key used to encrypt the inference results. This can be in either
+    -- Key ID or Key Alias format. When a KMS key is provided, the KMS key will
+    -- be used for server-side encryption of the objects in the customer
+    -- bucket. When this parameter is not enabled, the result will be encrypted
+    -- server side, using SSE-S3.
+    kmsKeyId :: Prelude.Maybe Prelude.Text,
+    notificationChannel :: Prelude.Maybe NotificationChannel,
+    outputConfig :: Prelude.Maybe OutputConfig,
+    documentLocation :: DocumentLocation
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartLendingAnalysis' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'startLendingAnalysis_clientRequestToken' - The idempotent token that you use to identify the start request. If you
+-- use the same token with multiple @StartLendingAnalysis@ requests, the
+-- same @JobId@ is returned. Use @ClientRequestToken@ to prevent the same
+-- job from being accidentally started more than once. For more
+-- information, see
+-- <https://docs.aws.amazon.com/textract/latest/dg/api-sync.html Calling Amazon Textract Asynchronous Operations>.
+--
+-- 'jobTag', 'startLendingAnalysis_jobTag' - An identifier that you specify to be included in the completion
+-- notification published to the Amazon SNS topic. For example, you can use
+-- @JobTag@ to identify the type of document that the completion
+-- notification corresponds to (such as a tax form or a receipt).
+--
+-- 'kmsKeyId', 'startLendingAnalysis_kmsKeyId' - The KMS key used to encrypt the inference results. This can be in either
+-- Key ID or Key Alias format. When a KMS key is provided, the KMS key will
+-- be used for server-side encryption of the objects in the customer
+-- bucket. When this parameter is not enabled, the result will be encrypted
+-- server side, using SSE-S3.
+--
+-- 'notificationChannel', 'startLendingAnalysis_notificationChannel' - Undocumented member.
+--
+-- 'outputConfig', 'startLendingAnalysis_outputConfig' - Undocumented member.
+--
+-- 'documentLocation', 'startLendingAnalysis_documentLocation' - Undocumented member.
+newStartLendingAnalysis ::
+  -- | 'documentLocation'
+  DocumentLocation ->
+  StartLendingAnalysis
+newStartLendingAnalysis pDocumentLocation_ =
+  StartLendingAnalysis'
+    { clientRequestToken =
+        Prelude.Nothing,
+      jobTag = Prelude.Nothing,
+      kmsKeyId = Prelude.Nothing,
+      notificationChannel = Prelude.Nothing,
+      outputConfig = Prelude.Nothing,
+      documentLocation = pDocumentLocation_
+    }
+
+-- | The idempotent token that you use to identify the start request. If you
+-- use the same token with multiple @StartLendingAnalysis@ requests, the
+-- same @JobId@ is returned. Use @ClientRequestToken@ to prevent the same
+-- job from being accidentally started more than once. For more
+-- information, see
+-- <https://docs.aws.amazon.com/textract/latest/dg/api-sync.html Calling Amazon Textract Asynchronous Operations>.
+startLendingAnalysis_clientRequestToken :: Lens.Lens' StartLendingAnalysis (Prelude.Maybe Prelude.Text)
+startLendingAnalysis_clientRequestToken = Lens.lens (\StartLendingAnalysis' {clientRequestToken} -> clientRequestToken) (\s@StartLendingAnalysis' {} a -> s {clientRequestToken = a} :: StartLendingAnalysis)
+
+-- | An identifier that you specify to be included in the completion
+-- notification published to the Amazon SNS topic. For example, you can use
+-- @JobTag@ to identify the type of document that the completion
+-- notification corresponds to (such as a tax form or a receipt).
+startLendingAnalysis_jobTag :: Lens.Lens' StartLendingAnalysis (Prelude.Maybe Prelude.Text)
+startLendingAnalysis_jobTag = Lens.lens (\StartLendingAnalysis' {jobTag} -> jobTag) (\s@StartLendingAnalysis' {} a -> s {jobTag = a} :: StartLendingAnalysis)
+
+-- | The KMS key used to encrypt the inference results. This can be in either
+-- Key ID or Key Alias format. When a KMS key is provided, the KMS key will
+-- be used for server-side encryption of the objects in the customer
+-- bucket. When this parameter is not enabled, the result will be encrypted
+-- server side, using SSE-S3.
+startLendingAnalysis_kmsKeyId :: Lens.Lens' StartLendingAnalysis (Prelude.Maybe Prelude.Text)
+startLendingAnalysis_kmsKeyId = Lens.lens (\StartLendingAnalysis' {kmsKeyId} -> kmsKeyId) (\s@StartLendingAnalysis' {} a -> s {kmsKeyId = a} :: StartLendingAnalysis)
+
+-- | Undocumented member.
+startLendingAnalysis_notificationChannel :: Lens.Lens' StartLendingAnalysis (Prelude.Maybe NotificationChannel)
+startLendingAnalysis_notificationChannel = Lens.lens (\StartLendingAnalysis' {notificationChannel} -> notificationChannel) (\s@StartLendingAnalysis' {} a -> s {notificationChannel = a} :: StartLendingAnalysis)
+
+-- | Undocumented member.
+startLendingAnalysis_outputConfig :: Lens.Lens' StartLendingAnalysis (Prelude.Maybe OutputConfig)
+startLendingAnalysis_outputConfig = Lens.lens (\StartLendingAnalysis' {outputConfig} -> outputConfig) (\s@StartLendingAnalysis' {} a -> s {outputConfig = a} :: StartLendingAnalysis)
+
+-- | Undocumented member.
+startLendingAnalysis_documentLocation :: Lens.Lens' StartLendingAnalysis DocumentLocation
+startLendingAnalysis_documentLocation = Lens.lens (\StartLendingAnalysis' {documentLocation} -> documentLocation) (\s@StartLendingAnalysis' {} a -> s {documentLocation = a} :: StartLendingAnalysis)
+
+instance Core.AWSRequest StartLendingAnalysis where
+  type
+    AWSResponse StartLendingAnalysis =
+      StartLendingAnalysisResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          StartLendingAnalysisResponse'
+            Prelude.<$> (x Data..?> "JobId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable StartLendingAnalysis where
+  hashWithSalt _salt StartLendingAnalysis' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientRequestToken
+      `Prelude.hashWithSalt` jobTag
+      `Prelude.hashWithSalt` kmsKeyId
+      `Prelude.hashWithSalt` notificationChannel
+      `Prelude.hashWithSalt` outputConfig
+      `Prelude.hashWithSalt` documentLocation
+
+instance Prelude.NFData StartLendingAnalysis where
+  rnf StartLendingAnalysis' {..} =
+    Prelude.rnf clientRequestToken
+      `Prelude.seq` Prelude.rnf jobTag
+      `Prelude.seq` Prelude.rnf kmsKeyId
+      `Prelude.seq` Prelude.rnf notificationChannel
+      `Prelude.seq` Prelude.rnf outputConfig
+      `Prelude.seq` Prelude.rnf documentLocation
+
+instance Data.ToHeaders StartLendingAnalysis where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Textract.StartLendingAnalysis" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON StartLendingAnalysis where
+  toJSON StartLendingAnalysis' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ClientRequestToken" Data..=)
+              Prelude.<$> clientRequestToken,
+            ("JobTag" Data..=) Prelude.<$> jobTag,
+            ("KMSKeyId" Data..=) Prelude.<$> kmsKeyId,
+            ("NotificationChannel" Data..=)
+              Prelude.<$> notificationChannel,
+            ("OutputConfig" Data..=) Prelude.<$> outputConfig,
+            Prelude.Just
+              ("DocumentLocation" Data..= documentLocation)
+          ]
+      )
+
+instance Data.ToPath StartLendingAnalysis where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery StartLendingAnalysis where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newStartLendingAnalysisResponse' smart constructor.
+data StartLendingAnalysisResponse = StartLendingAnalysisResponse'
+  { -- | A unique identifier for the lending or text-detection job. The @JobId@
+    -- is returned from @StartLendingAnalysis@. A @JobId@ value is only valid
+    -- for 7 days.
+    jobId :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartLendingAnalysisResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'jobId', 'startLendingAnalysisResponse_jobId' - A unique identifier for the lending or text-detection job. The @JobId@
+-- is returned from @StartLendingAnalysis@. A @JobId@ value is only valid
+-- for 7 days.
+--
+-- 'httpStatus', 'startLendingAnalysisResponse_httpStatus' - The response's http status code.
+newStartLendingAnalysisResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  StartLendingAnalysisResponse
+newStartLendingAnalysisResponse pHttpStatus_ =
+  StartLendingAnalysisResponse'
+    { jobId =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A unique identifier for the lending or text-detection job. The @JobId@
+-- is returned from @StartLendingAnalysis@. A @JobId@ value is only valid
+-- for 7 days.
+startLendingAnalysisResponse_jobId :: Lens.Lens' StartLendingAnalysisResponse (Prelude.Maybe Prelude.Text)
+startLendingAnalysisResponse_jobId = Lens.lens (\StartLendingAnalysisResponse' {jobId} -> jobId) (\s@StartLendingAnalysisResponse' {} a -> s {jobId = a} :: StartLendingAnalysisResponse)
+
+-- | The response's http status code.
+startLendingAnalysisResponse_httpStatus :: Lens.Lens' StartLendingAnalysisResponse Prelude.Int
+startLendingAnalysisResponse_httpStatus = Lens.lens (\StartLendingAnalysisResponse' {httpStatus} -> httpStatus) (\s@StartLendingAnalysisResponse' {} a -> s {httpStatus = a} :: StartLendingAnalysisResponse)
+
+instance Prelude.NFData StartLendingAnalysisResponse where
+  rnf StartLendingAnalysisResponse' {..} =
+    Prelude.rnf jobId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Textract/Types.hs b/gen/Amazonka/Textract/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types.hs
@@ -0,0 +1,592 @@
+{-# 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.Textract.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.Textract.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _AccessDeniedException,
+    _BadDocumentException,
+    _DocumentTooLargeException,
+    _HumanLoopQuotaExceededException,
+    _IdempotentParameterMismatchException,
+    _InternalServerError,
+    _InvalidJobIdException,
+    _InvalidKMSKeyException,
+    _InvalidParameterException,
+    _InvalidS3ObjectException,
+    _LimitExceededException,
+    _ProvisionedThroughputExceededException,
+    _ThrottlingException,
+    _UnsupportedDocumentException,
+
+    -- * BlockType
+    BlockType (..),
+
+    -- * ContentClassifier
+    ContentClassifier (..),
+
+    -- * EntityType
+    EntityType (..),
+
+    -- * FeatureType
+    FeatureType (..),
+
+    -- * JobStatus
+    JobStatus (..),
+
+    -- * RelationshipType
+    RelationshipType (..),
+
+    -- * SelectionStatus
+    SelectionStatus (..),
+
+    -- * TextType
+    TextType (..),
+
+    -- * ValueType
+    ValueType (..),
+
+    -- * AnalyzeIDDetections
+    AnalyzeIDDetections (..),
+    newAnalyzeIDDetections,
+    analyzeIDDetections_confidence,
+    analyzeIDDetections_normalizedValue,
+    analyzeIDDetections_text,
+
+    -- * Block
+    Block (..),
+    newBlock,
+    block_blockType,
+    block_columnIndex,
+    block_columnSpan,
+    block_confidence,
+    block_entityTypes,
+    block_geometry,
+    block_id,
+    block_page,
+    block_query,
+    block_relationships,
+    block_rowIndex,
+    block_rowSpan,
+    block_selectionStatus,
+    block_text,
+    block_textType,
+
+    -- * BoundingBox
+    BoundingBox (..),
+    newBoundingBox,
+    boundingBox_height,
+    boundingBox_left,
+    boundingBox_top,
+    boundingBox_width,
+
+    -- * DetectedSignature
+    DetectedSignature (..),
+    newDetectedSignature,
+    detectedSignature_page,
+
+    -- * Document
+    Document (..),
+    newDocument,
+    document_bytes,
+    document_s3Object,
+
+    -- * DocumentGroup
+    DocumentGroup (..),
+    newDocumentGroup,
+    documentGroup_detectedSignatures,
+    documentGroup_splitDocuments,
+    documentGroup_type,
+    documentGroup_undetectedSignatures,
+
+    -- * DocumentLocation
+    DocumentLocation (..),
+    newDocumentLocation,
+    documentLocation_s3Object,
+
+    -- * DocumentMetadata
+    DocumentMetadata (..),
+    newDocumentMetadata,
+    documentMetadata_pages,
+
+    -- * ExpenseCurrency
+    ExpenseCurrency (..),
+    newExpenseCurrency,
+    expenseCurrency_code,
+    expenseCurrency_confidence,
+
+    -- * ExpenseDetection
+    ExpenseDetection (..),
+    newExpenseDetection,
+    expenseDetection_confidence,
+    expenseDetection_geometry,
+    expenseDetection_text,
+
+    -- * ExpenseDocument
+    ExpenseDocument (..),
+    newExpenseDocument,
+    expenseDocument_blocks,
+    expenseDocument_expenseIndex,
+    expenseDocument_lineItemGroups,
+    expenseDocument_summaryFields,
+
+    -- * ExpenseField
+    ExpenseField (..),
+    newExpenseField,
+    expenseField_currency,
+    expenseField_groupProperties,
+    expenseField_labelDetection,
+    expenseField_pageNumber,
+    expenseField_type,
+    expenseField_valueDetection,
+
+    -- * ExpenseGroupProperty
+    ExpenseGroupProperty (..),
+    newExpenseGroupProperty,
+    expenseGroupProperty_id,
+    expenseGroupProperty_types,
+
+    -- * ExpenseType
+    ExpenseType (..),
+    newExpenseType,
+    expenseType_confidence,
+    expenseType_text,
+
+    -- * Extraction
+    Extraction (..),
+    newExtraction,
+    extraction_expenseDocument,
+    extraction_identityDocument,
+    extraction_lendingDocument,
+
+    -- * Geometry
+    Geometry (..),
+    newGeometry,
+    geometry_boundingBox,
+    geometry_polygon,
+
+    -- * HumanLoopActivationOutput
+    HumanLoopActivationOutput (..),
+    newHumanLoopActivationOutput,
+    humanLoopActivationOutput_humanLoopActivationConditionsEvaluationResults,
+    humanLoopActivationOutput_humanLoopActivationReasons,
+    humanLoopActivationOutput_humanLoopArn,
+
+    -- * HumanLoopConfig
+    HumanLoopConfig (..),
+    newHumanLoopConfig,
+    humanLoopConfig_dataAttributes,
+    humanLoopConfig_humanLoopName,
+    humanLoopConfig_flowDefinitionArn,
+
+    -- * HumanLoopDataAttributes
+    HumanLoopDataAttributes (..),
+    newHumanLoopDataAttributes,
+    humanLoopDataAttributes_contentClassifiers,
+
+    -- * IdentityDocument
+    IdentityDocument (..),
+    newIdentityDocument,
+    identityDocument_blocks,
+    identityDocument_documentIndex,
+    identityDocument_identityDocumentFields,
+
+    -- * IdentityDocumentField
+    IdentityDocumentField (..),
+    newIdentityDocumentField,
+    identityDocumentField_type,
+    identityDocumentField_valueDetection,
+
+    -- * LendingDetection
+    LendingDetection (..),
+    newLendingDetection,
+    lendingDetection_confidence,
+    lendingDetection_geometry,
+    lendingDetection_selectionStatus,
+    lendingDetection_text,
+
+    -- * LendingDocument
+    LendingDocument (..),
+    newLendingDocument,
+    lendingDocument_lendingFields,
+    lendingDocument_signatureDetections,
+
+    -- * LendingField
+    LendingField (..),
+    newLendingField,
+    lendingField_keyDetection,
+    lendingField_type,
+    lendingField_valueDetections,
+
+    -- * LendingResult
+    LendingResult (..),
+    newLendingResult,
+    lendingResult_extractions,
+    lendingResult_page,
+    lendingResult_pageClassification,
+
+    -- * LendingSummary
+    LendingSummary (..),
+    newLendingSummary,
+    lendingSummary_documentGroups,
+    lendingSummary_undetectedDocumentTypes,
+
+    -- * LineItemFields
+    LineItemFields (..),
+    newLineItemFields,
+    lineItemFields_lineItemExpenseFields,
+
+    -- * LineItemGroup
+    LineItemGroup (..),
+    newLineItemGroup,
+    lineItemGroup_lineItemGroupIndex,
+    lineItemGroup_lineItems,
+
+    -- * NormalizedValue
+    NormalizedValue (..),
+    newNormalizedValue,
+    normalizedValue_value,
+    normalizedValue_valueType,
+
+    -- * NotificationChannel
+    NotificationChannel (..),
+    newNotificationChannel,
+    notificationChannel_sNSTopicArn,
+    notificationChannel_roleArn,
+
+    -- * OutputConfig
+    OutputConfig (..),
+    newOutputConfig,
+    outputConfig_s3Prefix,
+    outputConfig_s3Bucket,
+
+    -- * PageClassification
+    PageClassification (..),
+    newPageClassification,
+    pageClassification_pageType,
+    pageClassification_pageNumber,
+
+    -- * Point
+    Point (..),
+    newPoint,
+    point_x,
+    point_y,
+
+    -- * Prediction
+    Prediction (..),
+    newPrediction,
+    prediction_confidence,
+    prediction_value,
+
+    -- * QueriesConfig
+    QueriesConfig (..),
+    newQueriesConfig,
+    queriesConfig_queries,
+
+    -- * Query
+    Query (..),
+    newQuery,
+    query_alias,
+    query_pages,
+    query_text,
+
+    -- * Relationship
+    Relationship (..),
+    newRelationship,
+    relationship_ids,
+    relationship_type,
+
+    -- * S3Object
+    S3Object (..),
+    newS3Object,
+    s3Object_bucket,
+    s3Object_name,
+    s3Object_version,
+
+    -- * SignatureDetection
+    SignatureDetection (..),
+    newSignatureDetection,
+    signatureDetection_confidence,
+    signatureDetection_geometry,
+
+    -- * SplitDocument
+    SplitDocument (..),
+    newSplitDocument,
+    splitDocument_index,
+    splitDocument_pages,
+
+    -- * UndetectedSignature
+    UndetectedSignature (..),
+    newUndetectedSignature,
+    undetectedSignature_page,
+
+    -- * Warning
+    Warning (..),
+    newWarning,
+    warning_errorCode,
+    warning_pages,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+import Amazonka.Textract.Types.AnalyzeIDDetections
+import Amazonka.Textract.Types.Block
+import Amazonka.Textract.Types.BlockType
+import Amazonka.Textract.Types.BoundingBox
+import Amazonka.Textract.Types.ContentClassifier
+import Amazonka.Textract.Types.DetectedSignature
+import Amazonka.Textract.Types.Document
+import Amazonka.Textract.Types.DocumentGroup
+import Amazonka.Textract.Types.DocumentLocation
+import Amazonka.Textract.Types.DocumentMetadata
+import Amazonka.Textract.Types.EntityType
+import Amazonka.Textract.Types.ExpenseCurrency
+import Amazonka.Textract.Types.ExpenseDetection
+import Amazonka.Textract.Types.ExpenseDocument
+import Amazonka.Textract.Types.ExpenseField
+import Amazonka.Textract.Types.ExpenseGroupProperty
+import Amazonka.Textract.Types.ExpenseType
+import Amazonka.Textract.Types.Extraction
+import Amazonka.Textract.Types.FeatureType
+import Amazonka.Textract.Types.Geometry
+import Amazonka.Textract.Types.HumanLoopActivationOutput
+import Amazonka.Textract.Types.HumanLoopConfig
+import Amazonka.Textract.Types.HumanLoopDataAttributes
+import Amazonka.Textract.Types.IdentityDocument
+import Amazonka.Textract.Types.IdentityDocumentField
+import Amazonka.Textract.Types.JobStatus
+import Amazonka.Textract.Types.LendingDetection
+import Amazonka.Textract.Types.LendingDocument
+import Amazonka.Textract.Types.LendingField
+import Amazonka.Textract.Types.LendingResult
+import Amazonka.Textract.Types.LendingSummary
+import Amazonka.Textract.Types.LineItemFields
+import Amazonka.Textract.Types.LineItemGroup
+import Amazonka.Textract.Types.NormalizedValue
+import Amazonka.Textract.Types.NotificationChannel
+import Amazonka.Textract.Types.OutputConfig
+import Amazonka.Textract.Types.PageClassification
+import Amazonka.Textract.Types.Point
+import Amazonka.Textract.Types.Prediction
+import Amazonka.Textract.Types.QueriesConfig
+import Amazonka.Textract.Types.Query
+import Amazonka.Textract.Types.Relationship
+import Amazonka.Textract.Types.RelationshipType
+import Amazonka.Textract.Types.S3Object
+import Amazonka.Textract.Types.SelectionStatus
+import Amazonka.Textract.Types.SignatureDetection
+import Amazonka.Textract.Types.SplitDocument
+import Amazonka.Textract.Types.TextType
+import Amazonka.Textract.Types.UndetectedSignature
+import Amazonka.Textract.Types.ValueType
+import Amazonka.Textract.Types.Warning
+
+-- | API version @2018-06-27@ of the Amazon Textract SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "Textract",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "textract",
+      Core.signingName = "textract",
+      Core.version = "2018-06-27",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "Textract",
+      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 aren\'t authorized to perform the action. Use the Amazon Resource
+-- Name (ARN) of an authorized user or IAM role to perform the operation.
+_AccessDeniedException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_AccessDeniedException =
+  Core._MatchServiceError
+    defaultService
+    "AccessDeniedException"
+
+-- | Amazon Textract isn\'t able to read the document. For more information
+-- on the document limits in Amazon Textract, see limits.
+_BadDocumentException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_BadDocumentException =
+  Core._MatchServiceError
+    defaultService
+    "BadDocumentException"
+
+-- | The document can\'t be processed because it\'s too large. The maximum
+-- document size for synchronous operations 10 MB. The maximum document
+-- size for asynchronous operations is 500 MB for PDF files.
+_DocumentTooLargeException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_DocumentTooLargeException =
+  Core._MatchServiceError
+    defaultService
+    "DocumentTooLargeException"
+
+-- | Indicates you have exceeded the maximum number of active human in the
+-- loop workflows available
+_HumanLoopQuotaExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_HumanLoopQuotaExceededException =
+  Core._MatchServiceError
+    defaultService
+    "HumanLoopQuotaExceededException"
+
+-- | A @ClientRequestToken@ input parameter was reused with an operation, but
+-- at least one of the other input parameters is different from the
+-- previous call to the operation.
+_IdempotentParameterMismatchException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_IdempotentParameterMismatchException =
+  Core._MatchServiceError
+    defaultService
+    "IdempotentParameterMismatchException"
+
+-- | Amazon Textract experienced a service issue. Try your call again.
+_InternalServerError :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalServerError =
+  Core._MatchServiceError
+    defaultService
+    "InternalServerError"
+
+-- | An invalid job identifier was passed to an asynchronous analysis
+-- operation.
+_InvalidJobIdException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidJobIdException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidJobIdException"
+
+-- | Indicates you do not have decrypt permissions with the KMS key entered,
+-- or the KMS key was entered incorrectly.
+_InvalidKMSKeyException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidKMSKeyException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidKMSKeyException"
+
+-- | An input parameter violated a constraint. For example, in synchronous
+-- operations, an @InvalidParameterException@ exception occurs when neither
+-- of the @S3Object@ or @Bytes@ values are supplied in the @Document@
+-- request parameter. Validate your parameter before calling the API
+-- operation again.
+_InvalidParameterException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidParameterException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidParameterException"
+
+-- | Amazon Textract is unable to access the S3 object that\'s specified in
+-- the request. for more information,
+-- <https://docs.aws.amazon.com/AmazonS3/latest/dev/s3-access-control.html Configure Access to Amazon S3>
+-- For troubleshooting information, see
+-- <https://docs.aws.amazon.com/AmazonS3/latest/dev/troubleshooting.html Troubleshooting Amazon S3>
+_InvalidS3ObjectException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidS3ObjectException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidS3ObjectException"
+
+-- | An Amazon Textract service limit was exceeded. For example, if you start
+-- too many asynchronous jobs concurrently, calls to start operations
+-- (@StartDocumentTextDetection@, for example) raise a
+-- LimitExceededException exception (HTTP status code: 400) until the
+-- number of concurrently running jobs is below the Amazon Textract service
+-- limit.
+_LimitExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_LimitExceededException =
+  Core._MatchServiceError
+    defaultService
+    "LimitExceededException"
+
+-- | The number of requests exceeded your throughput limit. If you want to
+-- increase this limit, contact Amazon Textract.
+_ProvisionedThroughputExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ProvisionedThroughputExceededException =
+  Core._MatchServiceError
+    defaultService
+    "ProvisionedThroughputExceededException"
+
+-- | Amazon Textract is temporarily unable to process the request. Try your
+-- call again.
+_ThrottlingException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ThrottlingException =
+  Core._MatchServiceError
+    defaultService
+    "ThrottlingException"
+
+-- | The format of the input document isn\'t supported. Documents for
+-- operations can be in PNG, JPEG, PDF, or TIFF format.
+_UnsupportedDocumentException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_UnsupportedDocumentException =
+  Core._MatchServiceError
+    defaultService
+    "UnsupportedDocumentException"
diff --git a/gen/Amazonka/Textract/Types/AnalyzeIDDetections.hs b/gen/Amazonka/Textract/Types/AnalyzeIDDetections.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/AnalyzeIDDetections.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.Textract.Types.AnalyzeIDDetections
+-- 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.Textract.Types.AnalyzeIDDetections where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Types.NormalizedValue
+
+-- | Used to contain the information detected by an AnalyzeID operation.
+--
+-- /See:/ 'newAnalyzeIDDetections' smart constructor.
+data AnalyzeIDDetections = AnalyzeIDDetections'
+  { -- | The confidence score of the detected text.
+    confidence :: Prelude.Maybe Prelude.Double,
+    -- | Only returned for dates, returns the type of value detected and the date
+    -- written in a more machine readable way.
+    normalizedValue :: Prelude.Maybe NormalizedValue,
+    -- | Text of either the normalized field or value associated with it.
+    text :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AnalyzeIDDetections' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'confidence', 'analyzeIDDetections_confidence' - The confidence score of the detected text.
+--
+-- 'normalizedValue', 'analyzeIDDetections_normalizedValue' - Only returned for dates, returns the type of value detected and the date
+-- written in a more machine readable way.
+--
+-- 'text', 'analyzeIDDetections_text' - Text of either the normalized field or value associated with it.
+newAnalyzeIDDetections ::
+  -- | 'text'
+  Prelude.Text ->
+  AnalyzeIDDetections
+newAnalyzeIDDetections pText_ =
+  AnalyzeIDDetections'
+    { confidence = Prelude.Nothing,
+      normalizedValue = Prelude.Nothing,
+      text = pText_
+    }
+
+-- | The confidence score of the detected text.
+analyzeIDDetections_confidence :: Lens.Lens' AnalyzeIDDetections (Prelude.Maybe Prelude.Double)
+analyzeIDDetections_confidence = Lens.lens (\AnalyzeIDDetections' {confidence} -> confidence) (\s@AnalyzeIDDetections' {} a -> s {confidence = a} :: AnalyzeIDDetections)
+
+-- | Only returned for dates, returns the type of value detected and the date
+-- written in a more machine readable way.
+analyzeIDDetections_normalizedValue :: Lens.Lens' AnalyzeIDDetections (Prelude.Maybe NormalizedValue)
+analyzeIDDetections_normalizedValue = Lens.lens (\AnalyzeIDDetections' {normalizedValue} -> normalizedValue) (\s@AnalyzeIDDetections' {} a -> s {normalizedValue = a} :: AnalyzeIDDetections)
+
+-- | Text of either the normalized field or value associated with it.
+analyzeIDDetections_text :: Lens.Lens' AnalyzeIDDetections Prelude.Text
+analyzeIDDetections_text = Lens.lens (\AnalyzeIDDetections' {text} -> text) (\s@AnalyzeIDDetections' {} a -> s {text = a} :: AnalyzeIDDetections)
+
+instance Data.FromJSON AnalyzeIDDetections where
+  parseJSON =
+    Data.withObject
+      "AnalyzeIDDetections"
+      ( \x ->
+          AnalyzeIDDetections'
+            Prelude.<$> (x Data..:? "Confidence")
+            Prelude.<*> (x Data..:? "NormalizedValue")
+            Prelude.<*> (x Data..: "Text")
+      )
+
+instance Prelude.Hashable AnalyzeIDDetections where
+  hashWithSalt _salt AnalyzeIDDetections' {..} =
+    _salt
+      `Prelude.hashWithSalt` confidence
+      `Prelude.hashWithSalt` normalizedValue
+      `Prelude.hashWithSalt` text
+
+instance Prelude.NFData AnalyzeIDDetections where
+  rnf AnalyzeIDDetections' {..} =
+    Prelude.rnf confidence
+      `Prelude.seq` Prelude.rnf normalizedValue
+      `Prelude.seq` Prelude.rnf text
diff --git a/gen/Amazonka/Textract/Types/Block.hs b/gen/Amazonka/Textract/Types/Block.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/Block.hs
@@ -0,0 +1,530 @@
+{-# 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.Textract.Types.Block
+-- 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.Textract.Types.Block where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Types.BlockType
+import Amazonka.Textract.Types.EntityType
+import Amazonka.Textract.Types.Geometry
+import Amazonka.Textract.Types.Query
+import Amazonka.Textract.Types.Relationship
+import Amazonka.Textract.Types.SelectionStatus
+import Amazonka.Textract.Types.TextType
+
+-- | A @Block@ represents items that are recognized in a document within a
+-- group of pixels close to each other. The information returned in a
+-- @Block@ object depends on the type of operation. In text detection for
+-- documents (for example DetectDocumentText), you get information about
+-- the detected words and lines of text. In text analysis (for example
+-- AnalyzeDocument), you can also get information about the fields, tables,
+-- and selection elements that are detected in the document.
+--
+-- An array of @Block@ objects is returned by both synchronous and
+-- asynchronous operations. In synchronous operations, such as
+-- DetectDocumentText, the array of @Block@ objects is the entire set of
+-- results. In asynchronous operations, such as GetDocumentAnalysis, the
+-- array is returned over one or more responses.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/textract/latest/dg/how-it-works.html How Amazon Textract Works>.
+--
+-- /See:/ 'newBlock' smart constructor.
+data Block = Block'
+  { -- | The type of text item that\'s recognized. In operations for text
+    -- detection, the following types are returned:
+    --
+    -- -   /PAGE/ - Contains a list of the LINE @Block@ objects that are
+    --     detected on a document page.
+    --
+    -- -   /WORD/ - A word detected on a document page. A word is one or more
+    --     ISO basic Latin script characters that aren\'t separated by spaces.
+    --
+    -- -   /LINE/ - A string of tab-delimited, contiguous words that are
+    --     detected on a document page.
+    --
+    -- In text analysis operations, the following types are returned:
+    --
+    -- -   /PAGE/ - Contains a list of child @Block@ objects that are detected
+    --     on a document page.
+    --
+    -- -   /KEY_VALUE_SET/ - Stores the KEY and VALUE @Block@ objects for
+    --     linked text that\'s detected on a document page. Use the
+    --     @EntityType@ field to determine if a KEY_VALUE_SET object is a KEY
+    --     @Block@ object or a VALUE @Block@ object.
+    --
+    -- -   /WORD/ - A word that\'s detected on a document page. A word is one
+    --     or more ISO basic Latin script characters that aren\'t separated by
+    --     spaces.
+    --
+    -- -   /LINE/ - A string of tab-delimited, contiguous words that are
+    --     detected on a document page.
+    --
+    -- -   /TABLE/ - A table that\'s detected on a document page. A table is
+    --     grid-based information with two or more rows or columns, with a cell
+    --     span of one row and one column each.
+    --
+    -- -   /CELL/ - A cell within a detected table. The cell is the parent of
+    --     the block that contains the text in the cell.
+    --
+    -- -   /SELECTION_ELEMENT/ - A selection element such as an option button
+    --     (radio button) or a check box that\'s detected on a document page.
+    --     Use the value of @SelectionStatus@ to determine the status of the
+    --     selection element.
+    --
+    -- -   /SIGNATURE/ - The location and confidene score of a signature
+    --     detected on a document page. Can be returned as part of a Key-Value
+    --     pair or a detected cell.
+    --
+    -- -   /QUERY/ - A question asked during the call of AnalyzeDocument.
+    --     Contains an alias and an ID that attaches it to its answer.
+    --
+    -- -   /QUERY_RESULT/ - A response to a question asked during the call of
+    --     analyze document. Comes with an alias and ID for ease of locating in
+    --     a response. Also contains location and confidence score.
+    blockType :: Prelude.Maybe BlockType,
+    -- | The column in which a table cell appears. The first column position is
+    -- 1. @ColumnIndex@ isn\'t returned by @DetectDocumentText@ and
+    -- @GetDocumentTextDetection@.
+    columnIndex :: Prelude.Maybe Prelude.Natural,
+    -- | The number of columns that a table cell spans. Currently this value is
+    -- always 1, even if the number of columns spanned is greater than 1.
+    -- @ColumnSpan@ isn\'t returned by @DetectDocumentText@ and
+    -- @GetDocumentTextDetection@.
+    columnSpan :: Prelude.Maybe Prelude.Natural,
+    -- | The confidence score that Amazon Textract has in the accuracy of the
+    -- recognized text and the accuracy of the geometry points around the
+    -- recognized text.
+    confidence :: Prelude.Maybe Prelude.Double,
+    -- | The type of entity. The following can be returned:
+    --
+    -- -   /KEY/ - An identifier for a field on the document.
+    --
+    -- -   /VALUE/ - The field text.
+    --
+    -- @EntityTypes@ isn\'t returned by @DetectDocumentText@ and
+    -- @GetDocumentTextDetection@.
+    entityTypes :: Prelude.Maybe [EntityType],
+    -- | The location of the recognized text on the image. It includes an
+    -- axis-aligned, coarse bounding box that surrounds the text, and a
+    -- finer-grain polygon for more accurate spatial information.
+    geometry :: Prelude.Maybe Geometry,
+    -- | The identifier for the recognized text. The identifier is only unique
+    -- for a single operation.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The page on which a block was detected. @Page@ is returned by
+    -- synchronous and asynchronous operations. Page values greater than 1 are
+    -- only returned for multipage documents that are in PDF or TIFF format. A
+    -- scanned image (JPEG\/PNG) provided to an asynchronous operation, even if
+    -- it contains multiple document pages, is considered a single-page
+    -- document. This means that for scanned images the value of @Page@ is
+    -- always 1. Synchronous operations operations will also return a @Page@
+    -- value of 1 because every input document is considered to be a
+    -- single-page document.
+    page :: Prelude.Maybe Prelude.Natural,
+    query :: Prelude.Maybe Query,
+    -- | A list of child blocks of the current block. For example, a LINE object
+    -- has child blocks for each WORD block that\'s part of the line of text.
+    -- There aren\'t Relationship objects in the list for relationships that
+    -- don\'t exist, such as when the current block has no child blocks. The
+    -- list size can be the following:
+    --
+    -- -   0 - The block has no child blocks.
+    --
+    -- -   1 - The block has child blocks.
+    relationships :: Prelude.Maybe [Relationship],
+    -- | The row in which a table cell is located. The first row position is 1.
+    -- @RowIndex@ isn\'t returned by @DetectDocumentText@ and
+    -- @GetDocumentTextDetection@.
+    rowIndex :: Prelude.Maybe Prelude.Natural,
+    -- | The number of rows that a table cell spans. Currently this value is
+    -- always 1, even if the number of rows spanned is greater than 1.
+    -- @RowSpan@ isn\'t returned by @DetectDocumentText@ and
+    -- @GetDocumentTextDetection@.
+    rowSpan :: Prelude.Maybe Prelude.Natural,
+    -- | The selection status of a selection element, such as an option button or
+    -- check box.
+    selectionStatus :: Prelude.Maybe SelectionStatus,
+    -- | The word or line of text that\'s recognized by Amazon Textract.
+    text :: Prelude.Maybe Prelude.Text,
+    -- | The kind of text that Amazon Textract has detected. Can check for
+    -- handwritten text and printed text.
+    textType :: Prelude.Maybe TextType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Block' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'blockType', 'block_blockType' - The type of text item that\'s recognized. In operations for text
+-- detection, the following types are returned:
+--
+-- -   /PAGE/ - Contains a list of the LINE @Block@ objects that are
+--     detected on a document page.
+--
+-- -   /WORD/ - A word detected on a document page. A word is one or more
+--     ISO basic Latin script characters that aren\'t separated by spaces.
+--
+-- -   /LINE/ - A string of tab-delimited, contiguous words that are
+--     detected on a document page.
+--
+-- In text analysis operations, the following types are returned:
+--
+-- -   /PAGE/ - Contains a list of child @Block@ objects that are detected
+--     on a document page.
+--
+-- -   /KEY_VALUE_SET/ - Stores the KEY and VALUE @Block@ objects for
+--     linked text that\'s detected on a document page. Use the
+--     @EntityType@ field to determine if a KEY_VALUE_SET object is a KEY
+--     @Block@ object or a VALUE @Block@ object.
+--
+-- -   /WORD/ - A word that\'s detected on a document page. A word is one
+--     or more ISO basic Latin script characters that aren\'t separated by
+--     spaces.
+--
+-- -   /LINE/ - A string of tab-delimited, contiguous words that are
+--     detected on a document page.
+--
+-- -   /TABLE/ - A table that\'s detected on a document page. A table is
+--     grid-based information with two or more rows or columns, with a cell
+--     span of one row and one column each.
+--
+-- -   /CELL/ - A cell within a detected table. The cell is the parent of
+--     the block that contains the text in the cell.
+--
+-- -   /SELECTION_ELEMENT/ - A selection element such as an option button
+--     (radio button) or a check box that\'s detected on a document page.
+--     Use the value of @SelectionStatus@ to determine the status of the
+--     selection element.
+--
+-- -   /SIGNATURE/ - The location and confidene score of a signature
+--     detected on a document page. Can be returned as part of a Key-Value
+--     pair or a detected cell.
+--
+-- -   /QUERY/ - A question asked during the call of AnalyzeDocument.
+--     Contains an alias and an ID that attaches it to its answer.
+--
+-- -   /QUERY_RESULT/ - A response to a question asked during the call of
+--     analyze document. Comes with an alias and ID for ease of locating in
+--     a response. Also contains location and confidence score.
+--
+-- 'columnIndex', 'block_columnIndex' - The column in which a table cell appears. The first column position is
+-- 1. @ColumnIndex@ isn\'t returned by @DetectDocumentText@ and
+-- @GetDocumentTextDetection@.
+--
+-- 'columnSpan', 'block_columnSpan' - The number of columns that a table cell spans. Currently this value is
+-- always 1, even if the number of columns spanned is greater than 1.
+-- @ColumnSpan@ isn\'t returned by @DetectDocumentText@ and
+-- @GetDocumentTextDetection@.
+--
+-- 'confidence', 'block_confidence' - The confidence score that Amazon Textract has in the accuracy of the
+-- recognized text and the accuracy of the geometry points around the
+-- recognized text.
+--
+-- 'entityTypes', 'block_entityTypes' - The type of entity. The following can be returned:
+--
+-- -   /KEY/ - An identifier for a field on the document.
+--
+-- -   /VALUE/ - The field text.
+--
+-- @EntityTypes@ isn\'t returned by @DetectDocumentText@ and
+-- @GetDocumentTextDetection@.
+--
+-- 'geometry', 'block_geometry' - The location of the recognized text on the image. It includes an
+-- axis-aligned, coarse bounding box that surrounds the text, and a
+-- finer-grain polygon for more accurate spatial information.
+--
+-- 'id', 'block_id' - The identifier for the recognized text. The identifier is only unique
+-- for a single operation.
+--
+-- 'page', 'block_page' - The page on which a block was detected. @Page@ is returned by
+-- synchronous and asynchronous operations. Page values greater than 1 are
+-- only returned for multipage documents that are in PDF or TIFF format. A
+-- scanned image (JPEG\/PNG) provided to an asynchronous operation, even if
+-- it contains multiple document pages, is considered a single-page
+-- document. This means that for scanned images the value of @Page@ is
+-- always 1. Synchronous operations operations will also return a @Page@
+-- value of 1 because every input document is considered to be a
+-- single-page document.
+--
+-- 'query', 'block_query' -
+--
+-- 'relationships', 'block_relationships' - A list of child blocks of the current block. For example, a LINE object
+-- has child blocks for each WORD block that\'s part of the line of text.
+-- There aren\'t Relationship objects in the list for relationships that
+-- don\'t exist, such as when the current block has no child blocks. The
+-- list size can be the following:
+--
+-- -   0 - The block has no child blocks.
+--
+-- -   1 - The block has child blocks.
+--
+-- 'rowIndex', 'block_rowIndex' - The row in which a table cell is located. The first row position is 1.
+-- @RowIndex@ isn\'t returned by @DetectDocumentText@ and
+-- @GetDocumentTextDetection@.
+--
+-- 'rowSpan', 'block_rowSpan' - The number of rows that a table cell spans. Currently this value is
+-- always 1, even if the number of rows spanned is greater than 1.
+-- @RowSpan@ isn\'t returned by @DetectDocumentText@ and
+-- @GetDocumentTextDetection@.
+--
+-- 'selectionStatus', 'block_selectionStatus' - The selection status of a selection element, such as an option button or
+-- check box.
+--
+-- 'text', 'block_text' - The word or line of text that\'s recognized by Amazon Textract.
+--
+-- 'textType', 'block_textType' - The kind of text that Amazon Textract has detected. Can check for
+-- handwritten text and printed text.
+newBlock ::
+  Block
+newBlock =
+  Block'
+    { blockType = Prelude.Nothing,
+      columnIndex = Prelude.Nothing,
+      columnSpan = Prelude.Nothing,
+      confidence = Prelude.Nothing,
+      entityTypes = Prelude.Nothing,
+      geometry = Prelude.Nothing,
+      id = Prelude.Nothing,
+      page = Prelude.Nothing,
+      query = Prelude.Nothing,
+      relationships = Prelude.Nothing,
+      rowIndex = Prelude.Nothing,
+      rowSpan = Prelude.Nothing,
+      selectionStatus = Prelude.Nothing,
+      text = Prelude.Nothing,
+      textType = Prelude.Nothing
+    }
+
+-- | The type of text item that\'s recognized. In operations for text
+-- detection, the following types are returned:
+--
+-- -   /PAGE/ - Contains a list of the LINE @Block@ objects that are
+--     detected on a document page.
+--
+-- -   /WORD/ - A word detected on a document page. A word is one or more
+--     ISO basic Latin script characters that aren\'t separated by spaces.
+--
+-- -   /LINE/ - A string of tab-delimited, contiguous words that are
+--     detected on a document page.
+--
+-- In text analysis operations, the following types are returned:
+--
+-- -   /PAGE/ - Contains a list of child @Block@ objects that are detected
+--     on a document page.
+--
+-- -   /KEY_VALUE_SET/ - Stores the KEY and VALUE @Block@ objects for
+--     linked text that\'s detected on a document page. Use the
+--     @EntityType@ field to determine if a KEY_VALUE_SET object is a KEY
+--     @Block@ object or a VALUE @Block@ object.
+--
+-- -   /WORD/ - A word that\'s detected on a document page. A word is one
+--     or more ISO basic Latin script characters that aren\'t separated by
+--     spaces.
+--
+-- -   /LINE/ - A string of tab-delimited, contiguous words that are
+--     detected on a document page.
+--
+-- -   /TABLE/ - A table that\'s detected on a document page. A table is
+--     grid-based information with two or more rows or columns, with a cell
+--     span of one row and one column each.
+--
+-- -   /CELL/ - A cell within a detected table. The cell is the parent of
+--     the block that contains the text in the cell.
+--
+-- -   /SELECTION_ELEMENT/ - A selection element such as an option button
+--     (radio button) or a check box that\'s detected on a document page.
+--     Use the value of @SelectionStatus@ to determine the status of the
+--     selection element.
+--
+-- -   /SIGNATURE/ - The location and confidene score of a signature
+--     detected on a document page. Can be returned as part of a Key-Value
+--     pair or a detected cell.
+--
+-- -   /QUERY/ - A question asked during the call of AnalyzeDocument.
+--     Contains an alias and an ID that attaches it to its answer.
+--
+-- -   /QUERY_RESULT/ - A response to a question asked during the call of
+--     analyze document. Comes with an alias and ID for ease of locating in
+--     a response. Also contains location and confidence score.
+block_blockType :: Lens.Lens' Block (Prelude.Maybe BlockType)
+block_blockType = Lens.lens (\Block' {blockType} -> blockType) (\s@Block' {} a -> s {blockType = a} :: Block)
+
+-- | The column in which a table cell appears. The first column position is
+-- 1. @ColumnIndex@ isn\'t returned by @DetectDocumentText@ and
+-- @GetDocumentTextDetection@.
+block_columnIndex :: Lens.Lens' Block (Prelude.Maybe Prelude.Natural)
+block_columnIndex = Lens.lens (\Block' {columnIndex} -> columnIndex) (\s@Block' {} a -> s {columnIndex = a} :: Block)
+
+-- | The number of columns that a table cell spans. Currently this value is
+-- always 1, even if the number of columns spanned is greater than 1.
+-- @ColumnSpan@ isn\'t returned by @DetectDocumentText@ and
+-- @GetDocumentTextDetection@.
+block_columnSpan :: Lens.Lens' Block (Prelude.Maybe Prelude.Natural)
+block_columnSpan = Lens.lens (\Block' {columnSpan} -> columnSpan) (\s@Block' {} a -> s {columnSpan = a} :: Block)
+
+-- | The confidence score that Amazon Textract has in the accuracy of the
+-- recognized text and the accuracy of the geometry points around the
+-- recognized text.
+block_confidence :: Lens.Lens' Block (Prelude.Maybe Prelude.Double)
+block_confidence = Lens.lens (\Block' {confidence} -> confidence) (\s@Block' {} a -> s {confidence = a} :: Block)
+
+-- | The type of entity. The following can be returned:
+--
+-- -   /KEY/ - An identifier for a field on the document.
+--
+-- -   /VALUE/ - The field text.
+--
+-- @EntityTypes@ isn\'t returned by @DetectDocumentText@ and
+-- @GetDocumentTextDetection@.
+block_entityTypes :: Lens.Lens' Block (Prelude.Maybe [EntityType])
+block_entityTypes = Lens.lens (\Block' {entityTypes} -> entityTypes) (\s@Block' {} a -> s {entityTypes = a} :: Block) Prelude.. Lens.mapping Lens.coerced
+
+-- | The location of the recognized text on the image. It includes an
+-- axis-aligned, coarse bounding box that surrounds the text, and a
+-- finer-grain polygon for more accurate spatial information.
+block_geometry :: Lens.Lens' Block (Prelude.Maybe Geometry)
+block_geometry = Lens.lens (\Block' {geometry} -> geometry) (\s@Block' {} a -> s {geometry = a} :: Block)
+
+-- | The identifier for the recognized text. The identifier is only unique
+-- for a single operation.
+block_id :: Lens.Lens' Block (Prelude.Maybe Prelude.Text)
+block_id = Lens.lens (\Block' {id} -> id) (\s@Block' {} a -> s {id = a} :: Block)
+
+-- | The page on which a block was detected. @Page@ is returned by
+-- synchronous and asynchronous operations. Page values greater than 1 are
+-- only returned for multipage documents that are in PDF or TIFF format. A
+-- scanned image (JPEG\/PNG) provided to an asynchronous operation, even if
+-- it contains multiple document pages, is considered a single-page
+-- document. This means that for scanned images the value of @Page@ is
+-- always 1. Synchronous operations operations will also return a @Page@
+-- value of 1 because every input document is considered to be a
+-- single-page document.
+block_page :: Lens.Lens' Block (Prelude.Maybe Prelude.Natural)
+block_page = Lens.lens (\Block' {page} -> page) (\s@Block' {} a -> s {page = a} :: Block)
+
+block_query :: Lens.Lens' Block (Prelude.Maybe Query)
+block_query = Lens.lens (\Block' {query} -> query) (\s@Block' {} a -> s {query = a} :: Block)
+
+-- | A list of child blocks of the current block. For example, a LINE object
+-- has child blocks for each WORD block that\'s part of the line of text.
+-- There aren\'t Relationship objects in the list for relationships that
+-- don\'t exist, such as when the current block has no child blocks. The
+-- list size can be the following:
+--
+-- -   0 - The block has no child blocks.
+--
+-- -   1 - The block has child blocks.
+block_relationships :: Lens.Lens' Block (Prelude.Maybe [Relationship])
+block_relationships = Lens.lens (\Block' {relationships} -> relationships) (\s@Block' {} a -> s {relationships = a} :: Block) Prelude.. Lens.mapping Lens.coerced
+
+-- | The row in which a table cell is located. The first row position is 1.
+-- @RowIndex@ isn\'t returned by @DetectDocumentText@ and
+-- @GetDocumentTextDetection@.
+block_rowIndex :: Lens.Lens' Block (Prelude.Maybe Prelude.Natural)
+block_rowIndex = Lens.lens (\Block' {rowIndex} -> rowIndex) (\s@Block' {} a -> s {rowIndex = a} :: Block)
+
+-- | The number of rows that a table cell spans. Currently this value is
+-- always 1, even if the number of rows spanned is greater than 1.
+-- @RowSpan@ isn\'t returned by @DetectDocumentText@ and
+-- @GetDocumentTextDetection@.
+block_rowSpan :: Lens.Lens' Block (Prelude.Maybe Prelude.Natural)
+block_rowSpan = Lens.lens (\Block' {rowSpan} -> rowSpan) (\s@Block' {} a -> s {rowSpan = a} :: Block)
+
+-- | The selection status of a selection element, such as an option button or
+-- check box.
+block_selectionStatus :: Lens.Lens' Block (Prelude.Maybe SelectionStatus)
+block_selectionStatus = Lens.lens (\Block' {selectionStatus} -> selectionStatus) (\s@Block' {} a -> s {selectionStatus = a} :: Block)
+
+-- | The word or line of text that\'s recognized by Amazon Textract.
+block_text :: Lens.Lens' Block (Prelude.Maybe Prelude.Text)
+block_text = Lens.lens (\Block' {text} -> text) (\s@Block' {} a -> s {text = a} :: Block)
+
+-- | The kind of text that Amazon Textract has detected. Can check for
+-- handwritten text and printed text.
+block_textType :: Lens.Lens' Block (Prelude.Maybe TextType)
+block_textType = Lens.lens (\Block' {textType} -> textType) (\s@Block' {} a -> s {textType = a} :: Block)
+
+instance Data.FromJSON Block where
+  parseJSON =
+    Data.withObject
+      "Block"
+      ( \x ->
+          Block'
+            Prelude.<$> (x Data..:? "BlockType")
+            Prelude.<*> (x Data..:? "ColumnIndex")
+            Prelude.<*> (x Data..:? "ColumnSpan")
+            Prelude.<*> (x Data..:? "Confidence")
+            Prelude.<*> (x Data..:? "EntityTypes" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "Geometry")
+            Prelude.<*> (x Data..:? "Id")
+            Prelude.<*> (x Data..:? "Page")
+            Prelude.<*> (x Data..:? "Query")
+            Prelude.<*> (x Data..:? "Relationships" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "RowIndex")
+            Prelude.<*> (x Data..:? "RowSpan")
+            Prelude.<*> (x Data..:? "SelectionStatus")
+            Prelude.<*> (x Data..:? "Text")
+            Prelude.<*> (x Data..:? "TextType")
+      )
+
+instance Prelude.Hashable Block where
+  hashWithSalt _salt Block' {..} =
+    _salt
+      `Prelude.hashWithSalt` blockType
+      `Prelude.hashWithSalt` columnIndex
+      `Prelude.hashWithSalt` columnSpan
+      `Prelude.hashWithSalt` confidence
+      `Prelude.hashWithSalt` entityTypes
+      `Prelude.hashWithSalt` geometry
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` page
+      `Prelude.hashWithSalt` query
+      `Prelude.hashWithSalt` relationships
+      `Prelude.hashWithSalt` rowIndex
+      `Prelude.hashWithSalt` rowSpan
+      `Prelude.hashWithSalt` selectionStatus
+      `Prelude.hashWithSalt` text
+      `Prelude.hashWithSalt` textType
+
+instance Prelude.NFData Block where
+  rnf Block' {..} =
+    Prelude.rnf blockType
+      `Prelude.seq` Prelude.rnf columnIndex
+      `Prelude.seq` Prelude.rnf columnSpan
+      `Prelude.seq` Prelude.rnf confidence
+      `Prelude.seq` Prelude.rnf entityTypes
+      `Prelude.seq` Prelude.rnf geometry
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf page
+      `Prelude.seq` Prelude.rnf query
+      `Prelude.seq` Prelude.rnf relationships
+      `Prelude.seq` Prelude.rnf rowIndex
+      `Prelude.seq` Prelude.rnf rowSpan
+      `Prelude.seq` Prelude.rnf selectionStatus
+      `Prelude.seq` Prelude.rnf text
+      `Prelude.seq` Prelude.rnf textType
diff --git a/gen/Amazonka/Textract/Types/BlockType.hs b/gen/Amazonka/Textract/Types/BlockType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/BlockType.hs
@@ -0,0 +1,121 @@
+{-# 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.Textract.Types.BlockType
+-- 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.Textract.Types.BlockType
+  ( BlockType
+      ( ..,
+        BlockType_CELL,
+        BlockType_KEY_VALUE_SET,
+        BlockType_LINE,
+        BlockType_MERGED_CELL,
+        BlockType_PAGE,
+        BlockType_QUERY,
+        BlockType_QUERY_RESULT,
+        BlockType_SELECTION_ELEMENT,
+        BlockType_SIGNATURE,
+        BlockType_TABLE,
+        BlockType_TITLE,
+        BlockType_WORD
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype BlockType = BlockType'
+  { fromBlockType ::
+      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 BlockType_CELL :: BlockType
+pattern BlockType_CELL = BlockType' "CELL"
+
+pattern BlockType_KEY_VALUE_SET :: BlockType
+pattern BlockType_KEY_VALUE_SET = BlockType' "KEY_VALUE_SET"
+
+pattern BlockType_LINE :: BlockType
+pattern BlockType_LINE = BlockType' "LINE"
+
+pattern BlockType_MERGED_CELL :: BlockType
+pattern BlockType_MERGED_CELL = BlockType' "MERGED_CELL"
+
+pattern BlockType_PAGE :: BlockType
+pattern BlockType_PAGE = BlockType' "PAGE"
+
+pattern BlockType_QUERY :: BlockType
+pattern BlockType_QUERY = BlockType' "QUERY"
+
+pattern BlockType_QUERY_RESULT :: BlockType
+pattern BlockType_QUERY_RESULT = BlockType' "QUERY_RESULT"
+
+pattern BlockType_SELECTION_ELEMENT :: BlockType
+pattern BlockType_SELECTION_ELEMENT = BlockType' "SELECTION_ELEMENT"
+
+pattern BlockType_SIGNATURE :: BlockType
+pattern BlockType_SIGNATURE = BlockType' "SIGNATURE"
+
+pattern BlockType_TABLE :: BlockType
+pattern BlockType_TABLE = BlockType' "TABLE"
+
+pattern BlockType_TITLE :: BlockType
+pattern BlockType_TITLE = BlockType' "TITLE"
+
+pattern BlockType_WORD :: BlockType
+pattern BlockType_WORD = BlockType' "WORD"
+
+{-# COMPLETE
+  BlockType_CELL,
+  BlockType_KEY_VALUE_SET,
+  BlockType_LINE,
+  BlockType_MERGED_CELL,
+  BlockType_PAGE,
+  BlockType_QUERY,
+  BlockType_QUERY_RESULT,
+  BlockType_SELECTION_ELEMENT,
+  BlockType_SIGNATURE,
+  BlockType_TABLE,
+  BlockType_TITLE,
+  BlockType_WORD,
+  BlockType'
+  #-}
diff --git a/gen/Amazonka/Textract/Types/BoundingBox.hs b/gen/Amazonka/Textract/Types/BoundingBox.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/BoundingBox.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.Textract.Types.BoundingBox
+-- 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.Textract.Types.BoundingBox 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 bounding box around the detected page, text, key-value pair, table,
+-- table cell, or selection element on a document page. The @left@
+-- (x-coordinate) and @top@ (y-coordinate) are coordinates that represent
+-- the top and left sides of the bounding box. Note that the upper-left
+-- corner of the image is the origin (0,0).
+--
+-- The @top@ and @left@ values returned are ratios of the overall document
+-- page size. For example, if the input image is 700 x 200 pixels, and the
+-- top-left coordinate of the bounding box is 350 x 50 pixels, the API
+-- returns a @left@ value of 0.5 (350\/700) and a @top@ value of 0.25
+-- (50\/200).
+--
+-- The @width@ and @height@ values represent the dimensions of the bounding
+-- box as a ratio of the overall document page dimension. For example, if
+-- the document page size is 700 x 200 pixels, and the bounding box width
+-- is 70 pixels, the width returned is 0.1.
+--
+-- /See:/ 'newBoundingBox' smart constructor.
+data BoundingBox = BoundingBox'
+  { -- | The height of the bounding box as a ratio of the overall document page
+    -- height.
+    height :: Prelude.Maybe Prelude.Double,
+    -- | The left coordinate of the bounding box as a ratio of overall document
+    -- page width.
+    left :: Prelude.Maybe Prelude.Double,
+    -- | The top coordinate of the bounding box as a ratio of overall document
+    -- page height.
+    top :: Prelude.Maybe Prelude.Double,
+    -- | The width of the bounding box as a ratio of the overall document page
+    -- width.
+    width :: Prelude.Maybe Prelude.Double
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BoundingBox' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'height', 'boundingBox_height' - The height of the bounding box as a ratio of the overall document page
+-- height.
+--
+-- 'left', 'boundingBox_left' - The left coordinate of the bounding box as a ratio of overall document
+-- page width.
+--
+-- 'top', 'boundingBox_top' - The top coordinate of the bounding box as a ratio of overall document
+-- page height.
+--
+-- 'width', 'boundingBox_width' - The width of the bounding box as a ratio of the overall document page
+-- width.
+newBoundingBox ::
+  BoundingBox
+newBoundingBox =
+  BoundingBox'
+    { height = Prelude.Nothing,
+      left = Prelude.Nothing,
+      top = Prelude.Nothing,
+      width = Prelude.Nothing
+    }
+
+-- | The height of the bounding box as a ratio of the overall document page
+-- height.
+boundingBox_height :: Lens.Lens' BoundingBox (Prelude.Maybe Prelude.Double)
+boundingBox_height = Lens.lens (\BoundingBox' {height} -> height) (\s@BoundingBox' {} a -> s {height = a} :: BoundingBox)
+
+-- | The left coordinate of the bounding box as a ratio of overall document
+-- page width.
+boundingBox_left :: Lens.Lens' BoundingBox (Prelude.Maybe Prelude.Double)
+boundingBox_left = Lens.lens (\BoundingBox' {left} -> left) (\s@BoundingBox' {} a -> s {left = a} :: BoundingBox)
+
+-- | The top coordinate of the bounding box as a ratio of overall document
+-- page height.
+boundingBox_top :: Lens.Lens' BoundingBox (Prelude.Maybe Prelude.Double)
+boundingBox_top = Lens.lens (\BoundingBox' {top} -> top) (\s@BoundingBox' {} a -> s {top = a} :: BoundingBox)
+
+-- | The width of the bounding box as a ratio of the overall document page
+-- width.
+boundingBox_width :: Lens.Lens' BoundingBox (Prelude.Maybe Prelude.Double)
+boundingBox_width = Lens.lens (\BoundingBox' {width} -> width) (\s@BoundingBox' {} a -> s {width = a} :: BoundingBox)
+
+instance Data.FromJSON BoundingBox where
+  parseJSON =
+    Data.withObject
+      "BoundingBox"
+      ( \x ->
+          BoundingBox'
+            Prelude.<$> (x Data..:? "Height")
+            Prelude.<*> (x Data..:? "Left")
+            Prelude.<*> (x Data..:? "Top")
+            Prelude.<*> (x Data..:? "Width")
+      )
+
+instance Prelude.Hashable BoundingBox where
+  hashWithSalt _salt BoundingBox' {..} =
+    _salt
+      `Prelude.hashWithSalt` height
+      `Prelude.hashWithSalt` left
+      `Prelude.hashWithSalt` top
+      `Prelude.hashWithSalt` width
+
+instance Prelude.NFData BoundingBox where
+  rnf BoundingBox' {..} =
+    Prelude.rnf height
+      `Prelude.seq` Prelude.rnf left
+      `Prelude.seq` Prelude.rnf top
+      `Prelude.seq` Prelude.rnf width
diff --git a/gen/Amazonka/Textract/Types/ContentClassifier.hs b/gen/Amazonka/Textract/Types/ContentClassifier.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/ContentClassifier.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.Textract.Types.ContentClassifier
+-- 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.Textract.Types.ContentClassifier
+  ( ContentClassifier
+      ( ..,
+        ContentClassifier_FreeOfAdultContent,
+        ContentClassifier_FreeOfPersonallyIdentifiableInformation
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ContentClassifier = ContentClassifier'
+  { fromContentClassifier ::
+      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 ContentClassifier_FreeOfAdultContent :: ContentClassifier
+pattern ContentClassifier_FreeOfAdultContent = ContentClassifier' "FreeOfAdultContent"
+
+pattern ContentClassifier_FreeOfPersonallyIdentifiableInformation :: ContentClassifier
+pattern ContentClassifier_FreeOfPersonallyIdentifiableInformation = ContentClassifier' "FreeOfPersonallyIdentifiableInformation"
+
+{-# COMPLETE
+  ContentClassifier_FreeOfAdultContent,
+  ContentClassifier_FreeOfPersonallyIdentifiableInformation,
+  ContentClassifier'
+  #-}
diff --git a/gen/Amazonka/Textract/Types/DetectedSignature.hs b/gen/Amazonka/Textract/Types/DetectedSignature.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/DetectedSignature.hs
@@ -0,0 +1,68 @@
+{-# 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.Textract.Types.DetectedSignature
+-- 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.Textract.Types.DetectedSignature where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | A structure that holds information regarding a detected signature on a
+-- page.
+--
+-- /See:/ 'newDetectedSignature' smart constructor.
+data DetectedSignature = DetectedSignature'
+  { -- | The page a detected signature was found on.
+    page :: Prelude.Maybe Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DetectedSignature' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'page', 'detectedSignature_page' - The page a detected signature was found on.
+newDetectedSignature ::
+  DetectedSignature
+newDetectedSignature =
+  DetectedSignature' {page = Prelude.Nothing}
+
+-- | The page a detected signature was found on.
+detectedSignature_page :: Lens.Lens' DetectedSignature (Prelude.Maybe Prelude.Natural)
+detectedSignature_page = Lens.lens (\DetectedSignature' {page} -> page) (\s@DetectedSignature' {} a -> s {page = a} :: DetectedSignature)
+
+instance Data.FromJSON DetectedSignature where
+  parseJSON =
+    Data.withObject
+      "DetectedSignature"
+      ( \x ->
+          DetectedSignature' Prelude.<$> (x Data..:? "Page")
+      )
+
+instance Prelude.Hashable DetectedSignature where
+  hashWithSalt _salt DetectedSignature' {..} =
+    _salt `Prelude.hashWithSalt` page
+
+instance Prelude.NFData DetectedSignature where
+  rnf DetectedSignature' {..} = Prelude.rnf page
diff --git a/gen/Amazonka/Textract/Types/Document.hs b/gen/Amazonka/Textract/Types/Document.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/Document.hs
@@ -0,0 +1,132 @@
+{-# 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.Textract.Types.Document
+-- 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.Textract.Types.Document where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Types.S3Object
+
+-- | The input document, either as bytes or as an S3 object.
+--
+-- You pass image bytes to an Amazon Textract API operation by using the
+-- @Bytes@ property. For example, you would use the @Bytes@ property to
+-- pass a document loaded from a local file system. Image bytes passed by
+-- using the @Bytes@ property must be base64 encoded. Your code might not
+-- need to encode document file bytes if you\'re using an AWS SDK to call
+-- Amazon Textract API operations.
+--
+-- You pass images stored in an S3 bucket to an Amazon Textract API
+-- operation by using the @S3Object@ property. Documents stored in an S3
+-- bucket don\'t need to be base64 encoded.
+--
+-- The AWS Region for the S3 bucket that contains the S3 object must match
+-- the AWS Region that you use for Amazon Textract operations.
+--
+-- If you use the AWS CLI to call Amazon Textract operations, passing image
+-- bytes using the Bytes property isn\'t supported. You must first upload
+-- the document to an Amazon S3 bucket, and then call the operation using
+-- the S3Object property.
+--
+-- For Amazon Textract to process an S3 object, the user must have
+-- permission to access the S3 object.
+--
+-- /See:/ 'newDocument' smart constructor.
+data Document = Document'
+  { -- | A blob of base64-encoded document bytes. The maximum size of a document
+    -- that\'s provided in a blob of bytes is 5 MB. The document bytes must be
+    -- in PNG or JPEG format.
+    --
+    -- If you\'re using an AWS SDK to call Amazon Textract, you might not need
+    -- to base64-encode image bytes passed using the @Bytes@ field.
+    bytes :: Prelude.Maybe Data.Base64,
+    -- | Identifies an S3 object as the document source. The maximum size of a
+    -- document that\'s stored in an S3 bucket is 5 MB.
+    s3Object :: Prelude.Maybe S3Object
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Document' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'bytes', 'document_bytes' - A blob of base64-encoded document bytes. The maximum size of a document
+-- that\'s provided in a blob of bytes is 5 MB. The document bytes must be
+-- in PNG or JPEG format.
+--
+-- If you\'re using an AWS SDK to call Amazon Textract, you might not need
+-- to base64-encode image bytes passed using the @Bytes@ field.--
+-- -- /Note:/ This 'Lens' automatically encodes and decodes Base64 data.
+-- -- The underlying isomorphism will encode to Base64 representation during
+-- -- serialisation, and decode from Base64 representation during deserialisation.
+-- -- This 'Lens' accepts and returns only raw unencoded data.
+--
+-- 's3Object', 'document_s3Object' - Identifies an S3 object as the document source. The maximum size of a
+-- document that\'s stored in an S3 bucket is 5 MB.
+newDocument ::
+  Document
+newDocument =
+  Document'
+    { bytes = Prelude.Nothing,
+      s3Object = Prelude.Nothing
+    }
+
+-- | A blob of base64-encoded document bytes. The maximum size of a document
+-- that\'s provided in a blob of bytes is 5 MB. The document bytes must be
+-- in PNG or JPEG format.
+--
+-- If you\'re using an AWS SDK to call Amazon Textract, you might not need
+-- to base64-encode image bytes passed using the @Bytes@ field.--
+-- -- /Note:/ This 'Lens' automatically encodes and decodes Base64 data.
+-- -- The underlying isomorphism will encode to Base64 representation during
+-- -- serialisation, and decode from Base64 representation during deserialisation.
+-- -- This 'Lens' accepts and returns only raw unencoded data.
+document_bytes :: Lens.Lens' Document (Prelude.Maybe Prelude.ByteString)
+document_bytes = Lens.lens (\Document' {bytes} -> bytes) (\s@Document' {} a -> s {bytes = a} :: Document) Prelude.. Lens.mapping Data._Base64
+
+-- | Identifies an S3 object as the document source. The maximum size of a
+-- document that\'s stored in an S3 bucket is 5 MB.
+document_s3Object :: Lens.Lens' Document (Prelude.Maybe S3Object)
+document_s3Object = Lens.lens (\Document' {s3Object} -> s3Object) (\s@Document' {} a -> s {s3Object = a} :: Document)
+
+instance Prelude.Hashable Document where
+  hashWithSalt _salt Document' {..} =
+    _salt
+      `Prelude.hashWithSalt` bytes
+      `Prelude.hashWithSalt` s3Object
+
+instance Prelude.NFData Document where
+  rnf Document' {..} =
+    Prelude.rnf bytes
+      `Prelude.seq` Prelude.rnf s3Object
+
+instance Data.ToJSON Document where
+  toJSON Document' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Bytes" Data..=) Prelude.<$> bytes,
+            ("S3Object" Data..=) Prelude.<$> s3Object
+          ]
+      )
diff --git a/gen/Amazonka/Textract/Types/DocumentGroup.hs b/gen/Amazonka/Textract/Types/DocumentGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/DocumentGroup.hs
@@ -0,0 +1,124 @@
+{-# 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.Textract.Types.DocumentGroup
+-- 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.Textract.Types.DocumentGroup where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Types.DetectedSignature
+import Amazonka.Textract.Types.SplitDocument
+import Amazonka.Textract.Types.UndetectedSignature
+
+-- | Summary information about documents grouped by the same document type.
+--
+-- /See:/ 'newDocumentGroup' smart constructor.
+data DocumentGroup = DocumentGroup'
+  { -- | A list of the detected signatures found in a document group.
+    detectedSignatures :: Prelude.Maybe [DetectedSignature],
+    -- | An array that contains information about the pages of a document,
+    -- defined by logical boundary.
+    splitDocuments :: Prelude.Maybe [SplitDocument],
+    -- | The type of document that Amazon Textract has detected. See LINK for a
+    -- list of all types returned by Textract.
+    type' :: Prelude.Maybe Prelude.Text,
+    -- | A list of any expected signatures not found in a document group.
+    undetectedSignatures :: Prelude.Maybe [UndetectedSignature]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DocumentGroup' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'detectedSignatures', 'documentGroup_detectedSignatures' - A list of the detected signatures found in a document group.
+--
+-- 'splitDocuments', 'documentGroup_splitDocuments' - An array that contains information about the pages of a document,
+-- defined by logical boundary.
+--
+-- 'type'', 'documentGroup_type' - The type of document that Amazon Textract has detected. See LINK for a
+-- list of all types returned by Textract.
+--
+-- 'undetectedSignatures', 'documentGroup_undetectedSignatures' - A list of any expected signatures not found in a document group.
+newDocumentGroup ::
+  DocumentGroup
+newDocumentGroup =
+  DocumentGroup'
+    { detectedSignatures =
+        Prelude.Nothing,
+      splitDocuments = Prelude.Nothing,
+      type' = Prelude.Nothing,
+      undetectedSignatures = Prelude.Nothing
+    }
+
+-- | A list of the detected signatures found in a document group.
+documentGroup_detectedSignatures :: Lens.Lens' DocumentGroup (Prelude.Maybe [DetectedSignature])
+documentGroup_detectedSignatures = Lens.lens (\DocumentGroup' {detectedSignatures} -> detectedSignatures) (\s@DocumentGroup' {} a -> s {detectedSignatures = a} :: DocumentGroup) Prelude.. Lens.mapping Lens.coerced
+
+-- | An array that contains information about the pages of a document,
+-- defined by logical boundary.
+documentGroup_splitDocuments :: Lens.Lens' DocumentGroup (Prelude.Maybe [SplitDocument])
+documentGroup_splitDocuments = Lens.lens (\DocumentGroup' {splitDocuments} -> splitDocuments) (\s@DocumentGroup' {} a -> s {splitDocuments = a} :: DocumentGroup) Prelude.. Lens.mapping Lens.coerced
+
+-- | The type of document that Amazon Textract has detected. See LINK for a
+-- list of all types returned by Textract.
+documentGroup_type :: Lens.Lens' DocumentGroup (Prelude.Maybe Prelude.Text)
+documentGroup_type = Lens.lens (\DocumentGroup' {type'} -> type') (\s@DocumentGroup' {} a -> s {type' = a} :: DocumentGroup)
+
+-- | A list of any expected signatures not found in a document group.
+documentGroup_undetectedSignatures :: Lens.Lens' DocumentGroup (Prelude.Maybe [UndetectedSignature])
+documentGroup_undetectedSignatures = Lens.lens (\DocumentGroup' {undetectedSignatures} -> undetectedSignatures) (\s@DocumentGroup' {} a -> s {undetectedSignatures = a} :: DocumentGroup) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON DocumentGroup where
+  parseJSON =
+    Data.withObject
+      "DocumentGroup"
+      ( \x ->
+          DocumentGroup'
+            Prelude.<$> ( x
+                            Data..:? "DetectedSignatures"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "SplitDocuments" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "Type")
+            Prelude.<*> ( x
+                            Data..:? "UndetectedSignatures"
+                            Data..!= Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable DocumentGroup where
+  hashWithSalt _salt DocumentGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` detectedSignatures
+      `Prelude.hashWithSalt` splitDocuments
+      `Prelude.hashWithSalt` type'
+      `Prelude.hashWithSalt` undetectedSignatures
+
+instance Prelude.NFData DocumentGroup where
+  rnf DocumentGroup' {..} =
+    Prelude.rnf detectedSignatures
+      `Prelude.seq` Prelude.rnf splitDocuments
+      `Prelude.seq` Prelude.rnf type'
+      `Prelude.seq` Prelude.rnf undetectedSignatures
diff --git a/gen/Amazonka/Textract/Types/DocumentLocation.hs b/gen/Amazonka/Textract/Types/DocumentLocation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/DocumentLocation.hs
@@ -0,0 +1,71 @@
+{-# 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.Textract.Types.DocumentLocation
+-- 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.Textract.Types.DocumentLocation where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Types.S3Object
+
+-- | The Amazon S3 bucket that contains the document to be processed. It\'s
+-- used by asynchronous operations.
+--
+-- The input document can be an image file in JPEG or PNG format. It can
+-- also be a file in PDF format.
+--
+-- /See:/ 'newDocumentLocation' smart constructor.
+data DocumentLocation = DocumentLocation'
+  { -- | The Amazon S3 bucket that contains the input document.
+    s3Object :: Prelude.Maybe S3Object
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DocumentLocation' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 's3Object', 'documentLocation_s3Object' - The Amazon S3 bucket that contains the input document.
+newDocumentLocation ::
+  DocumentLocation
+newDocumentLocation =
+  DocumentLocation' {s3Object = Prelude.Nothing}
+
+-- | The Amazon S3 bucket that contains the input document.
+documentLocation_s3Object :: Lens.Lens' DocumentLocation (Prelude.Maybe S3Object)
+documentLocation_s3Object = Lens.lens (\DocumentLocation' {s3Object} -> s3Object) (\s@DocumentLocation' {} a -> s {s3Object = a} :: DocumentLocation)
+
+instance Prelude.Hashable DocumentLocation where
+  hashWithSalt _salt DocumentLocation' {..} =
+    _salt `Prelude.hashWithSalt` s3Object
+
+instance Prelude.NFData DocumentLocation where
+  rnf DocumentLocation' {..} = Prelude.rnf s3Object
+
+instance Data.ToJSON DocumentLocation where
+  toJSON DocumentLocation' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("S3Object" Data..=) Prelude.<$> s3Object]
+      )
diff --git a/gen/Amazonka/Textract/Types/DocumentMetadata.hs b/gen/Amazonka/Textract/Types/DocumentMetadata.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/DocumentMetadata.hs
@@ -0,0 +1,67 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Textract.Types.DocumentMetadata
+-- 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.Textract.Types.DocumentMetadata where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about the input document.
+--
+-- /See:/ 'newDocumentMetadata' smart constructor.
+data DocumentMetadata = DocumentMetadata'
+  { -- | The number of pages that are detected in the document.
+    pages :: Prelude.Maybe Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DocumentMetadata' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'pages', 'documentMetadata_pages' - The number of pages that are detected in the document.
+newDocumentMetadata ::
+  DocumentMetadata
+newDocumentMetadata =
+  DocumentMetadata' {pages = Prelude.Nothing}
+
+-- | The number of pages that are detected in the document.
+documentMetadata_pages :: Lens.Lens' DocumentMetadata (Prelude.Maybe Prelude.Natural)
+documentMetadata_pages = Lens.lens (\DocumentMetadata' {pages} -> pages) (\s@DocumentMetadata' {} a -> s {pages = a} :: DocumentMetadata)
+
+instance Data.FromJSON DocumentMetadata where
+  parseJSON =
+    Data.withObject
+      "DocumentMetadata"
+      ( \x ->
+          DocumentMetadata' Prelude.<$> (x Data..:? "Pages")
+      )
+
+instance Prelude.Hashable DocumentMetadata where
+  hashWithSalt _salt DocumentMetadata' {..} =
+    _salt `Prelude.hashWithSalt` pages
+
+instance Prelude.NFData DocumentMetadata where
+  rnf DocumentMetadata' {..} = Prelude.rnf pages
diff --git a/gen/Amazonka/Textract/Types/EntityType.hs b/gen/Amazonka/Textract/Types/EntityType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/EntityType.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Textract.Types.EntityType
+-- 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.Textract.Types.EntityType
+  ( EntityType
+      ( ..,
+        EntityType_COLUMN_HEADER,
+        EntityType_KEY,
+        EntityType_VALUE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype EntityType = EntityType'
+  { fromEntityType ::
+      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 EntityType_COLUMN_HEADER :: EntityType
+pattern EntityType_COLUMN_HEADER = EntityType' "COLUMN_HEADER"
+
+pattern EntityType_KEY :: EntityType
+pattern EntityType_KEY = EntityType' "KEY"
+
+pattern EntityType_VALUE :: EntityType
+pattern EntityType_VALUE = EntityType' "VALUE"
+
+{-# COMPLETE
+  EntityType_COLUMN_HEADER,
+  EntityType_KEY,
+  EntityType_VALUE,
+  EntityType'
+  #-}
diff --git a/gen/Amazonka/Textract/Types/ExpenseCurrency.hs b/gen/Amazonka/Textract/Types/ExpenseCurrency.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/ExpenseCurrency.hs
@@ -0,0 +1,156 @@
+{-# 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.Textract.Types.ExpenseCurrency
+-- 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.Textract.Types.ExpenseCurrency 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
+
+-- | Returns the kind of currency detected.
+--
+-- /See:/ 'newExpenseCurrency' smart constructor.
+data ExpenseCurrency = ExpenseCurrency'
+  { -- | Currency code for detected currency. the current supported codes are:
+    --
+    -- -   USD
+    --
+    -- -   EUR
+    --
+    -- -   GBP
+    --
+    -- -   CAD
+    --
+    -- -   INR
+    --
+    -- -   JPY
+    --
+    -- -   CHF
+    --
+    -- -   AUD
+    --
+    -- -   CNY
+    --
+    -- -   BZR
+    --
+    -- -   SEK
+    --
+    -- -   HKD
+    code :: Prelude.Maybe Prelude.Text,
+    -- | Percentage confideence in the detected currency.
+    confidence :: Prelude.Maybe Prelude.Double
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExpenseCurrency' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'code', 'expenseCurrency_code' - Currency code for detected currency. the current supported codes are:
+--
+-- -   USD
+--
+-- -   EUR
+--
+-- -   GBP
+--
+-- -   CAD
+--
+-- -   INR
+--
+-- -   JPY
+--
+-- -   CHF
+--
+-- -   AUD
+--
+-- -   CNY
+--
+-- -   BZR
+--
+-- -   SEK
+--
+-- -   HKD
+--
+-- 'confidence', 'expenseCurrency_confidence' - Percentage confideence in the detected currency.
+newExpenseCurrency ::
+  ExpenseCurrency
+newExpenseCurrency =
+  ExpenseCurrency'
+    { code = Prelude.Nothing,
+      confidence = Prelude.Nothing
+    }
+
+-- | Currency code for detected currency. the current supported codes are:
+--
+-- -   USD
+--
+-- -   EUR
+--
+-- -   GBP
+--
+-- -   CAD
+--
+-- -   INR
+--
+-- -   JPY
+--
+-- -   CHF
+--
+-- -   AUD
+--
+-- -   CNY
+--
+-- -   BZR
+--
+-- -   SEK
+--
+-- -   HKD
+expenseCurrency_code :: Lens.Lens' ExpenseCurrency (Prelude.Maybe Prelude.Text)
+expenseCurrency_code = Lens.lens (\ExpenseCurrency' {code} -> code) (\s@ExpenseCurrency' {} a -> s {code = a} :: ExpenseCurrency)
+
+-- | Percentage confideence in the detected currency.
+expenseCurrency_confidence :: Lens.Lens' ExpenseCurrency (Prelude.Maybe Prelude.Double)
+expenseCurrency_confidence = Lens.lens (\ExpenseCurrency' {confidence} -> confidence) (\s@ExpenseCurrency' {} a -> s {confidence = a} :: ExpenseCurrency)
+
+instance Data.FromJSON ExpenseCurrency where
+  parseJSON =
+    Data.withObject
+      "ExpenseCurrency"
+      ( \x ->
+          ExpenseCurrency'
+            Prelude.<$> (x Data..:? "Code")
+            Prelude.<*> (x Data..:? "Confidence")
+      )
+
+instance Prelude.Hashable ExpenseCurrency where
+  hashWithSalt _salt ExpenseCurrency' {..} =
+    _salt
+      `Prelude.hashWithSalt` code
+      `Prelude.hashWithSalt` confidence
+
+instance Prelude.NFData ExpenseCurrency where
+  rnf ExpenseCurrency' {..} =
+    Prelude.rnf code
+      `Prelude.seq` Prelude.rnf confidence
diff --git a/gen/Amazonka/Textract/Types/ExpenseDetection.hs b/gen/Amazonka/Textract/Types/ExpenseDetection.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/ExpenseDetection.hs
@@ -0,0 +1,97 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Textract.Types.ExpenseDetection
+-- 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.Textract.Types.ExpenseDetection where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Types.Geometry
+
+-- | An object used to store information about the Value or Label detected by
+-- Amazon Textract.
+--
+-- /See:/ 'newExpenseDetection' smart constructor.
+data ExpenseDetection = ExpenseDetection'
+  { -- | The confidence in detection, as a percentage
+    confidence :: Prelude.Maybe Prelude.Double,
+    geometry :: Prelude.Maybe Geometry,
+    -- | The word or line of text recognized by Amazon Textract
+    text :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExpenseDetection' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'confidence', 'expenseDetection_confidence' - The confidence in detection, as a percentage
+--
+-- 'geometry', 'expenseDetection_geometry' - Undocumented member.
+--
+-- 'text', 'expenseDetection_text' - The word or line of text recognized by Amazon Textract
+newExpenseDetection ::
+  ExpenseDetection
+newExpenseDetection =
+  ExpenseDetection'
+    { confidence = Prelude.Nothing,
+      geometry = Prelude.Nothing,
+      text = Prelude.Nothing
+    }
+
+-- | The confidence in detection, as a percentage
+expenseDetection_confidence :: Lens.Lens' ExpenseDetection (Prelude.Maybe Prelude.Double)
+expenseDetection_confidence = Lens.lens (\ExpenseDetection' {confidence} -> confidence) (\s@ExpenseDetection' {} a -> s {confidence = a} :: ExpenseDetection)
+
+-- | Undocumented member.
+expenseDetection_geometry :: Lens.Lens' ExpenseDetection (Prelude.Maybe Geometry)
+expenseDetection_geometry = Lens.lens (\ExpenseDetection' {geometry} -> geometry) (\s@ExpenseDetection' {} a -> s {geometry = a} :: ExpenseDetection)
+
+-- | The word or line of text recognized by Amazon Textract
+expenseDetection_text :: Lens.Lens' ExpenseDetection (Prelude.Maybe Prelude.Text)
+expenseDetection_text = Lens.lens (\ExpenseDetection' {text} -> text) (\s@ExpenseDetection' {} a -> s {text = a} :: ExpenseDetection)
+
+instance Data.FromJSON ExpenseDetection where
+  parseJSON =
+    Data.withObject
+      "ExpenseDetection"
+      ( \x ->
+          ExpenseDetection'
+            Prelude.<$> (x Data..:? "Confidence")
+            Prelude.<*> (x Data..:? "Geometry")
+            Prelude.<*> (x Data..:? "Text")
+      )
+
+instance Prelude.Hashable ExpenseDetection where
+  hashWithSalt _salt ExpenseDetection' {..} =
+    _salt
+      `Prelude.hashWithSalt` confidence
+      `Prelude.hashWithSalt` geometry
+      `Prelude.hashWithSalt` text
+
+instance Prelude.NFData ExpenseDetection where
+  rnf ExpenseDetection' {..} =
+    Prelude.rnf confidence
+      `Prelude.seq` Prelude.rnf geometry
+      `Prelude.seq` Prelude.rnf text
diff --git a/gen/Amazonka/Textract/Types/ExpenseDocument.hs b/gen/Amazonka/Textract/Types/ExpenseDocument.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/ExpenseDocument.hs
@@ -0,0 +1,120 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Textract.Types.ExpenseDocument
+-- 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.Textract.Types.ExpenseDocument where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Types.Block
+import Amazonka.Textract.Types.ExpenseField
+import Amazonka.Textract.Types.LineItemGroup
+
+-- | The structure holding all the information returned by AnalyzeExpense
+--
+-- /See:/ 'newExpenseDocument' smart constructor.
+data ExpenseDocument = ExpenseDocument'
+  { -- | This is a block object, the same as reported when DetectDocumentText is
+    -- run on a document. It provides word level recognition of text.
+    blocks :: Prelude.Maybe [Block],
+    -- | Denotes which invoice or receipt in the document the information is
+    -- coming from. First document will be 1, the second 2, and so on.
+    expenseIndex :: Prelude.Maybe Prelude.Natural,
+    -- | Information detected on each table of a document, seperated into
+    -- @LineItems@.
+    lineItemGroups :: Prelude.Maybe [LineItemGroup],
+    -- | Any information found outside of a table by Amazon Textract.
+    summaryFields :: Prelude.Maybe [ExpenseField]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExpenseDocument' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'blocks', 'expenseDocument_blocks' - This is a block object, the same as reported when DetectDocumentText is
+-- run on a document. It provides word level recognition of text.
+--
+-- 'expenseIndex', 'expenseDocument_expenseIndex' - Denotes which invoice or receipt in the document the information is
+-- coming from. First document will be 1, the second 2, and so on.
+--
+-- 'lineItemGroups', 'expenseDocument_lineItemGroups' - Information detected on each table of a document, seperated into
+-- @LineItems@.
+--
+-- 'summaryFields', 'expenseDocument_summaryFields' - Any information found outside of a table by Amazon Textract.
+newExpenseDocument ::
+  ExpenseDocument
+newExpenseDocument =
+  ExpenseDocument'
+    { blocks = Prelude.Nothing,
+      expenseIndex = Prelude.Nothing,
+      lineItemGroups = Prelude.Nothing,
+      summaryFields = Prelude.Nothing
+    }
+
+-- | This is a block object, the same as reported when DetectDocumentText is
+-- run on a document. It provides word level recognition of text.
+expenseDocument_blocks :: Lens.Lens' ExpenseDocument (Prelude.Maybe [Block])
+expenseDocument_blocks = Lens.lens (\ExpenseDocument' {blocks} -> blocks) (\s@ExpenseDocument' {} a -> s {blocks = a} :: ExpenseDocument) Prelude.. Lens.mapping Lens.coerced
+
+-- | Denotes which invoice or receipt in the document the information is
+-- coming from. First document will be 1, the second 2, and so on.
+expenseDocument_expenseIndex :: Lens.Lens' ExpenseDocument (Prelude.Maybe Prelude.Natural)
+expenseDocument_expenseIndex = Lens.lens (\ExpenseDocument' {expenseIndex} -> expenseIndex) (\s@ExpenseDocument' {} a -> s {expenseIndex = a} :: ExpenseDocument)
+
+-- | Information detected on each table of a document, seperated into
+-- @LineItems@.
+expenseDocument_lineItemGroups :: Lens.Lens' ExpenseDocument (Prelude.Maybe [LineItemGroup])
+expenseDocument_lineItemGroups = Lens.lens (\ExpenseDocument' {lineItemGroups} -> lineItemGroups) (\s@ExpenseDocument' {} a -> s {lineItemGroups = a} :: ExpenseDocument) Prelude.. Lens.mapping Lens.coerced
+
+-- | Any information found outside of a table by Amazon Textract.
+expenseDocument_summaryFields :: Lens.Lens' ExpenseDocument (Prelude.Maybe [ExpenseField])
+expenseDocument_summaryFields = Lens.lens (\ExpenseDocument' {summaryFields} -> summaryFields) (\s@ExpenseDocument' {} a -> s {summaryFields = a} :: ExpenseDocument) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON ExpenseDocument where
+  parseJSON =
+    Data.withObject
+      "ExpenseDocument"
+      ( \x ->
+          ExpenseDocument'
+            Prelude.<$> (x Data..:? "Blocks" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "ExpenseIndex")
+            Prelude.<*> (x Data..:? "LineItemGroups" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "SummaryFields" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable ExpenseDocument where
+  hashWithSalt _salt ExpenseDocument' {..} =
+    _salt
+      `Prelude.hashWithSalt` blocks
+      `Prelude.hashWithSalt` expenseIndex
+      `Prelude.hashWithSalt` lineItemGroups
+      `Prelude.hashWithSalt` summaryFields
+
+instance Prelude.NFData ExpenseDocument where
+  rnf ExpenseDocument' {..} =
+    Prelude.rnf blocks
+      `Prelude.seq` Prelude.rnf expenseIndex
+      `Prelude.seq` Prelude.rnf lineItemGroups
+      `Prelude.seq` Prelude.rnf summaryFields
diff --git a/gen/Amazonka/Textract/Types/ExpenseField.hs b/gen/Amazonka/Textract/Types/ExpenseField.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/ExpenseField.hs
@@ -0,0 +1,155 @@
+{-# 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.Textract.Types.ExpenseField
+-- 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.Textract.Types.ExpenseField where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Types.ExpenseCurrency
+import Amazonka.Textract.Types.ExpenseDetection
+import Amazonka.Textract.Types.ExpenseGroupProperty
+import Amazonka.Textract.Types.ExpenseType
+
+-- | Breakdown of detected information, seperated into the catagories Type,
+-- LabelDetection, and ValueDetection
+--
+-- /See:/ 'newExpenseField' smart constructor.
+data ExpenseField = ExpenseField'
+  { -- | Shows the kind of currency, both the code and confidence associated with
+    -- any monatary value detected.
+    currency :: Prelude.Maybe ExpenseCurrency,
+    -- | Shows which group a response object belongs to, such as whether an
+    -- address line belongs to the vendor\'s address or the recipent\'s
+    -- address.
+    groupProperties :: Prelude.Maybe [ExpenseGroupProperty],
+    -- | The explicitly stated label of a detected element.
+    labelDetection :: Prelude.Maybe ExpenseDetection,
+    -- | The page number the value was detected on.
+    pageNumber :: Prelude.Maybe Prelude.Natural,
+    -- | The implied label of a detected element. Present alongside
+    -- LabelDetection for explicit elements.
+    type' :: Prelude.Maybe ExpenseType,
+    -- | The value of a detected element. Present in explicit and implicit
+    -- elements.
+    valueDetection :: Prelude.Maybe ExpenseDetection
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExpenseField' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'currency', 'expenseField_currency' - Shows the kind of currency, both the code and confidence associated with
+-- any monatary value detected.
+--
+-- 'groupProperties', 'expenseField_groupProperties' - Shows which group a response object belongs to, such as whether an
+-- address line belongs to the vendor\'s address or the recipent\'s
+-- address.
+--
+-- 'labelDetection', 'expenseField_labelDetection' - The explicitly stated label of a detected element.
+--
+-- 'pageNumber', 'expenseField_pageNumber' - The page number the value was detected on.
+--
+-- 'type'', 'expenseField_type' - The implied label of a detected element. Present alongside
+-- LabelDetection for explicit elements.
+--
+-- 'valueDetection', 'expenseField_valueDetection' - The value of a detected element. Present in explicit and implicit
+-- elements.
+newExpenseField ::
+  ExpenseField
+newExpenseField =
+  ExpenseField'
+    { currency = Prelude.Nothing,
+      groupProperties = Prelude.Nothing,
+      labelDetection = Prelude.Nothing,
+      pageNumber = Prelude.Nothing,
+      type' = Prelude.Nothing,
+      valueDetection = Prelude.Nothing
+    }
+
+-- | Shows the kind of currency, both the code and confidence associated with
+-- any monatary value detected.
+expenseField_currency :: Lens.Lens' ExpenseField (Prelude.Maybe ExpenseCurrency)
+expenseField_currency = Lens.lens (\ExpenseField' {currency} -> currency) (\s@ExpenseField' {} a -> s {currency = a} :: ExpenseField)
+
+-- | Shows which group a response object belongs to, such as whether an
+-- address line belongs to the vendor\'s address or the recipent\'s
+-- address.
+expenseField_groupProperties :: Lens.Lens' ExpenseField (Prelude.Maybe [ExpenseGroupProperty])
+expenseField_groupProperties = Lens.lens (\ExpenseField' {groupProperties} -> groupProperties) (\s@ExpenseField' {} a -> s {groupProperties = a} :: ExpenseField) Prelude.. Lens.mapping Lens.coerced
+
+-- | The explicitly stated label of a detected element.
+expenseField_labelDetection :: Lens.Lens' ExpenseField (Prelude.Maybe ExpenseDetection)
+expenseField_labelDetection = Lens.lens (\ExpenseField' {labelDetection} -> labelDetection) (\s@ExpenseField' {} a -> s {labelDetection = a} :: ExpenseField)
+
+-- | The page number the value was detected on.
+expenseField_pageNumber :: Lens.Lens' ExpenseField (Prelude.Maybe Prelude.Natural)
+expenseField_pageNumber = Lens.lens (\ExpenseField' {pageNumber} -> pageNumber) (\s@ExpenseField' {} a -> s {pageNumber = a} :: ExpenseField)
+
+-- | The implied label of a detected element. Present alongside
+-- LabelDetection for explicit elements.
+expenseField_type :: Lens.Lens' ExpenseField (Prelude.Maybe ExpenseType)
+expenseField_type = Lens.lens (\ExpenseField' {type'} -> type') (\s@ExpenseField' {} a -> s {type' = a} :: ExpenseField)
+
+-- | The value of a detected element. Present in explicit and implicit
+-- elements.
+expenseField_valueDetection :: Lens.Lens' ExpenseField (Prelude.Maybe ExpenseDetection)
+expenseField_valueDetection = Lens.lens (\ExpenseField' {valueDetection} -> valueDetection) (\s@ExpenseField' {} a -> s {valueDetection = a} :: ExpenseField)
+
+instance Data.FromJSON ExpenseField where
+  parseJSON =
+    Data.withObject
+      "ExpenseField"
+      ( \x ->
+          ExpenseField'
+            Prelude.<$> (x Data..:? "Currency")
+            Prelude.<*> ( x
+                            Data..:? "GroupProperties"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "LabelDetection")
+            Prelude.<*> (x Data..:? "PageNumber")
+            Prelude.<*> (x Data..:? "Type")
+            Prelude.<*> (x Data..:? "ValueDetection")
+      )
+
+instance Prelude.Hashable ExpenseField where
+  hashWithSalt _salt ExpenseField' {..} =
+    _salt
+      `Prelude.hashWithSalt` currency
+      `Prelude.hashWithSalt` groupProperties
+      `Prelude.hashWithSalt` labelDetection
+      `Prelude.hashWithSalt` pageNumber
+      `Prelude.hashWithSalt` type'
+      `Prelude.hashWithSalt` valueDetection
+
+instance Prelude.NFData ExpenseField where
+  rnf ExpenseField' {..} =
+    Prelude.rnf currency
+      `Prelude.seq` Prelude.rnf groupProperties
+      `Prelude.seq` Prelude.rnf labelDetection
+      `Prelude.seq` Prelude.rnf pageNumber
+      `Prelude.seq` Prelude.rnf type'
+      `Prelude.seq` Prelude.rnf valueDetection
diff --git a/gen/Amazonka/Textract/Types/ExpenseGroupProperty.hs b/gen/Amazonka/Textract/Types/ExpenseGroupProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/ExpenseGroupProperty.hs
@@ -0,0 +1,88 @@
+{-# 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.Textract.Types.ExpenseGroupProperty
+-- 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.Textract.Types.ExpenseGroupProperty 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
+
+-- | Shows the group that a certain key belongs to. This helps differentiate
+-- between names and addresses for different organizations, that can be
+-- hard to determine via JSON response.
+--
+-- /See:/ 'newExpenseGroupProperty' smart constructor.
+data ExpenseGroupProperty = ExpenseGroupProperty'
+  { -- | Provides a group Id number, which will be the same for each in the
+    -- group.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | Informs you on whether the expense group is a name or an address.
+    types :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExpenseGroupProperty' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'expenseGroupProperty_id' - Provides a group Id number, which will be the same for each in the
+-- group.
+--
+-- 'types', 'expenseGroupProperty_types' - Informs you on whether the expense group is a name or an address.
+newExpenseGroupProperty ::
+  ExpenseGroupProperty
+newExpenseGroupProperty =
+  ExpenseGroupProperty'
+    { id = Prelude.Nothing,
+      types = Prelude.Nothing
+    }
+
+-- | Provides a group Id number, which will be the same for each in the
+-- group.
+expenseGroupProperty_id :: Lens.Lens' ExpenseGroupProperty (Prelude.Maybe Prelude.Text)
+expenseGroupProperty_id = Lens.lens (\ExpenseGroupProperty' {id} -> id) (\s@ExpenseGroupProperty' {} a -> s {id = a} :: ExpenseGroupProperty)
+
+-- | Informs you on whether the expense group is a name or an address.
+expenseGroupProperty_types :: Lens.Lens' ExpenseGroupProperty (Prelude.Maybe [Prelude.Text])
+expenseGroupProperty_types = Lens.lens (\ExpenseGroupProperty' {types} -> types) (\s@ExpenseGroupProperty' {} a -> s {types = a} :: ExpenseGroupProperty) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON ExpenseGroupProperty where
+  parseJSON =
+    Data.withObject
+      "ExpenseGroupProperty"
+      ( \x ->
+          ExpenseGroupProperty'
+            Prelude.<$> (x Data..:? "Id")
+            Prelude.<*> (x Data..:? "Types" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable ExpenseGroupProperty where
+  hashWithSalt _salt ExpenseGroupProperty' {..} =
+    _salt
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` types
+
+instance Prelude.NFData ExpenseGroupProperty where
+  rnf ExpenseGroupProperty' {..} =
+    Prelude.rnf id `Prelude.seq` Prelude.rnf types
diff --git a/gen/Amazonka/Textract/Types/ExpenseType.hs b/gen/Amazonka/Textract/Types/ExpenseType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/ExpenseType.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.Textract.Types.ExpenseType
+-- 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.Textract.Types.ExpenseType 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 used to store information about the Type detected by Amazon
+-- Textract.
+--
+-- /See:/ 'newExpenseType' smart constructor.
+data ExpenseType = ExpenseType'
+  { -- | The confidence of accuracy, as a percentage.
+    confidence :: Prelude.Maybe Prelude.Double,
+    -- | The word or line of text detected by Amazon Textract.
+    text :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExpenseType' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'confidence', 'expenseType_confidence' - The confidence of accuracy, as a percentage.
+--
+-- 'text', 'expenseType_text' - The word or line of text detected by Amazon Textract.
+newExpenseType ::
+  ExpenseType
+newExpenseType =
+  ExpenseType'
+    { confidence = Prelude.Nothing,
+      text = Prelude.Nothing
+    }
+
+-- | The confidence of accuracy, as a percentage.
+expenseType_confidence :: Lens.Lens' ExpenseType (Prelude.Maybe Prelude.Double)
+expenseType_confidence = Lens.lens (\ExpenseType' {confidence} -> confidence) (\s@ExpenseType' {} a -> s {confidence = a} :: ExpenseType)
+
+-- | The word or line of text detected by Amazon Textract.
+expenseType_text :: Lens.Lens' ExpenseType (Prelude.Maybe Prelude.Text)
+expenseType_text = Lens.lens (\ExpenseType' {text} -> text) (\s@ExpenseType' {} a -> s {text = a} :: ExpenseType)
+
+instance Data.FromJSON ExpenseType where
+  parseJSON =
+    Data.withObject
+      "ExpenseType"
+      ( \x ->
+          ExpenseType'
+            Prelude.<$> (x Data..:? "Confidence")
+            Prelude.<*> (x Data..:? "Text")
+      )
+
+instance Prelude.Hashable ExpenseType where
+  hashWithSalt _salt ExpenseType' {..} =
+    _salt
+      `Prelude.hashWithSalt` confidence
+      `Prelude.hashWithSalt` text
+
+instance Prelude.NFData ExpenseType where
+  rnf ExpenseType' {..} =
+    Prelude.rnf confidence
+      `Prelude.seq` Prelude.rnf text
diff --git a/gen/Amazonka/Textract/Types/Extraction.hs b/gen/Amazonka/Textract/Types/Extraction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/Extraction.hs
@@ -0,0 +1,101 @@
+{-# 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.Textract.Types.Extraction
+-- 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.Textract.Types.Extraction where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Types.ExpenseDocument
+import Amazonka.Textract.Types.IdentityDocument
+import Amazonka.Textract.Types.LendingDocument
+
+-- | Contains information extracted by an analysis operation after using
+-- StartLendingAnalysis.
+--
+-- /See:/ 'newExtraction' smart constructor.
+data Extraction = Extraction'
+  { expenseDocument :: Prelude.Maybe ExpenseDocument,
+    identityDocument :: Prelude.Maybe IdentityDocument,
+    -- | Holds the structured data returned by AnalyzeDocument for lending
+    -- documents.
+    lendingDocument :: Prelude.Maybe LendingDocument
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Extraction' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'expenseDocument', 'extraction_expenseDocument' - Undocumented member.
+--
+-- 'identityDocument', 'extraction_identityDocument' - Undocumented member.
+--
+-- 'lendingDocument', 'extraction_lendingDocument' - Holds the structured data returned by AnalyzeDocument for lending
+-- documents.
+newExtraction ::
+  Extraction
+newExtraction =
+  Extraction'
+    { expenseDocument = Prelude.Nothing,
+      identityDocument = Prelude.Nothing,
+      lendingDocument = Prelude.Nothing
+    }
+
+-- | Undocumented member.
+extraction_expenseDocument :: Lens.Lens' Extraction (Prelude.Maybe ExpenseDocument)
+extraction_expenseDocument = Lens.lens (\Extraction' {expenseDocument} -> expenseDocument) (\s@Extraction' {} a -> s {expenseDocument = a} :: Extraction)
+
+-- | Undocumented member.
+extraction_identityDocument :: Lens.Lens' Extraction (Prelude.Maybe IdentityDocument)
+extraction_identityDocument = Lens.lens (\Extraction' {identityDocument} -> identityDocument) (\s@Extraction' {} a -> s {identityDocument = a} :: Extraction)
+
+-- | Holds the structured data returned by AnalyzeDocument for lending
+-- documents.
+extraction_lendingDocument :: Lens.Lens' Extraction (Prelude.Maybe LendingDocument)
+extraction_lendingDocument = Lens.lens (\Extraction' {lendingDocument} -> lendingDocument) (\s@Extraction' {} a -> s {lendingDocument = a} :: Extraction)
+
+instance Data.FromJSON Extraction where
+  parseJSON =
+    Data.withObject
+      "Extraction"
+      ( \x ->
+          Extraction'
+            Prelude.<$> (x Data..:? "ExpenseDocument")
+            Prelude.<*> (x Data..:? "IdentityDocument")
+            Prelude.<*> (x Data..:? "LendingDocument")
+      )
+
+instance Prelude.Hashable Extraction where
+  hashWithSalt _salt Extraction' {..} =
+    _salt
+      `Prelude.hashWithSalt` expenseDocument
+      `Prelude.hashWithSalt` identityDocument
+      `Prelude.hashWithSalt` lendingDocument
+
+instance Prelude.NFData Extraction where
+  rnf Extraction' {..} =
+    Prelude.rnf expenseDocument
+      `Prelude.seq` Prelude.rnf identityDocument
+      `Prelude.seq` Prelude.rnf lendingDocument
diff --git a/gen/Amazonka/Textract/Types/FeatureType.hs b/gen/Amazonka/Textract/Types/FeatureType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/FeatureType.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.Textract.Types.FeatureType
+-- 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.Textract.Types.FeatureType
+  ( FeatureType
+      ( ..,
+        FeatureType_FORMS,
+        FeatureType_QUERIES,
+        FeatureType_SIGNATURES,
+        FeatureType_TABLES
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype FeatureType = FeatureType'
+  { fromFeatureType ::
+      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 FeatureType_FORMS :: FeatureType
+pattern FeatureType_FORMS = FeatureType' "FORMS"
+
+pattern FeatureType_QUERIES :: FeatureType
+pattern FeatureType_QUERIES = FeatureType' "QUERIES"
+
+pattern FeatureType_SIGNATURES :: FeatureType
+pattern FeatureType_SIGNATURES = FeatureType' "SIGNATURES"
+
+pattern FeatureType_TABLES :: FeatureType
+pattern FeatureType_TABLES = FeatureType' "TABLES"
+
+{-# COMPLETE
+  FeatureType_FORMS,
+  FeatureType_QUERIES,
+  FeatureType_SIGNATURES,
+  FeatureType_TABLES,
+  FeatureType'
+  #-}
diff --git a/gen/Amazonka/Textract/Types/Geometry.hs b/gen/Amazonka/Textract/Types/Geometry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/Geometry.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.Textract.Types.Geometry
+-- 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.Textract.Types.Geometry where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Types.BoundingBox
+import Amazonka.Textract.Types.Point
+
+-- | Information about where the following items are located on a document
+-- page: detected page, text, key-value pairs, tables, table cells, and
+-- selection elements.
+--
+-- /See:/ 'newGeometry' smart constructor.
+data Geometry = Geometry'
+  { -- | An axis-aligned coarse representation of the location of the recognized
+    -- item on the document page.
+    boundingBox :: Prelude.Maybe BoundingBox,
+    -- | Within the bounding box, a fine-grained polygon around the recognized
+    -- item.
+    polygon :: Prelude.Maybe [Point]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Geometry' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'boundingBox', 'geometry_boundingBox' - An axis-aligned coarse representation of the location of the recognized
+-- item on the document page.
+--
+-- 'polygon', 'geometry_polygon' - Within the bounding box, a fine-grained polygon around the recognized
+-- item.
+newGeometry ::
+  Geometry
+newGeometry =
+  Geometry'
+    { boundingBox = Prelude.Nothing,
+      polygon = Prelude.Nothing
+    }
+
+-- | An axis-aligned coarse representation of the location of the recognized
+-- item on the document page.
+geometry_boundingBox :: Lens.Lens' Geometry (Prelude.Maybe BoundingBox)
+geometry_boundingBox = Lens.lens (\Geometry' {boundingBox} -> boundingBox) (\s@Geometry' {} a -> s {boundingBox = a} :: Geometry)
+
+-- | Within the bounding box, a fine-grained polygon around the recognized
+-- item.
+geometry_polygon :: Lens.Lens' Geometry (Prelude.Maybe [Point])
+geometry_polygon = Lens.lens (\Geometry' {polygon} -> polygon) (\s@Geometry' {} a -> s {polygon = a} :: Geometry) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON Geometry where
+  parseJSON =
+    Data.withObject
+      "Geometry"
+      ( \x ->
+          Geometry'
+            Prelude.<$> (x Data..:? "BoundingBox")
+            Prelude.<*> (x Data..:? "Polygon" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable Geometry where
+  hashWithSalt _salt Geometry' {..} =
+    _salt
+      `Prelude.hashWithSalt` boundingBox
+      `Prelude.hashWithSalt` polygon
+
+instance Prelude.NFData Geometry where
+  rnf Geometry' {..} =
+    Prelude.rnf boundingBox
+      `Prelude.seq` Prelude.rnf polygon
diff --git a/gen/Amazonka/Textract/Types/HumanLoopActivationOutput.hs b/gen/Amazonka/Textract/Types/HumanLoopActivationOutput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/HumanLoopActivationOutput.hs
@@ -0,0 +1,104 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Textract.Types.HumanLoopActivationOutput
+-- 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.Textract.Types.HumanLoopActivationOutput 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
+
+-- | Shows the results of the human in the loop evaluation. If there is no
+-- HumanLoopArn, the input did not trigger human review.
+--
+-- /See:/ 'newHumanLoopActivationOutput' smart constructor.
+data HumanLoopActivationOutput = HumanLoopActivationOutput'
+  { -- | Shows the result of condition evaluations, including those conditions
+    -- which activated a human review.
+    humanLoopActivationConditionsEvaluationResults :: Prelude.Maybe Prelude.Text,
+    -- | Shows if and why human review was needed.
+    humanLoopActivationReasons :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text),
+    -- | The Amazon Resource Name (ARN) of the HumanLoop created.
+    humanLoopArn :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'HumanLoopActivationOutput' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'humanLoopActivationConditionsEvaluationResults', 'humanLoopActivationOutput_humanLoopActivationConditionsEvaluationResults' - Shows the result of condition evaluations, including those conditions
+-- which activated a human review.
+--
+-- 'humanLoopActivationReasons', 'humanLoopActivationOutput_humanLoopActivationReasons' - Shows if and why human review was needed.
+--
+-- 'humanLoopArn', 'humanLoopActivationOutput_humanLoopArn' - The Amazon Resource Name (ARN) of the HumanLoop created.
+newHumanLoopActivationOutput ::
+  HumanLoopActivationOutput
+newHumanLoopActivationOutput =
+  HumanLoopActivationOutput'
+    { humanLoopActivationConditionsEvaluationResults =
+        Prelude.Nothing,
+      humanLoopActivationReasons = Prelude.Nothing,
+      humanLoopArn = Prelude.Nothing
+    }
+
+-- | Shows the result of condition evaluations, including those conditions
+-- which activated a human review.
+humanLoopActivationOutput_humanLoopActivationConditionsEvaluationResults :: Lens.Lens' HumanLoopActivationOutput (Prelude.Maybe Prelude.Text)
+humanLoopActivationOutput_humanLoopActivationConditionsEvaluationResults = Lens.lens (\HumanLoopActivationOutput' {humanLoopActivationConditionsEvaluationResults} -> humanLoopActivationConditionsEvaluationResults) (\s@HumanLoopActivationOutput' {} a -> s {humanLoopActivationConditionsEvaluationResults = a} :: HumanLoopActivationOutput)
+
+-- | Shows if and why human review was needed.
+humanLoopActivationOutput_humanLoopActivationReasons :: Lens.Lens' HumanLoopActivationOutput (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+humanLoopActivationOutput_humanLoopActivationReasons = Lens.lens (\HumanLoopActivationOutput' {humanLoopActivationReasons} -> humanLoopActivationReasons) (\s@HumanLoopActivationOutput' {} a -> s {humanLoopActivationReasons = a} :: HumanLoopActivationOutput) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Amazon Resource Name (ARN) of the HumanLoop created.
+humanLoopActivationOutput_humanLoopArn :: Lens.Lens' HumanLoopActivationOutput (Prelude.Maybe Prelude.Text)
+humanLoopActivationOutput_humanLoopArn = Lens.lens (\HumanLoopActivationOutput' {humanLoopArn} -> humanLoopArn) (\s@HumanLoopActivationOutput' {} a -> s {humanLoopArn = a} :: HumanLoopActivationOutput)
+
+instance Data.FromJSON HumanLoopActivationOutput where
+  parseJSON =
+    Data.withObject
+      "HumanLoopActivationOutput"
+      ( \x ->
+          HumanLoopActivationOutput'
+            Prelude.<$> ( x
+                            Data..:? "HumanLoopActivationConditionsEvaluationResults"
+                        )
+            Prelude.<*> (x Data..:? "HumanLoopActivationReasons")
+            Prelude.<*> (x Data..:? "HumanLoopArn")
+      )
+
+instance Prelude.Hashable HumanLoopActivationOutput where
+  hashWithSalt _salt HumanLoopActivationOutput' {..} =
+    _salt
+      `Prelude.hashWithSalt` humanLoopActivationConditionsEvaluationResults
+      `Prelude.hashWithSalt` humanLoopActivationReasons
+      `Prelude.hashWithSalt` humanLoopArn
+
+instance Prelude.NFData HumanLoopActivationOutput where
+  rnf HumanLoopActivationOutput' {..} =
+    Prelude.rnf
+      humanLoopActivationConditionsEvaluationResults
+      `Prelude.seq` Prelude.rnf humanLoopActivationReasons
+      `Prelude.seq` Prelude.rnf humanLoopArn
diff --git a/gen/Amazonka/Textract/Types/HumanLoopConfig.hs b/gen/Amazonka/Textract/Types/HumanLoopConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/HumanLoopConfig.hs
@@ -0,0 +1,109 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Textract.Types.HumanLoopConfig
+-- 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.Textract.Types.HumanLoopConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Types.HumanLoopDataAttributes
+
+-- | Sets up the human review workflow the document will be sent to if one of
+-- the conditions is met. You can also set certain attributes of the image
+-- before review.
+--
+-- /See:/ 'newHumanLoopConfig' smart constructor.
+data HumanLoopConfig = HumanLoopConfig'
+  { -- | Sets attributes of the input data.
+    dataAttributes :: Prelude.Maybe HumanLoopDataAttributes,
+    -- | The name of the human workflow used for this image. This should be kept
+    -- unique within a region.
+    humanLoopName :: Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the flow definition.
+    flowDefinitionArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'HumanLoopConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'dataAttributes', 'humanLoopConfig_dataAttributes' - Sets attributes of the input data.
+--
+-- 'humanLoopName', 'humanLoopConfig_humanLoopName' - The name of the human workflow used for this image. This should be kept
+-- unique within a region.
+--
+-- 'flowDefinitionArn', 'humanLoopConfig_flowDefinitionArn' - The Amazon Resource Name (ARN) of the flow definition.
+newHumanLoopConfig ::
+  -- | 'humanLoopName'
+  Prelude.Text ->
+  -- | 'flowDefinitionArn'
+  Prelude.Text ->
+  HumanLoopConfig
+newHumanLoopConfig
+  pHumanLoopName_
+  pFlowDefinitionArn_ =
+    HumanLoopConfig'
+      { dataAttributes = Prelude.Nothing,
+        humanLoopName = pHumanLoopName_,
+        flowDefinitionArn = pFlowDefinitionArn_
+      }
+
+-- | Sets attributes of the input data.
+humanLoopConfig_dataAttributes :: Lens.Lens' HumanLoopConfig (Prelude.Maybe HumanLoopDataAttributes)
+humanLoopConfig_dataAttributes = Lens.lens (\HumanLoopConfig' {dataAttributes} -> dataAttributes) (\s@HumanLoopConfig' {} a -> s {dataAttributes = a} :: HumanLoopConfig)
+
+-- | The name of the human workflow used for this image. This should be kept
+-- unique within a region.
+humanLoopConfig_humanLoopName :: Lens.Lens' HumanLoopConfig Prelude.Text
+humanLoopConfig_humanLoopName = Lens.lens (\HumanLoopConfig' {humanLoopName} -> humanLoopName) (\s@HumanLoopConfig' {} a -> s {humanLoopName = a} :: HumanLoopConfig)
+
+-- | The Amazon Resource Name (ARN) of the flow definition.
+humanLoopConfig_flowDefinitionArn :: Lens.Lens' HumanLoopConfig Prelude.Text
+humanLoopConfig_flowDefinitionArn = Lens.lens (\HumanLoopConfig' {flowDefinitionArn} -> flowDefinitionArn) (\s@HumanLoopConfig' {} a -> s {flowDefinitionArn = a} :: HumanLoopConfig)
+
+instance Prelude.Hashable HumanLoopConfig where
+  hashWithSalt _salt HumanLoopConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` dataAttributes
+      `Prelude.hashWithSalt` humanLoopName
+      `Prelude.hashWithSalt` flowDefinitionArn
+
+instance Prelude.NFData HumanLoopConfig where
+  rnf HumanLoopConfig' {..} =
+    Prelude.rnf dataAttributes
+      `Prelude.seq` Prelude.rnf humanLoopName
+      `Prelude.seq` Prelude.rnf flowDefinitionArn
+
+instance Data.ToJSON HumanLoopConfig where
+  toJSON HumanLoopConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("DataAttributes" Data..=)
+              Prelude.<$> dataAttributes,
+            Prelude.Just ("HumanLoopName" Data..= humanLoopName),
+            Prelude.Just
+              ("FlowDefinitionArn" Data..= flowDefinitionArn)
+          ]
+      )
diff --git a/gen/Amazonka/Textract/Types/HumanLoopDataAttributes.hs b/gen/Amazonka/Textract/Types/HumanLoopDataAttributes.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/HumanLoopDataAttributes.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.Textract.Types.HumanLoopDataAttributes
+-- 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.Textract.Types.HumanLoopDataAttributes where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Types.ContentClassifier
+
+-- | Allows you to set attributes of the image. Currently, you can declare an
+-- image as free of personally identifiable information and adult content.
+--
+-- /See:/ 'newHumanLoopDataAttributes' smart constructor.
+data HumanLoopDataAttributes = HumanLoopDataAttributes'
+  { -- | Sets whether the input image is free of personally identifiable
+    -- information or adult content.
+    contentClassifiers :: Prelude.Maybe [ContentClassifier]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'HumanLoopDataAttributes' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'contentClassifiers', 'humanLoopDataAttributes_contentClassifiers' - Sets whether the input image is free of personally identifiable
+-- information or adult content.
+newHumanLoopDataAttributes ::
+  HumanLoopDataAttributes
+newHumanLoopDataAttributes =
+  HumanLoopDataAttributes'
+    { contentClassifiers =
+        Prelude.Nothing
+    }
+
+-- | Sets whether the input image is free of personally identifiable
+-- information or adult content.
+humanLoopDataAttributes_contentClassifiers :: Lens.Lens' HumanLoopDataAttributes (Prelude.Maybe [ContentClassifier])
+humanLoopDataAttributes_contentClassifiers = Lens.lens (\HumanLoopDataAttributes' {contentClassifiers} -> contentClassifiers) (\s@HumanLoopDataAttributes' {} a -> s {contentClassifiers = a} :: HumanLoopDataAttributes) Prelude.. Lens.mapping Lens.coerced
+
+instance Prelude.Hashable HumanLoopDataAttributes where
+  hashWithSalt _salt HumanLoopDataAttributes' {..} =
+    _salt `Prelude.hashWithSalt` contentClassifiers
+
+instance Prelude.NFData HumanLoopDataAttributes where
+  rnf HumanLoopDataAttributes' {..} =
+    Prelude.rnf contentClassifiers
+
+instance Data.ToJSON HumanLoopDataAttributes where
+  toJSON HumanLoopDataAttributes' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ContentClassifiers" Data..=)
+              Prelude.<$> contentClassifiers
+          ]
+      )
diff --git a/gen/Amazonka/Textract/Types/IdentityDocument.hs b/gen/Amazonka/Textract/Types/IdentityDocument.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/IdentityDocument.hs
@@ -0,0 +1,111 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Textract.Types.IdentityDocument
+-- 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.Textract.Types.IdentityDocument where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Types.Block
+import Amazonka.Textract.Types.IdentityDocumentField
+
+-- | The structure that lists each document processed in an AnalyzeID
+-- operation.
+--
+-- /See:/ 'newIdentityDocument' smart constructor.
+data IdentityDocument = IdentityDocument'
+  { -- | Individual word recognition, as returned by document detection.
+    blocks :: Prelude.Maybe [Block],
+    -- | Denotes the placement of a document in the IdentityDocument list. The
+    -- first document is marked 1, the second 2 and so on.
+    documentIndex :: Prelude.Maybe Prelude.Natural,
+    -- | The structure used to record information extracted from identity
+    -- documents. Contains both normalized field and value of the extracted
+    -- text.
+    identityDocumentFields :: Prelude.Maybe [IdentityDocumentField]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'IdentityDocument' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'blocks', 'identityDocument_blocks' - Individual word recognition, as returned by document detection.
+--
+-- 'documentIndex', 'identityDocument_documentIndex' - Denotes the placement of a document in the IdentityDocument list. The
+-- first document is marked 1, the second 2 and so on.
+--
+-- 'identityDocumentFields', 'identityDocument_identityDocumentFields' - The structure used to record information extracted from identity
+-- documents. Contains both normalized field and value of the extracted
+-- text.
+newIdentityDocument ::
+  IdentityDocument
+newIdentityDocument =
+  IdentityDocument'
+    { blocks = Prelude.Nothing,
+      documentIndex = Prelude.Nothing,
+      identityDocumentFields = Prelude.Nothing
+    }
+
+-- | Individual word recognition, as returned by document detection.
+identityDocument_blocks :: Lens.Lens' IdentityDocument (Prelude.Maybe [Block])
+identityDocument_blocks = Lens.lens (\IdentityDocument' {blocks} -> blocks) (\s@IdentityDocument' {} a -> s {blocks = a} :: IdentityDocument) Prelude.. Lens.mapping Lens.coerced
+
+-- | Denotes the placement of a document in the IdentityDocument list. The
+-- first document is marked 1, the second 2 and so on.
+identityDocument_documentIndex :: Lens.Lens' IdentityDocument (Prelude.Maybe Prelude.Natural)
+identityDocument_documentIndex = Lens.lens (\IdentityDocument' {documentIndex} -> documentIndex) (\s@IdentityDocument' {} a -> s {documentIndex = a} :: IdentityDocument)
+
+-- | The structure used to record information extracted from identity
+-- documents. Contains both normalized field and value of the extracted
+-- text.
+identityDocument_identityDocumentFields :: Lens.Lens' IdentityDocument (Prelude.Maybe [IdentityDocumentField])
+identityDocument_identityDocumentFields = Lens.lens (\IdentityDocument' {identityDocumentFields} -> identityDocumentFields) (\s@IdentityDocument' {} a -> s {identityDocumentFields = a} :: IdentityDocument) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON IdentityDocument where
+  parseJSON =
+    Data.withObject
+      "IdentityDocument"
+      ( \x ->
+          IdentityDocument'
+            Prelude.<$> (x Data..:? "Blocks" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "DocumentIndex")
+            Prelude.<*> ( x
+                            Data..:? "IdentityDocumentFields"
+                            Data..!= Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable IdentityDocument where
+  hashWithSalt _salt IdentityDocument' {..} =
+    _salt
+      `Prelude.hashWithSalt` blocks
+      `Prelude.hashWithSalt` documentIndex
+      `Prelude.hashWithSalt` identityDocumentFields
+
+instance Prelude.NFData IdentityDocument where
+  rnf IdentityDocument' {..} =
+    Prelude.rnf blocks
+      `Prelude.seq` Prelude.rnf documentIndex
+      `Prelude.seq` Prelude.rnf identityDocumentFields
diff --git a/gen/Amazonka/Textract/Types/IdentityDocumentField.hs b/gen/Amazonka/Textract/Types/IdentityDocumentField.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/IdentityDocumentField.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.Textract.Types.IdentityDocumentField
+-- 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.Textract.Types.IdentityDocumentField where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Types.AnalyzeIDDetections
+
+-- | Structure containing both the normalized type of the extracted
+-- information and the text associated with it. These are extracted as Type
+-- and Value respectively.
+--
+-- /See:/ 'newIdentityDocumentField' smart constructor.
+data IdentityDocumentField = IdentityDocumentField'
+  { type' :: Prelude.Maybe AnalyzeIDDetections,
+    valueDetection :: Prelude.Maybe AnalyzeIDDetections
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'IdentityDocumentField' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'type'', 'identityDocumentField_type' - Undocumented member.
+--
+-- 'valueDetection', 'identityDocumentField_valueDetection' - Undocumented member.
+newIdentityDocumentField ::
+  IdentityDocumentField
+newIdentityDocumentField =
+  IdentityDocumentField'
+    { type' = Prelude.Nothing,
+      valueDetection = Prelude.Nothing
+    }
+
+-- | Undocumented member.
+identityDocumentField_type :: Lens.Lens' IdentityDocumentField (Prelude.Maybe AnalyzeIDDetections)
+identityDocumentField_type = Lens.lens (\IdentityDocumentField' {type'} -> type') (\s@IdentityDocumentField' {} a -> s {type' = a} :: IdentityDocumentField)
+
+-- | Undocumented member.
+identityDocumentField_valueDetection :: Lens.Lens' IdentityDocumentField (Prelude.Maybe AnalyzeIDDetections)
+identityDocumentField_valueDetection = Lens.lens (\IdentityDocumentField' {valueDetection} -> valueDetection) (\s@IdentityDocumentField' {} a -> s {valueDetection = a} :: IdentityDocumentField)
+
+instance Data.FromJSON IdentityDocumentField where
+  parseJSON =
+    Data.withObject
+      "IdentityDocumentField"
+      ( \x ->
+          IdentityDocumentField'
+            Prelude.<$> (x Data..:? "Type")
+            Prelude.<*> (x Data..:? "ValueDetection")
+      )
+
+instance Prelude.Hashable IdentityDocumentField where
+  hashWithSalt _salt IdentityDocumentField' {..} =
+    _salt
+      `Prelude.hashWithSalt` type'
+      `Prelude.hashWithSalt` valueDetection
+
+instance Prelude.NFData IdentityDocumentField where
+  rnf IdentityDocumentField' {..} =
+    Prelude.rnf type'
+      `Prelude.seq` Prelude.rnf valueDetection
diff --git a/gen/Amazonka/Textract/Types/JobStatus.hs b/gen/Amazonka/Textract/Types/JobStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/JobStatus.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.Textract.Types.JobStatus
+-- 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.Textract.Types.JobStatus
+  ( JobStatus
+      ( ..,
+        JobStatus_FAILED,
+        JobStatus_IN_PROGRESS,
+        JobStatus_PARTIAL_SUCCESS,
+        JobStatus_SUCCEEDED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype JobStatus = JobStatus'
+  { fromJobStatus ::
+      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 JobStatus_FAILED :: JobStatus
+pattern JobStatus_FAILED = JobStatus' "FAILED"
+
+pattern JobStatus_IN_PROGRESS :: JobStatus
+pattern JobStatus_IN_PROGRESS = JobStatus' "IN_PROGRESS"
+
+pattern JobStatus_PARTIAL_SUCCESS :: JobStatus
+pattern JobStatus_PARTIAL_SUCCESS = JobStatus' "PARTIAL_SUCCESS"
+
+pattern JobStatus_SUCCEEDED :: JobStatus
+pattern JobStatus_SUCCEEDED = JobStatus' "SUCCEEDED"
+
+{-# COMPLETE
+  JobStatus_FAILED,
+  JobStatus_IN_PROGRESS,
+  JobStatus_PARTIAL_SUCCESS,
+  JobStatus_SUCCEEDED,
+  JobStatus'
+  #-}
diff --git a/gen/Amazonka/Textract/Types/LendingDetection.hs b/gen/Amazonka/Textract/Types/LendingDetection.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/LendingDetection.hs
@@ -0,0 +1,115 @@
+{-# 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.Textract.Types.LendingDetection
+-- 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.Textract.Types.LendingDetection where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Types.Geometry
+import Amazonka.Textract.Types.SelectionStatus
+
+-- | The results extracted for a lending document.
+--
+-- /See:/ 'newLendingDetection' smart constructor.
+data LendingDetection = LendingDetection'
+  { -- | The confidence level for the text of a detected value in a lending
+    -- document.
+    confidence :: Prelude.Maybe Prelude.Double,
+    geometry :: Prelude.Maybe Geometry,
+    -- | The selection status of a selection element, such as an option button or
+    -- check box.
+    selectionStatus :: Prelude.Maybe SelectionStatus,
+    -- | The text extracted for a detected value in a lending document.
+    text :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LendingDetection' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'confidence', 'lendingDetection_confidence' - The confidence level for the text of a detected value in a lending
+-- document.
+--
+-- 'geometry', 'lendingDetection_geometry' - Undocumented member.
+--
+-- 'selectionStatus', 'lendingDetection_selectionStatus' - The selection status of a selection element, such as an option button or
+-- check box.
+--
+-- 'text', 'lendingDetection_text' - The text extracted for a detected value in a lending document.
+newLendingDetection ::
+  LendingDetection
+newLendingDetection =
+  LendingDetection'
+    { confidence = Prelude.Nothing,
+      geometry = Prelude.Nothing,
+      selectionStatus = Prelude.Nothing,
+      text = Prelude.Nothing
+    }
+
+-- | The confidence level for the text of a detected value in a lending
+-- document.
+lendingDetection_confidence :: Lens.Lens' LendingDetection (Prelude.Maybe Prelude.Double)
+lendingDetection_confidence = Lens.lens (\LendingDetection' {confidence} -> confidence) (\s@LendingDetection' {} a -> s {confidence = a} :: LendingDetection)
+
+-- | Undocumented member.
+lendingDetection_geometry :: Lens.Lens' LendingDetection (Prelude.Maybe Geometry)
+lendingDetection_geometry = Lens.lens (\LendingDetection' {geometry} -> geometry) (\s@LendingDetection' {} a -> s {geometry = a} :: LendingDetection)
+
+-- | The selection status of a selection element, such as an option button or
+-- check box.
+lendingDetection_selectionStatus :: Lens.Lens' LendingDetection (Prelude.Maybe SelectionStatus)
+lendingDetection_selectionStatus = Lens.lens (\LendingDetection' {selectionStatus} -> selectionStatus) (\s@LendingDetection' {} a -> s {selectionStatus = a} :: LendingDetection)
+
+-- | The text extracted for a detected value in a lending document.
+lendingDetection_text :: Lens.Lens' LendingDetection (Prelude.Maybe Prelude.Text)
+lendingDetection_text = Lens.lens (\LendingDetection' {text} -> text) (\s@LendingDetection' {} a -> s {text = a} :: LendingDetection)
+
+instance Data.FromJSON LendingDetection where
+  parseJSON =
+    Data.withObject
+      "LendingDetection"
+      ( \x ->
+          LendingDetection'
+            Prelude.<$> (x Data..:? "Confidence")
+            Prelude.<*> (x Data..:? "Geometry")
+            Prelude.<*> (x Data..:? "SelectionStatus")
+            Prelude.<*> (x Data..:? "Text")
+      )
+
+instance Prelude.Hashable LendingDetection where
+  hashWithSalt _salt LendingDetection' {..} =
+    _salt
+      `Prelude.hashWithSalt` confidence
+      `Prelude.hashWithSalt` geometry
+      `Prelude.hashWithSalt` selectionStatus
+      `Prelude.hashWithSalt` text
+
+instance Prelude.NFData LendingDetection where
+  rnf LendingDetection' {..} =
+    Prelude.rnf confidence
+      `Prelude.seq` Prelude.rnf geometry
+      `Prelude.seq` Prelude.rnf selectionStatus
+      `Prelude.seq` Prelude.rnf text
diff --git a/gen/Amazonka/Textract/Types/LendingDocument.hs b/gen/Amazonka/Textract/Types/LendingDocument.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/LendingDocument.hs
@@ -0,0 +1,90 @@
+{-# 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.Textract.Types.LendingDocument
+-- 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.Textract.Types.LendingDocument where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Types.LendingField
+import Amazonka.Textract.Types.SignatureDetection
+
+-- | Holds the structured data returned by AnalyzeDocument for lending
+-- documents.
+--
+-- /See:/ 'newLendingDocument' smart constructor.
+data LendingDocument = LendingDocument'
+  { -- | An array of LendingField objects.
+    lendingFields :: Prelude.Maybe [LendingField],
+    -- | A list of signatures detected in a lending document.
+    signatureDetections :: Prelude.Maybe [SignatureDetection]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LendingDocument' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'lendingFields', 'lendingDocument_lendingFields' - An array of LendingField objects.
+--
+-- 'signatureDetections', 'lendingDocument_signatureDetections' - A list of signatures detected in a lending document.
+newLendingDocument ::
+  LendingDocument
+newLendingDocument =
+  LendingDocument'
+    { lendingFields = Prelude.Nothing,
+      signatureDetections = Prelude.Nothing
+    }
+
+-- | An array of LendingField objects.
+lendingDocument_lendingFields :: Lens.Lens' LendingDocument (Prelude.Maybe [LendingField])
+lendingDocument_lendingFields = Lens.lens (\LendingDocument' {lendingFields} -> lendingFields) (\s@LendingDocument' {} a -> s {lendingFields = a} :: LendingDocument) Prelude.. Lens.mapping Lens.coerced
+
+-- | A list of signatures detected in a lending document.
+lendingDocument_signatureDetections :: Lens.Lens' LendingDocument (Prelude.Maybe [SignatureDetection])
+lendingDocument_signatureDetections = Lens.lens (\LendingDocument' {signatureDetections} -> signatureDetections) (\s@LendingDocument' {} a -> s {signatureDetections = a} :: LendingDocument) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON LendingDocument where
+  parseJSON =
+    Data.withObject
+      "LendingDocument"
+      ( \x ->
+          LendingDocument'
+            Prelude.<$> (x Data..:? "LendingFields" Data..!= Prelude.mempty)
+            Prelude.<*> ( x
+                            Data..:? "SignatureDetections"
+                            Data..!= Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable LendingDocument where
+  hashWithSalt _salt LendingDocument' {..} =
+    _salt
+      `Prelude.hashWithSalt` lendingFields
+      `Prelude.hashWithSalt` signatureDetections
+
+instance Prelude.NFData LendingDocument where
+  rnf LendingDocument' {..} =
+    Prelude.rnf lendingFields
+      `Prelude.seq` Prelude.rnf signatureDetections
diff --git a/gen/Amazonka/Textract/Types/LendingField.hs b/gen/Amazonka/Textract/Types/LendingField.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/LendingField.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.Textract.Types.LendingField
+-- 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.Textract.Types.LendingField where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Types.LendingDetection
+
+-- | Holds the normalized key-value pairs returned by AnalyzeDocument,
+-- including the document type, detected text, and geometry.
+--
+-- /See:/ 'newLendingField' smart constructor.
+data LendingField = LendingField'
+  { keyDetection :: Prelude.Maybe LendingDetection,
+    -- | The type of the lending document.
+    type' :: Prelude.Maybe Prelude.Text,
+    -- | An array of LendingDetection objects.
+    valueDetections :: Prelude.Maybe [LendingDetection]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LendingField' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'keyDetection', 'lendingField_keyDetection' - Undocumented member.
+--
+-- 'type'', 'lendingField_type' - The type of the lending document.
+--
+-- 'valueDetections', 'lendingField_valueDetections' - An array of LendingDetection objects.
+newLendingField ::
+  LendingField
+newLendingField =
+  LendingField'
+    { keyDetection = Prelude.Nothing,
+      type' = Prelude.Nothing,
+      valueDetections = Prelude.Nothing
+    }
+
+-- | Undocumented member.
+lendingField_keyDetection :: Lens.Lens' LendingField (Prelude.Maybe LendingDetection)
+lendingField_keyDetection = Lens.lens (\LendingField' {keyDetection} -> keyDetection) (\s@LendingField' {} a -> s {keyDetection = a} :: LendingField)
+
+-- | The type of the lending document.
+lendingField_type :: Lens.Lens' LendingField (Prelude.Maybe Prelude.Text)
+lendingField_type = Lens.lens (\LendingField' {type'} -> type') (\s@LendingField' {} a -> s {type' = a} :: LendingField)
+
+-- | An array of LendingDetection objects.
+lendingField_valueDetections :: Lens.Lens' LendingField (Prelude.Maybe [LendingDetection])
+lendingField_valueDetections = Lens.lens (\LendingField' {valueDetections} -> valueDetections) (\s@LendingField' {} a -> s {valueDetections = a} :: LendingField) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON LendingField where
+  parseJSON =
+    Data.withObject
+      "LendingField"
+      ( \x ->
+          LendingField'
+            Prelude.<$> (x Data..:? "KeyDetection")
+            Prelude.<*> (x Data..:? "Type")
+            Prelude.<*> ( x
+                            Data..:? "ValueDetections"
+                            Data..!= Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable LendingField where
+  hashWithSalt _salt LendingField' {..} =
+    _salt
+      `Prelude.hashWithSalt` keyDetection
+      `Prelude.hashWithSalt` type'
+      `Prelude.hashWithSalt` valueDetections
+
+instance Prelude.NFData LendingField where
+  rnf LendingField' {..} =
+    Prelude.rnf keyDetection
+      `Prelude.seq` Prelude.rnf type'
+      `Prelude.seq` Prelude.rnf valueDetections
diff --git a/gen/Amazonka/Textract/Types/LendingResult.hs b/gen/Amazonka/Textract/Types/LendingResult.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/LendingResult.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.Textract.Types.LendingResult
+-- 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.Textract.Types.LendingResult where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Types.Extraction
+import Amazonka.Textract.Types.PageClassification
+
+-- | Contains the detections for each page analyzed through the Analyze
+-- Lending API.
+--
+-- /See:/ 'newLendingResult' smart constructor.
+data LendingResult = LendingResult'
+  { -- | An array of Extraction to hold structured data. e.g. normalized key
+    -- value pairs instead of raw OCR detections .
+    extractions :: Prelude.Maybe [Extraction],
+    -- | The page number for a page, with regard to whole submission.
+    page :: Prelude.Maybe Prelude.Natural,
+    -- | The classifier result for a given page.
+    pageClassification :: Prelude.Maybe PageClassification
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LendingResult' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'extractions', 'lendingResult_extractions' - An array of Extraction to hold structured data. e.g. normalized key
+-- value pairs instead of raw OCR detections .
+--
+-- 'page', 'lendingResult_page' - The page number for a page, with regard to whole submission.
+--
+-- 'pageClassification', 'lendingResult_pageClassification' - The classifier result for a given page.
+newLendingResult ::
+  LendingResult
+newLendingResult =
+  LendingResult'
+    { extractions = Prelude.Nothing,
+      page = Prelude.Nothing,
+      pageClassification = Prelude.Nothing
+    }
+
+-- | An array of Extraction to hold structured data. e.g. normalized key
+-- value pairs instead of raw OCR detections .
+lendingResult_extractions :: Lens.Lens' LendingResult (Prelude.Maybe [Extraction])
+lendingResult_extractions = Lens.lens (\LendingResult' {extractions} -> extractions) (\s@LendingResult' {} a -> s {extractions = a} :: LendingResult) Prelude.. Lens.mapping Lens.coerced
+
+-- | The page number for a page, with regard to whole submission.
+lendingResult_page :: Lens.Lens' LendingResult (Prelude.Maybe Prelude.Natural)
+lendingResult_page = Lens.lens (\LendingResult' {page} -> page) (\s@LendingResult' {} a -> s {page = a} :: LendingResult)
+
+-- | The classifier result for a given page.
+lendingResult_pageClassification :: Lens.Lens' LendingResult (Prelude.Maybe PageClassification)
+lendingResult_pageClassification = Lens.lens (\LendingResult' {pageClassification} -> pageClassification) (\s@LendingResult' {} a -> s {pageClassification = a} :: LendingResult)
+
+instance Data.FromJSON LendingResult where
+  parseJSON =
+    Data.withObject
+      "LendingResult"
+      ( \x ->
+          LendingResult'
+            Prelude.<$> (x Data..:? "Extractions" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "Page")
+            Prelude.<*> (x Data..:? "PageClassification")
+      )
+
+instance Prelude.Hashable LendingResult where
+  hashWithSalt _salt LendingResult' {..} =
+    _salt
+      `Prelude.hashWithSalt` extractions
+      `Prelude.hashWithSalt` page
+      `Prelude.hashWithSalt` pageClassification
+
+instance Prelude.NFData LendingResult where
+  rnf LendingResult' {..} =
+    Prelude.rnf extractions
+      `Prelude.seq` Prelude.rnf page
+      `Prelude.seq` Prelude.rnf pageClassification
diff --git a/gen/Amazonka/Textract/Types/LendingSummary.hs b/gen/Amazonka/Textract/Types/LendingSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/LendingSummary.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.Textract.Types.LendingSummary
+-- 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.Textract.Types.LendingSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Types.DocumentGroup
+
+-- | Contains information regarding DocumentGroups and
+-- UndetectedDocumentTypes.
+--
+-- /See:/ 'newLendingSummary' smart constructor.
+data LendingSummary = LendingSummary'
+  { -- | Contains an array of all DocumentGroup objects.
+    documentGroups :: Prelude.Maybe [DocumentGroup],
+    -- | UndetectedDocumentTypes.
+    undetectedDocumentTypes :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LendingSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'documentGroups', 'lendingSummary_documentGroups' - Contains an array of all DocumentGroup objects.
+--
+-- 'undetectedDocumentTypes', 'lendingSummary_undetectedDocumentTypes' - UndetectedDocumentTypes.
+newLendingSummary ::
+  LendingSummary
+newLendingSummary =
+  LendingSummary'
+    { documentGroups = Prelude.Nothing,
+      undetectedDocumentTypes = Prelude.Nothing
+    }
+
+-- | Contains an array of all DocumentGroup objects.
+lendingSummary_documentGroups :: Lens.Lens' LendingSummary (Prelude.Maybe [DocumentGroup])
+lendingSummary_documentGroups = Lens.lens (\LendingSummary' {documentGroups} -> documentGroups) (\s@LendingSummary' {} a -> s {documentGroups = a} :: LendingSummary) Prelude.. Lens.mapping Lens.coerced
+
+-- | UndetectedDocumentTypes.
+lendingSummary_undetectedDocumentTypes :: Lens.Lens' LendingSummary (Prelude.Maybe [Prelude.Text])
+lendingSummary_undetectedDocumentTypes = Lens.lens (\LendingSummary' {undetectedDocumentTypes} -> undetectedDocumentTypes) (\s@LendingSummary' {} a -> s {undetectedDocumentTypes = a} :: LendingSummary) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON LendingSummary where
+  parseJSON =
+    Data.withObject
+      "LendingSummary"
+      ( \x ->
+          LendingSummary'
+            Prelude.<$> (x Data..:? "DocumentGroups" Data..!= Prelude.mempty)
+            Prelude.<*> ( x
+                            Data..:? "UndetectedDocumentTypes"
+                            Data..!= Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable LendingSummary where
+  hashWithSalt _salt LendingSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` documentGroups
+      `Prelude.hashWithSalt` undetectedDocumentTypes
+
+instance Prelude.NFData LendingSummary where
+  rnf LendingSummary' {..} =
+    Prelude.rnf documentGroups
+      `Prelude.seq` Prelude.rnf undetectedDocumentTypes
diff --git a/gen/Amazonka/Textract/Types/LineItemFields.hs b/gen/Amazonka/Textract/Types/LineItemFields.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/LineItemFields.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.Textract.Types.LineItemFields
+-- 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.Textract.Types.LineItemFields where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Types.ExpenseField
+
+-- | A structure that holds information about the different lines found in a
+-- document\'s tables.
+--
+-- /See:/ 'newLineItemFields' smart constructor.
+data LineItemFields = LineItemFields'
+  { -- | ExpenseFields used to show information from detected lines on a table.
+    lineItemExpenseFields :: Prelude.Maybe [ExpenseField]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LineItemFields' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'lineItemExpenseFields', 'lineItemFields_lineItemExpenseFields' - ExpenseFields used to show information from detected lines on a table.
+newLineItemFields ::
+  LineItemFields
+newLineItemFields =
+  LineItemFields'
+    { lineItemExpenseFields =
+        Prelude.Nothing
+    }
+
+-- | ExpenseFields used to show information from detected lines on a table.
+lineItemFields_lineItemExpenseFields :: Lens.Lens' LineItemFields (Prelude.Maybe [ExpenseField])
+lineItemFields_lineItemExpenseFields = Lens.lens (\LineItemFields' {lineItemExpenseFields} -> lineItemExpenseFields) (\s@LineItemFields' {} a -> s {lineItemExpenseFields = a} :: LineItemFields) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON LineItemFields where
+  parseJSON =
+    Data.withObject
+      "LineItemFields"
+      ( \x ->
+          LineItemFields'
+            Prelude.<$> ( x
+                            Data..:? "LineItemExpenseFields"
+                            Data..!= Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable LineItemFields where
+  hashWithSalt _salt LineItemFields' {..} =
+    _salt `Prelude.hashWithSalt` lineItemExpenseFields
+
+instance Prelude.NFData LineItemFields where
+  rnf LineItemFields' {..} =
+    Prelude.rnf lineItemExpenseFields
diff --git a/gen/Amazonka/Textract/Types/LineItemGroup.hs b/gen/Amazonka/Textract/Types/LineItemGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/LineItemGroup.hs
@@ -0,0 +1,93 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Textract.Types.LineItemGroup
+-- 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.Textract.Types.LineItemGroup where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Types.LineItemFields
+
+-- | A grouping of tables which contain LineItems, with each table identified
+-- by the table\'s @LineItemGroupIndex@.
+--
+-- /See:/ 'newLineItemGroup' smart constructor.
+data LineItemGroup = LineItemGroup'
+  { -- | The number used to identify a specific table in a document. The first
+    -- table encountered will have a LineItemGroupIndex of 1, the second 2,
+    -- etc.
+    lineItemGroupIndex :: Prelude.Maybe Prelude.Natural,
+    -- | The breakdown of information on a particular line of a table.
+    lineItems :: Prelude.Maybe [LineItemFields]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LineItemGroup' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'lineItemGroupIndex', 'lineItemGroup_lineItemGroupIndex' - The number used to identify a specific table in a document. The first
+-- table encountered will have a LineItemGroupIndex of 1, the second 2,
+-- etc.
+--
+-- 'lineItems', 'lineItemGroup_lineItems' - The breakdown of information on a particular line of a table.
+newLineItemGroup ::
+  LineItemGroup
+newLineItemGroup =
+  LineItemGroup'
+    { lineItemGroupIndex =
+        Prelude.Nothing,
+      lineItems = Prelude.Nothing
+    }
+
+-- | The number used to identify a specific table in a document. The first
+-- table encountered will have a LineItemGroupIndex of 1, the second 2,
+-- etc.
+lineItemGroup_lineItemGroupIndex :: Lens.Lens' LineItemGroup (Prelude.Maybe Prelude.Natural)
+lineItemGroup_lineItemGroupIndex = Lens.lens (\LineItemGroup' {lineItemGroupIndex} -> lineItemGroupIndex) (\s@LineItemGroup' {} a -> s {lineItemGroupIndex = a} :: LineItemGroup)
+
+-- | The breakdown of information on a particular line of a table.
+lineItemGroup_lineItems :: Lens.Lens' LineItemGroup (Prelude.Maybe [LineItemFields])
+lineItemGroup_lineItems = Lens.lens (\LineItemGroup' {lineItems} -> lineItems) (\s@LineItemGroup' {} a -> s {lineItems = a} :: LineItemGroup) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON LineItemGroup where
+  parseJSON =
+    Data.withObject
+      "LineItemGroup"
+      ( \x ->
+          LineItemGroup'
+            Prelude.<$> (x Data..:? "LineItemGroupIndex")
+            Prelude.<*> (x Data..:? "LineItems" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable LineItemGroup where
+  hashWithSalt _salt LineItemGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` lineItemGroupIndex
+      `Prelude.hashWithSalt` lineItems
+
+instance Prelude.NFData LineItemGroup where
+  rnf LineItemGroup' {..} =
+    Prelude.rnf lineItemGroupIndex
+      `Prelude.seq` Prelude.rnf lineItems
diff --git a/gen/Amazonka/Textract/Types/NormalizedValue.hs b/gen/Amazonka/Textract/Types/NormalizedValue.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/NormalizedValue.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.Textract.Types.NormalizedValue
+-- 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.Textract.Types.NormalizedValue where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Types.ValueType
+
+-- | Contains information relating to dates in a document, including the type
+-- of value, and the value.
+--
+-- /See:/ 'newNormalizedValue' smart constructor.
+data NormalizedValue = NormalizedValue'
+  { -- | The value of the date, written as Year-Month-DayTHour:Minute:Second.
+    value :: Prelude.Maybe Prelude.Text,
+    -- | The normalized type of the value detected. In this case, DATE.
+    valueType :: Prelude.Maybe ValueType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'NormalizedValue' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'value', 'normalizedValue_value' - The value of the date, written as Year-Month-DayTHour:Minute:Second.
+--
+-- 'valueType', 'normalizedValue_valueType' - The normalized type of the value detected. In this case, DATE.
+newNormalizedValue ::
+  NormalizedValue
+newNormalizedValue =
+  NormalizedValue'
+    { value = Prelude.Nothing,
+      valueType = Prelude.Nothing
+    }
+
+-- | The value of the date, written as Year-Month-DayTHour:Minute:Second.
+normalizedValue_value :: Lens.Lens' NormalizedValue (Prelude.Maybe Prelude.Text)
+normalizedValue_value = Lens.lens (\NormalizedValue' {value} -> value) (\s@NormalizedValue' {} a -> s {value = a} :: NormalizedValue)
+
+-- | The normalized type of the value detected. In this case, DATE.
+normalizedValue_valueType :: Lens.Lens' NormalizedValue (Prelude.Maybe ValueType)
+normalizedValue_valueType = Lens.lens (\NormalizedValue' {valueType} -> valueType) (\s@NormalizedValue' {} a -> s {valueType = a} :: NormalizedValue)
+
+instance Data.FromJSON NormalizedValue where
+  parseJSON =
+    Data.withObject
+      "NormalizedValue"
+      ( \x ->
+          NormalizedValue'
+            Prelude.<$> (x Data..:? "Value")
+            Prelude.<*> (x Data..:? "ValueType")
+      )
+
+instance Prelude.Hashable NormalizedValue where
+  hashWithSalt _salt NormalizedValue' {..} =
+    _salt
+      `Prelude.hashWithSalt` value
+      `Prelude.hashWithSalt` valueType
+
+instance Prelude.NFData NormalizedValue where
+  rnf NormalizedValue' {..} =
+    Prelude.rnf value
+      `Prelude.seq` Prelude.rnf valueType
diff --git a/gen/Amazonka/Textract/Types/NotificationChannel.hs b/gen/Amazonka/Textract/Types/NotificationChannel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/NotificationChannel.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.Textract.Types.NotificationChannel
+-- 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.Textract.Types.NotificationChannel 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 Amazon Simple Notification Service (Amazon SNS) topic to which
+-- Amazon Textract publishes the completion status of an asynchronous
+-- document operation.
+--
+-- /See:/ 'newNotificationChannel' smart constructor.
+data NotificationChannel = NotificationChannel'
+  { -- | The Amazon SNS topic that Amazon Textract posts the completion status
+    -- to.
+    sNSTopicArn :: Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of an IAM role that gives Amazon Textract
+    -- publishing permissions to the Amazon SNS topic.
+    roleArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'NotificationChannel' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'sNSTopicArn', 'notificationChannel_sNSTopicArn' - The Amazon SNS topic that Amazon Textract posts the completion status
+-- to.
+--
+-- 'roleArn', 'notificationChannel_roleArn' - The Amazon Resource Name (ARN) of an IAM role that gives Amazon Textract
+-- publishing permissions to the Amazon SNS topic.
+newNotificationChannel ::
+  -- | 'sNSTopicArn'
+  Prelude.Text ->
+  -- | 'roleArn'
+  Prelude.Text ->
+  NotificationChannel
+newNotificationChannel pSNSTopicArn_ pRoleArn_ =
+  NotificationChannel'
+    { sNSTopicArn = pSNSTopicArn_,
+      roleArn = pRoleArn_
+    }
+
+-- | The Amazon SNS topic that Amazon Textract posts the completion status
+-- to.
+notificationChannel_sNSTopicArn :: Lens.Lens' NotificationChannel Prelude.Text
+notificationChannel_sNSTopicArn = Lens.lens (\NotificationChannel' {sNSTopicArn} -> sNSTopicArn) (\s@NotificationChannel' {} a -> s {sNSTopicArn = a} :: NotificationChannel)
+
+-- | The Amazon Resource Name (ARN) of an IAM role that gives Amazon Textract
+-- publishing permissions to the Amazon SNS topic.
+notificationChannel_roleArn :: Lens.Lens' NotificationChannel Prelude.Text
+notificationChannel_roleArn = Lens.lens (\NotificationChannel' {roleArn} -> roleArn) (\s@NotificationChannel' {} a -> s {roleArn = a} :: NotificationChannel)
+
+instance Prelude.Hashable NotificationChannel where
+  hashWithSalt _salt NotificationChannel' {..} =
+    _salt
+      `Prelude.hashWithSalt` sNSTopicArn
+      `Prelude.hashWithSalt` roleArn
+
+instance Prelude.NFData NotificationChannel where
+  rnf NotificationChannel' {..} =
+    Prelude.rnf sNSTopicArn
+      `Prelude.seq` Prelude.rnf roleArn
+
+instance Data.ToJSON NotificationChannel where
+  toJSON NotificationChannel' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("SNSTopicArn" Data..= sNSTopicArn),
+            Prelude.Just ("RoleArn" Data..= roleArn)
+          ]
+      )
diff --git a/gen/Amazonka/Textract/Types/OutputConfig.hs b/gen/Amazonka/Textract/Types/OutputConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/OutputConfig.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.Textract.Types.OutputConfig
+-- 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.Textract.Types.OutputConfig 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
+
+-- | Sets whether or not your output will go to a user created bucket. Used
+-- to set the name of the bucket, and the prefix on the output file.
+--
+-- @OutputConfig@ is an optional parameter which lets you adjust where your
+-- output will be placed. By default, Amazon Textract will store the
+-- results internally and can only be accessed by the Get API operations.
+-- With @OutputConfig@ enabled, you can set the name of the bucket the
+-- output will be sent to the file prefix of the results where you can
+-- download your results. Additionally, you can set the @KMSKeyID@
+-- parameter to a customer master key (CMK) to encrypt your output. Without
+-- this parameter set Amazon Textract will encrypt server-side using the
+-- AWS managed CMK for Amazon S3.
+--
+-- Decryption of Customer Content is necessary for processing of the
+-- documents by Amazon Textract. If your account is opted out under an AI
+-- services opt out policy then all unencrypted Customer Content is
+-- immediately and permanently deleted after the Customer Content has been
+-- processed by the service. No copy of of the output is retained by Amazon
+-- Textract. For information about how to opt out, see
+-- <https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_ai-opt-out.html Managing AI services opt-out policy.>
+--
+-- For more information on data privacy, see the
+-- <https://aws.amazon.com/compliance/data-privacy-faq/ Data Privacy FAQ>.
+--
+-- /See:/ 'newOutputConfig' smart constructor.
+data OutputConfig = OutputConfig'
+  { -- | The prefix of the object key that the output will be saved to. When not
+    -- enabled, the prefix will be “textract_output\".
+    s3Prefix :: Prelude.Maybe Prelude.Text,
+    -- | The name of the bucket your output will go to.
+    s3Bucket :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'OutputConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 's3Prefix', 'outputConfig_s3Prefix' - The prefix of the object key that the output will be saved to. When not
+-- enabled, the prefix will be “textract_output\".
+--
+-- 's3Bucket', 'outputConfig_s3Bucket' - The name of the bucket your output will go to.
+newOutputConfig ::
+  -- | 's3Bucket'
+  Prelude.Text ->
+  OutputConfig
+newOutputConfig pS3Bucket_ =
+  OutputConfig'
+    { s3Prefix = Prelude.Nothing,
+      s3Bucket = pS3Bucket_
+    }
+
+-- | The prefix of the object key that the output will be saved to. When not
+-- enabled, the prefix will be “textract_output\".
+outputConfig_s3Prefix :: Lens.Lens' OutputConfig (Prelude.Maybe Prelude.Text)
+outputConfig_s3Prefix = Lens.lens (\OutputConfig' {s3Prefix} -> s3Prefix) (\s@OutputConfig' {} a -> s {s3Prefix = a} :: OutputConfig)
+
+-- | The name of the bucket your output will go to.
+outputConfig_s3Bucket :: Lens.Lens' OutputConfig Prelude.Text
+outputConfig_s3Bucket = Lens.lens (\OutputConfig' {s3Bucket} -> s3Bucket) (\s@OutputConfig' {} a -> s {s3Bucket = a} :: OutputConfig)
+
+instance Prelude.Hashable OutputConfig where
+  hashWithSalt _salt OutputConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` s3Prefix
+      `Prelude.hashWithSalt` s3Bucket
+
+instance Prelude.NFData OutputConfig where
+  rnf OutputConfig' {..} =
+    Prelude.rnf s3Prefix
+      `Prelude.seq` Prelude.rnf s3Bucket
+
+instance Data.ToJSON OutputConfig where
+  toJSON OutputConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("S3Prefix" Data..=) Prelude.<$> s3Prefix,
+            Prelude.Just ("S3Bucket" Data..= s3Bucket)
+          ]
+      )
diff --git a/gen/Amazonka/Textract/Types/PageClassification.hs b/gen/Amazonka/Textract/Types/PageClassification.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/PageClassification.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.Textract.Types.PageClassification
+-- 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.Textract.Types.PageClassification where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Types.Prediction
+
+-- | The class assigned to a Page object detected in an input document.
+-- Contains information regarding the predicted type\/class of a
+-- document\'s page and the page number that the Page object was detected
+-- on.
+--
+-- /See:/ 'newPageClassification' smart constructor.
+data PageClassification = PageClassification'
+  { -- | The class, or document type, assigned to a detected Page object. The
+    -- class, or document type, assigned to a detected Page object.
+    pageType :: [Prediction],
+    -- | The page number the value was detected on, relative to Amazon
+    -- Textract\'s starting position.
+    pageNumber :: [Prediction]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PageClassification' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'pageType', 'pageClassification_pageType' - The class, or document type, assigned to a detected Page object. The
+-- class, or document type, assigned to a detected Page object.
+--
+-- 'pageNumber', 'pageClassification_pageNumber' - The page number the value was detected on, relative to Amazon
+-- Textract\'s starting position.
+newPageClassification ::
+  PageClassification
+newPageClassification =
+  PageClassification'
+    { pageType = Prelude.mempty,
+      pageNumber = Prelude.mempty
+    }
+
+-- | The class, or document type, assigned to a detected Page object. The
+-- class, or document type, assigned to a detected Page object.
+pageClassification_pageType :: Lens.Lens' PageClassification [Prediction]
+pageClassification_pageType = Lens.lens (\PageClassification' {pageType} -> pageType) (\s@PageClassification' {} a -> s {pageType = a} :: PageClassification) Prelude.. Lens.coerced
+
+-- | The page number the value was detected on, relative to Amazon
+-- Textract\'s starting position.
+pageClassification_pageNumber :: Lens.Lens' PageClassification [Prediction]
+pageClassification_pageNumber = Lens.lens (\PageClassification' {pageNumber} -> pageNumber) (\s@PageClassification' {} a -> s {pageNumber = a} :: PageClassification) Prelude.. Lens.coerced
+
+instance Data.FromJSON PageClassification where
+  parseJSON =
+    Data.withObject
+      "PageClassification"
+      ( \x ->
+          PageClassification'
+            Prelude.<$> (x Data..:? "PageType" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "PageNumber" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable PageClassification where
+  hashWithSalt _salt PageClassification' {..} =
+    _salt
+      `Prelude.hashWithSalt` pageType
+      `Prelude.hashWithSalt` pageNumber
+
+instance Prelude.NFData PageClassification where
+  rnf PageClassification' {..} =
+    Prelude.rnf pageType
+      `Prelude.seq` Prelude.rnf pageNumber
diff --git a/gen/Amazonka/Textract/Types/Point.hs b/gen/Amazonka/Textract/Types/Point.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/Point.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.Textract.Types.Point
+-- 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.Textract.Types.Point 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 X and Y coordinates of a point on a document page. The X and Y
+-- values that are returned are ratios of the overall document page size.
+-- For example, if the input document is 700 x 200 and the operation
+-- returns X=0.5 and Y=0.25, then the point is at the (350,50) pixel
+-- coordinate on the document page.
+--
+-- An array of @Point@ objects, @Polygon@, is returned by
+-- DetectDocumentText. @Polygon@ represents a fine-grained polygon around
+-- detected text. For more information, see Geometry in the Amazon Textract
+-- Developer Guide.
+--
+-- /See:/ 'newPoint' smart constructor.
+data Point = Point'
+  { -- | The value of the X coordinate for a point on a @Polygon@.
+    x :: Prelude.Maybe Prelude.Double,
+    -- | The value of the Y coordinate for a point on a @Polygon@.
+    y :: Prelude.Maybe Prelude.Double
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Point' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'x', 'point_x' - The value of the X coordinate for a point on a @Polygon@.
+--
+-- 'y', 'point_y' - The value of the Y coordinate for a point on a @Polygon@.
+newPoint ::
+  Point
+newPoint =
+  Point' {x = Prelude.Nothing, y = Prelude.Nothing}
+
+-- | The value of the X coordinate for a point on a @Polygon@.
+point_x :: Lens.Lens' Point (Prelude.Maybe Prelude.Double)
+point_x = Lens.lens (\Point' {x} -> x) (\s@Point' {} a -> s {x = a} :: Point)
+
+-- | The value of the Y coordinate for a point on a @Polygon@.
+point_y :: Lens.Lens' Point (Prelude.Maybe Prelude.Double)
+point_y = Lens.lens (\Point' {y} -> y) (\s@Point' {} a -> s {y = a} :: Point)
+
+instance Data.FromJSON Point where
+  parseJSON =
+    Data.withObject
+      "Point"
+      ( \x ->
+          Point'
+            Prelude.<$> (x Data..:? "X")
+            Prelude.<*> (x Data..:? "Y")
+      )
+
+instance Prelude.Hashable Point where
+  hashWithSalt _salt Point' {..} =
+    _salt
+      `Prelude.hashWithSalt` x
+      `Prelude.hashWithSalt` y
+
+instance Prelude.NFData Point where
+  rnf Point' {..} =
+    Prelude.rnf x `Prelude.seq` Prelude.rnf y
diff --git a/gen/Amazonka/Textract/Types/Prediction.hs b/gen/Amazonka/Textract/Types/Prediction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/Prediction.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.Textract.Types.Prediction
+-- 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.Textract.Types.Prediction where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information regarding predicted values returned by Amazon
+-- Textract operations, including the predicted value and the confidence in
+-- the predicted value.
+--
+-- /See:/ 'newPrediction' smart constructor.
+data Prediction = Prediction'
+  { -- | Amazon Textract\'s confidence in its predicted value.
+    confidence :: Prelude.Maybe Prelude.Double,
+    -- | The predicted value of a detected object.
+    value :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Prediction' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'confidence', 'prediction_confidence' - Amazon Textract\'s confidence in its predicted value.
+--
+-- 'value', 'prediction_value' - The predicted value of a detected object.
+newPrediction ::
+  Prediction
+newPrediction =
+  Prediction'
+    { confidence = Prelude.Nothing,
+      value = Prelude.Nothing
+    }
+
+-- | Amazon Textract\'s confidence in its predicted value.
+prediction_confidence :: Lens.Lens' Prediction (Prelude.Maybe Prelude.Double)
+prediction_confidence = Lens.lens (\Prediction' {confidence} -> confidence) (\s@Prediction' {} a -> s {confidence = a} :: Prediction)
+
+-- | The predicted value of a detected object.
+prediction_value :: Lens.Lens' Prediction (Prelude.Maybe Prelude.Text)
+prediction_value = Lens.lens (\Prediction' {value} -> value) (\s@Prediction' {} a -> s {value = a} :: Prediction)
+
+instance Data.FromJSON Prediction where
+  parseJSON =
+    Data.withObject
+      "Prediction"
+      ( \x ->
+          Prediction'
+            Prelude.<$> (x Data..:? "Confidence")
+            Prelude.<*> (x Data..:? "Value")
+      )
+
+instance Prelude.Hashable Prediction where
+  hashWithSalt _salt Prediction' {..} =
+    _salt
+      `Prelude.hashWithSalt` confidence
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData Prediction where
+  rnf Prediction' {..} =
+    Prelude.rnf confidence
+      `Prelude.seq` Prelude.rnf value
diff --git a/gen/Amazonka/Textract/Types/QueriesConfig.hs b/gen/Amazonka/Textract/Types/QueriesConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/QueriesConfig.hs
@@ -0,0 +1,70 @@
+{-# 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.Textract.Types.QueriesConfig
+-- 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.Textract.Types.QueriesConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Types.Query
+
+-- |
+--
+-- /See:/ 'newQueriesConfig' smart constructor.
+data QueriesConfig = QueriesConfig'
+  { queries :: Prelude.NonEmpty Query
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'QueriesConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'queries', 'queriesConfig_queries' -
+newQueriesConfig ::
+  -- | 'queries'
+  Prelude.NonEmpty Query ->
+  QueriesConfig
+newQueriesConfig pQueries_ =
+  QueriesConfig'
+    { queries =
+        Lens.coerced Lens.# pQueries_
+    }
+
+queriesConfig_queries :: Lens.Lens' QueriesConfig (Prelude.NonEmpty Query)
+queriesConfig_queries = Lens.lens (\QueriesConfig' {queries} -> queries) (\s@QueriesConfig' {} a -> s {queries = a} :: QueriesConfig) Prelude.. Lens.coerced
+
+instance Prelude.Hashable QueriesConfig where
+  hashWithSalt _salt QueriesConfig' {..} =
+    _salt `Prelude.hashWithSalt` queries
+
+instance Prelude.NFData QueriesConfig where
+  rnf QueriesConfig' {..} = Prelude.rnf queries
+
+instance Data.ToJSON QueriesConfig where
+  toJSON QueriesConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("Queries" Data..= queries)]
+      )
diff --git a/gen/Amazonka/Textract/Types/Query.hs b/gen/Amazonka/Textract/Types/Query.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/Query.hs
@@ -0,0 +1,160 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Textract.Types.Query
+-- 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.Textract.Types.Query 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
+
+-- | Each query contains the question you want to ask in the Text and the
+-- alias you want to associate.
+--
+-- /See:/ 'newQuery' smart constructor.
+data Query = Query'
+  { -- | Alias attached to the query, for ease of location.
+    alias :: Prelude.Maybe Prelude.Text,
+    -- | Pages is a parameter that the user inputs to specify which pages to
+    -- apply a query to. The following is a list of rules for using this
+    -- parameter.
+    --
+    -- -   If a page is not specified, it is set to @[\"1\"]@ by default.
+    --
+    -- -   The following characters are allowed in the parameter\'s string:
+    --     @0 1 2 3 4 5 6 7 8 9 - *@. No whitespace is allowed.
+    --
+    -- -   When using * to indicate all pages, it must be the only element in
+    --     the list.
+    --
+    -- -   You can use page intervals, such as @[“1-3”, “1-1”, “4-*”]@. Where
+    --     @*@ indicates last page of document.
+    --
+    -- -   Specified pages must be greater than 0 and less than or equal to the
+    --     number of pages in the document.
+    pages :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text),
+    -- | Question that Amazon Textract will apply to the document. An example
+    -- would be \"What is the customer\'s SSN?\"
+    text :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Query' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'alias', 'query_alias' - Alias attached to the query, for ease of location.
+--
+-- 'pages', 'query_pages' - Pages is a parameter that the user inputs to specify which pages to
+-- apply a query to. The following is a list of rules for using this
+-- parameter.
+--
+-- -   If a page is not specified, it is set to @[\"1\"]@ by default.
+--
+-- -   The following characters are allowed in the parameter\'s string:
+--     @0 1 2 3 4 5 6 7 8 9 - *@. No whitespace is allowed.
+--
+-- -   When using * to indicate all pages, it must be the only element in
+--     the list.
+--
+-- -   You can use page intervals, such as @[“1-3”, “1-1”, “4-*”]@. Where
+--     @*@ indicates last page of document.
+--
+-- -   Specified pages must be greater than 0 and less than or equal to the
+--     number of pages in the document.
+--
+-- 'text', 'query_text' - Question that Amazon Textract will apply to the document. An example
+-- would be \"What is the customer\'s SSN?\"
+newQuery ::
+  -- | 'text'
+  Prelude.Text ->
+  Query
+newQuery pText_ =
+  Query'
+    { alias = Prelude.Nothing,
+      pages = Prelude.Nothing,
+      text = pText_
+    }
+
+-- | Alias attached to the query, for ease of location.
+query_alias :: Lens.Lens' Query (Prelude.Maybe Prelude.Text)
+query_alias = Lens.lens (\Query' {alias} -> alias) (\s@Query' {} a -> s {alias = a} :: Query)
+
+-- | Pages is a parameter that the user inputs to specify which pages to
+-- apply a query to. The following is a list of rules for using this
+-- parameter.
+--
+-- -   If a page is not specified, it is set to @[\"1\"]@ by default.
+--
+-- -   The following characters are allowed in the parameter\'s string:
+--     @0 1 2 3 4 5 6 7 8 9 - *@. No whitespace is allowed.
+--
+-- -   When using * to indicate all pages, it must be the only element in
+--     the list.
+--
+-- -   You can use page intervals, such as @[“1-3”, “1-1”, “4-*”]@. Where
+--     @*@ indicates last page of document.
+--
+-- -   Specified pages must be greater than 0 and less than or equal to the
+--     number of pages in the document.
+query_pages :: Lens.Lens' Query (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+query_pages = Lens.lens (\Query' {pages} -> pages) (\s@Query' {} a -> s {pages = a} :: Query) Prelude.. Lens.mapping Lens.coerced
+
+-- | Question that Amazon Textract will apply to the document. An example
+-- would be \"What is the customer\'s SSN?\"
+query_text :: Lens.Lens' Query Prelude.Text
+query_text = Lens.lens (\Query' {text} -> text) (\s@Query' {} a -> s {text = a} :: Query)
+
+instance Data.FromJSON Query where
+  parseJSON =
+    Data.withObject
+      "Query"
+      ( \x ->
+          Query'
+            Prelude.<$> (x Data..:? "Alias")
+            Prelude.<*> (x Data..:? "Pages")
+            Prelude.<*> (x Data..: "Text")
+      )
+
+instance Prelude.Hashable Query where
+  hashWithSalt _salt Query' {..} =
+    _salt
+      `Prelude.hashWithSalt` alias
+      `Prelude.hashWithSalt` pages
+      `Prelude.hashWithSalt` text
+
+instance Prelude.NFData Query where
+  rnf Query' {..} =
+    Prelude.rnf alias
+      `Prelude.seq` Prelude.rnf pages
+      `Prelude.seq` Prelude.rnf text
+
+instance Data.ToJSON Query where
+  toJSON Query' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Alias" Data..=) Prelude.<$> alias,
+            ("Pages" Data..=) Prelude.<$> pages,
+            Prelude.Just ("Text" Data..= text)
+          ]
+      )
diff --git a/gen/Amazonka/Textract/Types/Relationship.hs b/gen/Amazonka/Textract/Types/Relationship.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/Relationship.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.Textract.Types.Relationship
+-- 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.Textract.Types.Relationship where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Types.RelationshipType
+
+-- | Information about how blocks are related to each other. A @Block@ object
+-- contains 0 or more @Relation@ objects in a list, @Relationships@. For
+-- more information, see Block.
+--
+-- The @Type@ element provides the type of the relationship for all blocks
+-- in the @IDs@ array.
+--
+-- /See:/ 'newRelationship' smart constructor.
+data Relationship = Relationship'
+  { -- | An array of IDs for related blocks. You can get the type of the
+    -- relationship from the @Type@ element.
+    ids :: Prelude.Maybe [Prelude.Text],
+    -- | The type of relationship that the blocks in the IDs array have with the
+    -- current block. The relationship can be @VALUE@ or @CHILD@. A
+    -- relationship of type VALUE is a list that contains the ID of the VALUE
+    -- block that\'s associated with the KEY of a key-value pair. A
+    -- relationship of type CHILD is a list of IDs that identify WORD blocks in
+    -- the case of lines Cell blocks in the case of Tables, and WORD blocks in
+    -- the case of Selection Elements.
+    type' :: Prelude.Maybe RelationshipType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Relationship' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'ids', 'relationship_ids' - An array of IDs for related blocks. You can get the type of the
+-- relationship from the @Type@ element.
+--
+-- 'type'', 'relationship_type' - The type of relationship that the blocks in the IDs array have with the
+-- current block. The relationship can be @VALUE@ or @CHILD@. A
+-- relationship of type VALUE is a list that contains the ID of the VALUE
+-- block that\'s associated with the KEY of a key-value pair. A
+-- relationship of type CHILD is a list of IDs that identify WORD blocks in
+-- the case of lines Cell blocks in the case of Tables, and WORD blocks in
+-- the case of Selection Elements.
+newRelationship ::
+  Relationship
+newRelationship =
+  Relationship'
+    { ids = Prelude.Nothing,
+      type' = Prelude.Nothing
+    }
+
+-- | An array of IDs for related blocks. You can get the type of the
+-- relationship from the @Type@ element.
+relationship_ids :: Lens.Lens' Relationship (Prelude.Maybe [Prelude.Text])
+relationship_ids = Lens.lens (\Relationship' {ids} -> ids) (\s@Relationship' {} a -> s {ids = a} :: Relationship) Prelude.. Lens.mapping Lens.coerced
+
+-- | The type of relationship that the blocks in the IDs array have with the
+-- current block. The relationship can be @VALUE@ or @CHILD@. A
+-- relationship of type VALUE is a list that contains the ID of the VALUE
+-- block that\'s associated with the KEY of a key-value pair. A
+-- relationship of type CHILD is a list of IDs that identify WORD blocks in
+-- the case of lines Cell blocks in the case of Tables, and WORD blocks in
+-- the case of Selection Elements.
+relationship_type :: Lens.Lens' Relationship (Prelude.Maybe RelationshipType)
+relationship_type = Lens.lens (\Relationship' {type'} -> type') (\s@Relationship' {} a -> s {type' = a} :: Relationship)
+
+instance Data.FromJSON Relationship where
+  parseJSON =
+    Data.withObject
+      "Relationship"
+      ( \x ->
+          Relationship'
+            Prelude.<$> (x Data..:? "Ids" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "Type")
+      )
+
+instance Prelude.Hashable Relationship where
+  hashWithSalt _salt Relationship' {..} =
+    _salt
+      `Prelude.hashWithSalt` ids
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData Relationship where
+  rnf Relationship' {..} =
+    Prelude.rnf ids `Prelude.seq` Prelude.rnf type'
diff --git a/gen/Amazonka/Textract/Types/RelationshipType.hs b/gen/Amazonka/Textract/Types/RelationshipType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/RelationshipType.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.Textract.Types.RelationshipType
+-- 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.Textract.Types.RelationshipType
+  ( RelationshipType
+      ( ..,
+        RelationshipType_ANSWER,
+        RelationshipType_CHILD,
+        RelationshipType_COMPLEX_FEATURES,
+        RelationshipType_MERGED_CELL,
+        RelationshipType_TITLE,
+        RelationshipType_VALUE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype RelationshipType = RelationshipType'
+  { fromRelationshipType ::
+      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 RelationshipType_ANSWER :: RelationshipType
+pattern RelationshipType_ANSWER = RelationshipType' "ANSWER"
+
+pattern RelationshipType_CHILD :: RelationshipType
+pattern RelationshipType_CHILD = RelationshipType' "CHILD"
+
+pattern RelationshipType_COMPLEX_FEATURES :: RelationshipType
+pattern RelationshipType_COMPLEX_FEATURES = RelationshipType' "COMPLEX_FEATURES"
+
+pattern RelationshipType_MERGED_CELL :: RelationshipType
+pattern RelationshipType_MERGED_CELL = RelationshipType' "MERGED_CELL"
+
+pattern RelationshipType_TITLE :: RelationshipType
+pattern RelationshipType_TITLE = RelationshipType' "TITLE"
+
+pattern RelationshipType_VALUE :: RelationshipType
+pattern RelationshipType_VALUE = RelationshipType' "VALUE"
+
+{-# COMPLETE
+  RelationshipType_ANSWER,
+  RelationshipType_CHILD,
+  RelationshipType_COMPLEX_FEATURES,
+  RelationshipType_MERGED_CELL,
+  RelationshipType_TITLE,
+  RelationshipType_VALUE,
+  RelationshipType'
+  #-}
diff --git a/gen/Amazonka/Textract/Types/S3Object.hs b/gen/Amazonka/Textract/Types/S3Object.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/S3Object.hs
@@ -0,0 +1,113 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Textract.Types.S3Object
+-- 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.Textract.Types.S3Object 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 S3 bucket name and file name that identifies the document.
+--
+-- The AWS Region for the S3 bucket that contains the document must match
+-- the Region that you use for Amazon Textract operations.
+--
+-- For Amazon Textract to process a file in an S3 bucket, the user must
+-- have permission to access the S3 bucket and file.
+--
+-- /See:/ 'newS3Object' smart constructor.
+data S3Object = S3Object'
+  { -- | The name of the S3 bucket. Note that the # character is not valid in the
+    -- file name.
+    bucket :: Prelude.Maybe Prelude.Text,
+    -- | The file name of the input document. Synchronous operations can use
+    -- image files that are in JPEG or PNG format. Asynchronous operations also
+    -- support PDF and TIFF format files.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | If the bucket has versioning enabled, you can specify the object
+    -- version.
+    version :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'S3Object' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'bucket', 's3Object_bucket' - The name of the S3 bucket. Note that the # character is not valid in the
+-- file name.
+--
+-- 'name', 's3Object_name' - The file name of the input document. Synchronous operations can use
+-- image files that are in JPEG or PNG format. Asynchronous operations also
+-- support PDF and TIFF format files.
+--
+-- 'version', 's3Object_version' - If the bucket has versioning enabled, you can specify the object
+-- version.
+newS3Object ::
+  S3Object
+newS3Object =
+  S3Object'
+    { bucket = Prelude.Nothing,
+      name = Prelude.Nothing,
+      version = Prelude.Nothing
+    }
+
+-- | The name of the S3 bucket. Note that the # character is not valid in the
+-- file name.
+s3Object_bucket :: Lens.Lens' S3Object (Prelude.Maybe Prelude.Text)
+s3Object_bucket = Lens.lens (\S3Object' {bucket} -> bucket) (\s@S3Object' {} a -> s {bucket = a} :: S3Object)
+
+-- | The file name of the input document. Synchronous operations can use
+-- image files that are in JPEG or PNG format. Asynchronous operations also
+-- support PDF and TIFF format files.
+s3Object_name :: Lens.Lens' S3Object (Prelude.Maybe Prelude.Text)
+s3Object_name = Lens.lens (\S3Object' {name} -> name) (\s@S3Object' {} a -> s {name = a} :: S3Object)
+
+-- | If the bucket has versioning enabled, you can specify the object
+-- version.
+s3Object_version :: Lens.Lens' S3Object (Prelude.Maybe Prelude.Text)
+s3Object_version = Lens.lens (\S3Object' {version} -> version) (\s@S3Object' {} a -> s {version = a} :: S3Object)
+
+instance Prelude.Hashable S3Object where
+  hashWithSalt _salt S3Object' {..} =
+    _salt
+      `Prelude.hashWithSalt` bucket
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` version
+
+instance Prelude.NFData S3Object where
+  rnf S3Object' {..} =
+    Prelude.rnf bucket
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf version
+
+instance Data.ToJSON S3Object where
+  toJSON S3Object' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Bucket" Data..=) Prelude.<$> bucket,
+            ("Name" Data..=) Prelude.<$> name,
+            ("Version" Data..=) Prelude.<$> version
+          ]
+      )
diff --git a/gen/Amazonka/Textract/Types/SelectionStatus.hs b/gen/Amazonka/Textract/Types/SelectionStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/SelectionStatus.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.Textract.Types.SelectionStatus
+-- 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.Textract.Types.SelectionStatus
+  ( SelectionStatus
+      ( ..,
+        SelectionStatus_NOT_SELECTED,
+        SelectionStatus_SELECTED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype SelectionStatus = SelectionStatus'
+  { fromSelectionStatus ::
+      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 SelectionStatus_NOT_SELECTED :: SelectionStatus
+pattern SelectionStatus_NOT_SELECTED = SelectionStatus' "NOT_SELECTED"
+
+pattern SelectionStatus_SELECTED :: SelectionStatus
+pattern SelectionStatus_SELECTED = SelectionStatus' "SELECTED"
+
+{-# COMPLETE
+  SelectionStatus_NOT_SELECTED,
+  SelectionStatus_SELECTED,
+  SelectionStatus'
+  #-}
diff --git a/gen/Amazonka/Textract/Types/SignatureDetection.hs b/gen/Amazonka/Textract/Types/SignatureDetection.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/SignatureDetection.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Textract.Types.SignatureDetection
+-- 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.Textract.Types.SignatureDetection where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Types.Geometry
+
+-- | Information regarding a detected signature on a page.
+--
+-- /See:/ 'newSignatureDetection' smart constructor.
+data SignatureDetection = SignatureDetection'
+  { -- | The confidence, from 0 to 100, in the predicted values for a detected
+    -- signature.
+    confidence :: Prelude.Maybe Prelude.Double,
+    geometry :: Prelude.Maybe Geometry
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SignatureDetection' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'confidence', 'signatureDetection_confidence' - The confidence, from 0 to 100, in the predicted values for a detected
+-- signature.
+--
+-- 'geometry', 'signatureDetection_geometry' - Undocumented member.
+newSignatureDetection ::
+  SignatureDetection
+newSignatureDetection =
+  SignatureDetection'
+    { confidence = Prelude.Nothing,
+      geometry = Prelude.Nothing
+    }
+
+-- | The confidence, from 0 to 100, in the predicted values for a detected
+-- signature.
+signatureDetection_confidence :: Lens.Lens' SignatureDetection (Prelude.Maybe Prelude.Double)
+signatureDetection_confidence = Lens.lens (\SignatureDetection' {confidence} -> confidence) (\s@SignatureDetection' {} a -> s {confidence = a} :: SignatureDetection)
+
+-- | Undocumented member.
+signatureDetection_geometry :: Lens.Lens' SignatureDetection (Prelude.Maybe Geometry)
+signatureDetection_geometry = Lens.lens (\SignatureDetection' {geometry} -> geometry) (\s@SignatureDetection' {} a -> s {geometry = a} :: SignatureDetection)
+
+instance Data.FromJSON SignatureDetection where
+  parseJSON =
+    Data.withObject
+      "SignatureDetection"
+      ( \x ->
+          SignatureDetection'
+            Prelude.<$> (x Data..:? "Confidence")
+            Prelude.<*> (x Data..:? "Geometry")
+      )
+
+instance Prelude.Hashable SignatureDetection where
+  hashWithSalt _salt SignatureDetection' {..} =
+    _salt
+      `Prelude.hashWithSalt` confidence
+      `Prelude.hashWithSalt` geometry
+
+instance Prelude.NFData SignatureDetection where
+  rnf SignatureDetection' {..} =
+    Prelude.rnf confidence
+      `Prelude.seq` Prelude.rnf geometry
diff --git a/gen/Amazonka/Textract/Types/SplitDocument.hs b/gen/Amazonka/Textract/Types/SplitDocument.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/SplitDocument.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Textract.Types.SplitDocument
+-- 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.Textract.Types.SplitDocument where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about the pages of a document, defined by logical
+-- boundary.
+--
+-- /See:/ 'newSplitDocument' smart constructor.
+data SplitDocument = SplitDocument'
+  { -- | The index for a given document in a DocumentGroup of a specific Type.
+    index :: Prelude.Maybe Prelude.Natural,
+    -- | An array of page numbers for a for a given document, ordered by logical
+    -- boundary.
+    pages :: Prelude.Maybe [Prelude.Natural]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SplitDocument' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'index', 'splitDocument_index' - The index for a given document in a DocumentGroup of a specific Type.
+--
+-- 'pages', 'splitDocument_pages' - An array of page numbers for a for a given document, ordered by logical
+-- boundary.
+newSplitDocument ::
+  SplitDocument
+newSplitDocument =
+  SplitDocument'
+    { index = Prelude.Nothing,
+      pages = Prelude.Nothing
+    }
+
+-- | The index for a given document in a DocumentGroup of a specific Type.
+splitDocument_index :: Lens.Lens' SplitDocument (Prelude.Maybe Prelude.Natural)
+splitDocument_index = Lens.lens (\SplitDocument' {index} -> index) (\s@SplitDocument' {} a -> s {index = a} :: SplitDocument)
+
+-- | An array of page numbers for a for a given document, ordered by logical
+-- boundary.
+splitDocument_pages :: Lens.Lens' SplitDocument (Prelude.Maybe [Prelude.Natural])
+splitDocument_pages = Lens.lens (\SplitDocument' {pages} -> pages) (\s@SplitDocument' {} a -> s {pages = a} :: SplitDocument) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON SplitDocument where
+  parseJSON =
+    Data.withObject
+      "SplitDocument"
+      ( \x ->
+          SplitDocument'
+            Prelude.<$> (x Data..:? "Index")
+            Prelude.<*> (x Data..:? "Pages" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable SplitDocument where
+  hashWithSalt _salt SplitDocument' {..} =
+    _salt
+      `Prelude.hashWithSalt` index
+      `Prelude.hashWithSalt` pages
+
+instance Prelude.NFData SplitDocument where
+  rnf SplitDocument' {..} =
+    Prelude.rnf index `Prelude.seq` Prelude.rnf pages
diff --git a/gen/Amazonka/Textract/Types/TextType.hs b/gen/Amazonka/Textract/Types/TextType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/TextType.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.Textract.Types.TextType
+-- 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.Textract.Types.TextType
+  ( TextType
+      ( ..,
+        TextType_HANDWRITING,
+        TextType_PRINTED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype TextType = TextType'
+  { fromTextType ::
+      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 TextType_HANDWRITING :: TextType
+pattern TextType_HANDWRITING = TextType' "HANDWRITING"
+
+pattern TextType_PRINTED :: TextType
+pattern TextType_PRINTED = TextType' "PRINTED"
+
+{-# COMPLETE
+  TextType_HANDWRITING,
+  TextType_PRINTED,
+  TextType'
+  #-}
diff --git a/gen/Amazonka/Textract/Types/UndetectedSignature.hs b/gen/Amazonka/Textract/Types/UndetectedSignature.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/UndetectedSignature.hs
@@ -0,0 +1,68 @@
+{-# 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.Textract.Types.UndetectedSignature
+-- 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.Textract.Types.UndetectedSignature where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | A structure containing information about an undetected signature on a
+-- page where it was expected but not found.
+--
+-- /See:/ 'newUndetectedSignature' smart constructor.
+data UndetectedSignature = UndetectedSignature'
+  { -- | The page where a signature was expected but not found.
+    page :: Prelude.Maybe Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UndetectedSignature' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'page', 'undetectedSignature_page' - The page where a signature was expected but not found.
+newUndetectedSignature ::
+  UndetectedSignature
+newUndetectedSignature =
+  UndetectedSignature' {page = Prelude.Nothing}
+
+-- | The page where a signature was expected but not found.
+undetectedSignature_page :: Lens.Lens' UndetectedSignature (Prelude.Maybe Prelude.Natural)
+undetectedSignature_page = Lens.lens (\UndetectedSignature' {page} -> page) (\s@UndetectedSignature' {} a -> s {page = a} :: UndetectedSignature)
+
+instance Data.FromJSON UndetectedSignature where
+  parseJSON =
+    Data.withObject
+      "UndetectedSignature"
+      ( \x ->
+          UndetectedSignature' Prelude.<$> (x Data..:? "Page")
+      )
+
+instance Prelude.Hashable UndetectedSignature where
+  hashWithSalt _salt UndetectedSignature' {..} =
+    _salt `Prelude.hashWithSalt` page
+
+instance Prelude.NFData UndetectedSignature where
+  rnf UndetectedSignature' {..} = Prelude.rnf page
diff --git a/gen/Amazonka/Textract/Types/ValueType.hs b/gen/Amazonka/Textract/Types/ValueType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/ValueType.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.Textract.Types.ValueType
+-- 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.Textract.Types.ValueType
+  ( ValueType
+      ( ..,
+        ValueType_DATE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ValueType = ValueType'
+  { fromValueType ::
+      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 ValueType_DATE :: ValueType
+pattern ValueType_DATE = ValueType' "DATE"
+
+{-# COMPLETE
+  ValueType_DATE,
+  ValueType'
+  #-}
diff --git a/gen/Amazonka/Textract/Types/Warning.hs b/gen/Amazonka/Textract/Types/Warning.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/Types/Warning.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.Textract.Types.Warning
+-- 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.Textract.Types.Warning 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 warning about an issue that occurred during asynchronous text analysis
+-- (StartDocumentAnalysis) or asynchronous document text detection
+-- (StartDocumentTextDetection).
+--
+-- /See:/ 'newWarning' smart constructor.
+data Warning = Warning'
+  { -- | The error code for the warning.
+    errorCode :: Prelude.Maybe Prelude.Text,
+    -- | A list of the pages that the warning applies to.
+    pages :: Prelude.Maybe [Prelude.Natural]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Warning' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'warning_errorCode' - The error code for the warning.
+--
+-- 'pages', 'warning_pages' - A list of the pages that the warning applies to.
+newWarning ::
+  Warning
+newWarning =
+  Warning'
+    { errorCode = Prelude.Nothing,
+      pages = Prelude.Nothing
+    }
+
+-- | The error code for the warning.
+warning_errorCode :: Lens.Lens' Warning (Prelude.Maybe Prelude.Text)
+warning_errorCode = Lens.lens (\Warning' {errorCode} -> errorCode) (\s@Warning' {} a -> s {errorCode = a} :: Warning)
+
+-- | A list of the pages that the warning applies to.
+warning_pages :: Lens.Lens' Warning (Prelude.Maybe [Prelude.Natural])
+warning_pages = Lens.lens (\Warning' {pages} -> pages) (\s@Warning' {} a -> s {pages = a} :: Warning) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON Warning where
+  parseJSON =
+    Data.withObject
+      "Warning"
+      ( \x ->
+          Warning'
+            Prelude.<$> (x Data..:? "ErrorCode")
+            Prelude.<*> (x Data..:? "Pages" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable Warning where
+  hashWithSalt _salt Warning' {..} =
+    _salt
+      `Prelude.hashWithSalt` errorCode
+      `Prelude.hashWithSalt` pages
+
+instance Prelude.NFData Warning where
+  rnf Warning' {..} =
+    Prelude.rnf errorCode
+      `Prelude.seq` Prelude.rnf pages
diff --git a/gen/Amazonka/Textract/Waiters.hs b/gen/Amazonka/Textract/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Textract/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.Textract.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.Textract.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Textract.Lens
+import Amazonka.Textract.Types
diff --git a/src/.gitkeep b/src/.gitkeep
new file mode 100644
--- /dev/null
+++ b/src/.gitkeep
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,23 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Main
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Main (main) where
+
+import Test.Amazonka.Textract
+import Test.Amazonka.Textract.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "Textract"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/Gen/Textract.hs b/test/Test/Amazonka/Gen/Textract.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/Textract.hs
@@ -0,0 +1,298 @@
+{-# 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.Textract
+-- 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.Textract where
+
+import Amazonka.Textract
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.Fixture
+import Test.Amazonka.Prelude
+import Test.Amazonka.Textract.Internal
+import Test.Tasty
+
+-- Auto-generated: the actual test selection needs to be manually placed into
+-- the top-level so that real test data can be incrementally added.
+--
+-- This commented snippet is what the entire set should look like:
+
+-- fixtures :: TestTree
+-- fixtures =
+--     [ testGroup "request"
+--         [ requestAnalyzeDocument $
+--             newAnalyzeDocument
+--
+--         , requestAnalyzeExpense $
+--             newAnalyzeExpense
+--
+--         , requestAnalyzeID $
+--             newAnalyzeID
+--
+--         , requestDetectDocumentText $
+--             newDetectDocumentText
+--
+--         , requestGetDocumentAnalysis $
+--             newGetDocumentAnalysis
+--
+--         , requestGetDocumentTextDetection $
+--             newGetDocumentTextDetection
+--
+--         , requestGetExpenseAnalysis $
+--             newGetExpenseAnalysis
+--
+--         , requestGetLendingAnalysis $
+--             newGetLendingAnalysis
+--
+--         , requestGetLendingAnalysisSummary $
+--             newGetLendingAnalysisSummary
+--
+--         , requestStartDocumentAnalysis $
+--             newStartDocumentAnalysis
+--
+--         , requestStartDocumentTextDetection $
+--             newStartDocumentTextDetection
+--
+--         , requestStartExpenseAnalysis $
+--             newStartExpenseAnalysis
+--
+--         , requestStartLendingAnalysis $
+--             newStartLendingAnalysis
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseAnalyzeDocument $
+--             newAnalyzeDocumentResponse
+--
+--         , responseAnalyzeExpense $
+--             newAnalyzeExpenseResponse
+--
+--         , responseAnalyzeID $
+--             newAnalyzeIDResponse
+--
+--         , responseDetectDocumentText $
+--             newDetectDocumentTextResponse
+--
+--         , responseGetDocumentAnalysis $
+--             newGetDocumentAnalysisResponse
+--
+--         , responseGetDocumentTextDetection $
+--             newGetDocumentTextDetectionResponse
+--
+--         , responseGetExpenseAnalysis $
+--             newGetExpenseAnalysisResponse
+--
+--         , responseGetLendingAnalysis $
+--             newGetLendingAnalysisResponse
+--
+--         , responseGetLendingAnalysisSummary $
+--             newGetLendingAnalysisSummaryResponse
+--
+--         , responseStartDocumentAnalysis $
+--             newStartDocumentAnalysisResponse
+--
+--         , responseStartDocumentTextDetection $
+--             newStartDocumentTextDetectionResponse
+--
+--         , responseStartExpenseAnalysis $
+--             newStartExpenseAnalysisResponse
+--
+--         , responseStartLendingAnalysis $
+--             newStartLendingAnalysisResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestAnalyzeDocument :: AnalyzeDocument -> TestTree
+requestAnalyzeDocument =
+  req
+    "AnalyzeDocument"
+    "fixture/AnalyzeDocument.yaml"
+
+requestAnalyzeExpense :: AnalyzeExpense -> TestTree
+requestAnalyzeExpense =
+  req
+    "AnalyzeExpense"
+    "fixture/AnalyzeExpense.yaml"
+
+requestAnalyzeID :: AnalyzeID -> TestTree
+requestAnalyzeID =
+  req
+    "AnalyzeID"
+    "fixture/AnalyzeID.yaml"
+
+requestDetectDocumentText :: DetectDocumentText -> TestTree
+requestDetectDocumentText =
+  req
+    "DetectDocumentText"
+    "fixture/DetectDocumentText.yaml"
+
+requestGetDocumentAnalysis :: GetDocumentAnalysis -> TestTree
+requestGetDocumentAnalysis =
+  req
+    "GetDocumentAnalysis"
+    "fixture/GetDocumentAnalysis.yaml"
+
+requestGetDocumentTextDetection :: GetDocumentTextDetection -> TestTree
+requestGetDocumentTextDetection =
+  req
+    "GetDocumentTextDetection"
+    "fixture/GetDocumentTextDetection.yaml"
+
+requestGetExpenseAnalysis :: GetExpenseAnalysis -> TestTree
+requestGetExpenseAnalysis =
+  req
+    "GetExpenseAnalysis"
+    "fixture/GetExpenseAnalysis.yaml"
+
+requestGetLendingAnalysis :: GetLendingAnalysis -> TestTree
+requestGetLendingAnalysis =
+  req
+    "GetLendingAnalysis"
+    "fixture/GetLendingAnalysis.yaml"
+
+requestGetLendingAnalysisSummary :: GetLendingAnalysisSummary -> TestTree
+requestGetLendingAnalysisSummary =
+  req
+    "GetLendingAnalysisSummary"
+    "fixture/GetLendingAnalysisSummary.yaml"
+
+requestStartDocumentAnalysis :: StartDocumentAnalysis -> TestTree
+requestStartDocumentAnalysis =
+  req
+    "StartDocumentAnalysis"
+    "fixture/StartDocumentAnalysis.yaml"
+
+requestStartDocumentTextDetection :: StartDocumentTextDetection -> TestTree
+requestStartDocumentTextDetection =
+  req
+    "StartDocumentTextDetection"
+    "fixture/StartDocumentTextDetection.yaml"
+
+requestStartExpenseAnalysis :: StartExpenseAnalysis -> TestTree
+requestStartExpenseAnalysis =
+  req
+    "StartExpenseAnalysis"
+    "fixture/StartExpenseAnalysis.yaml"
+
+requestStartLendingAnalysis :: StartLendingAnalysis -> TestTree
+requestStartLendingAnalysis =
+  req
+    "StartLendingAnalysis"
+    "fixture/StartLendingAnalysis.yaml"
+
+-- Responses
+
+responseAnalyzeDocument :: AnalyzeDocumentResponse -> TestTree
+responseAnalyzeDocument =
+  res
+    "AnalyzeDocumentResponse"
+    "fixture/AnalyzeDocumentResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy AnalyzeDocument)
+
+responseAnalyzeExpense :: AnalyzeExpenseResponse -> TestTree
+responseAnalyzeExpense =
+  res
+    "AnalyzeExpenseResponse"
+    "fixture/AnalyzeExpenseResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy AnalyzeExpense)
+
+responseAnalyzeID :: AnalyzeIDResponse -> TestTree
+responseAnalyzeID =
+  res
+    "AnalyzeIDResponse"
+    "fixture/AnalyzeIDResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy AnalyzeID)
+
+responseDetectDocumentText :: DetectDocumentTextResponse -> TestTree
+responseDetectDocumentText =
+  res
+    "DetectDocumentTextResponse"
+    "fixture/DetectDocumentTextResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DetectDocumentText)
+
+responseGetDocumentAnalysis :: GetDocumentAnalysisResponse -> TestTree
+responseGetDocumentAnalysis =
+  res
+    "GetDocumentAnalysisResponse"
+    "fixture/GetDocumentAnalysisResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetDocumentAnalysis)
+
+responseGetDocumentTextDetection :: GetDocumentTextDetectionResponse -> TestTree
+responseGetDocumentTextDetection =
+  res
+    "GetDocumentTextDetectionResponse"
+    "fixture/GetDocumentTextDetectionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetDocumentTextDetection)
+
+responseGetExpenseAnalysis :: GetExpenseAnalysisResponse -> TestTree
+responseGetExpenseAnalysis =
+  res
+    "GetExpenseAnalysisResponse"
+    "fixture/GetExpenseAnalysisResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetExpenseAnalysis)
+
+responseGetLendingAnalysis :: GetLendingAnalysisResponse -> TestTree
+responseGetLendingAnalysis =
+  res
+    "GetLendingAnalysisResponse"
+    "fixture/GetLendingAnalysisResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetLendingAnalysis)
+
+responseGetLendingAnalysisSummary :: GetLendingAnalysisSummaryResponse -> TestTree
+responseGetLendingAnalysisSummary =
+  res
+    "GetLendingAnalysisSummaryResponse"
+    "fixture/GetLendingAnalysisSummaryResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetLendingAnalysisSummary)
+
+responseStartDocumentAnalysis :: StartDocumentAnalysisResponse -> TestTree
+responseStartDocumentAnalysis =
+  res
+    "StartDocumentAnalysisResponse"
+    "fixture/StartDocumentAnalysisResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StartDocumentAnalysis)
+
+responseStartDocumentTextDetection :: StartDocumentTextDetectionResponse -> TestTree
+responseStartDocumentTextDetection =
+  res
+    "StartDocumentTextDetectionResponse"
+    "fixture/StartDocumentTextDetectionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StartDocumentTextDetection)
+
+responseStartExpenseAnalysis :: StartExpenseAnalysisResponse -> TestTree
+responseStartExpenseAnalysis =
+  res
+    "StartExpenseAnalysisResponse"
+    "fixture/StartExpenseAnalysisResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StartExpenseAnalysis)
+
+responseStartLendingAnalysis :: StartLendingAnalysisResponse -> TestTree
+responseStartLendingAnalysis =
+  res
+    "StartLendingAnalysisResponse"
+    "fixture/StartLendingAnalysisResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StartLendingAnalysis)
diff --git a/test/Test/Amazonka/Textract.hs b/test/Test/Amazonka/Textract.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Textract.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.Textract
+-- 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.Textract
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/Textract/Internal.hs b/test/Test/Amazonka/Textract/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Textract/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.Textract.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.Textract.Internal where
