> ## Documentation Index
> Fetch the complete documentation index at: https://vaquill.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# List contract reviews in a matter

> Every review in this matter, newest first.

A listed review carries its status, its findings summary and its timestamps.
The fields that describe what was ASKED FOR (`contractType`, `userSide`,
`playbookId`, `jurisdiction`, `round`) are absent from a list and present on
a `GET` by id: they live alongside the contract text, and returning them per
row would mean pulling every contract in the page across the wire.



## OpenAPI

````yaml https://api.vaquill.ai/workspace/openapi/v1.json get /v1/matters/{matterId}/reviews
openapi: 3.1.0
info:
  title: Vaquill Legal Workspace API
  description: >-
    Organization-scoped API for driving your legal workspace from your own
    backend: matters, documents, drafting, review, compare and matrices.


    **Authentication**: `Authorization: Bearer vq_ws_...`. Credentials are
    issued by an organization owner from the automation console at `/automation`
    and are shown once. The organization is resolved from the credential and can
    never be named in a request, so there is no `organizationId` field anywhere
    in this API and sending one is refused.


    This is NOT the Vaquill Data API. That one holds a `vq_key_` credential and
    serves the public legal corpus; the two share no credential, host or
    endpoint, and sending a `vq_key_` here is refused with an error naming the
    other product.


    ## Long-running work


    Anything that costs real work answers `202` with an **operation**. Poll `GET
    /v1/operations/{operationId}` until `status` is `succeeded`, `failed` or
    `cancelled`, honouring `Retry-After` between polls. There are no webhooks,
    so polling is the only completion signal. The five statuses are `queued`,
    `running`, `succeeded`, `failed`, `cancelled`, and there is no sixth: every
    capability reports through the same envelope.


    Send an `Idempotency-Key` on any launch. A retry with the same key and the
    same body returns the FIRST operation rather than starting a second billable
    job, which is what makes recovering from a timeout free.


    ## Identifiers


    Every public id is `<prefix>_<32 lowercase hex>`, for example
    `mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6`. The prefix names the resource type.
    Ids are opaque: take them from responses rather than building them, and
    never pass a bare database uuid.


    ## Lists


    Every collection answers `{data, pagination}`, never a bare array. Page with
    `limit` and `offset`, and read `pagination.total` to size a job before
    running it. `pagination.hasMore` is the reliable signal that rows remain.


    ## Errors


    Errors are RFC 9457 problem documents (`application/problem+json`),
    including for a wrong path and a wrong method. Branch on `type`; it is the
    stable identifier and it resolves to a page describing the failure. `title`
    and `detail` are written for people and may be reworded at any time. Every
    response carries `X-Request-ID`, and every error repeats it as `requestId`:
    quote it when contacting support.


    A `404` is returned identically for a resource that does not exist, one
    belonging to another organization, and one outside your installation's
    matter allowlist. That is deliberate, so the status code cannot be used to
    discover which ids exist elsewhere.


    ## Rate limits


    Limits are per credential and are set by what an operation COSTS rather than
    by its HTTP method, so a `GET` that runs a retrieval is not a read. Each
    operation's tier is fixed; a `429` carries `Retry-After`.


    | Tier | Per minute | Per hour | Per day |

    |---|---|---|---|

    | `poll` | 120 | 3000 | 30000 |

    | `read` | 60 | 1200 | 15000 |

    | `write` | 30 | 600 | 5000 |

    | `launch` | 10 | 200 | 2000 |

    | `download` | 20 | 300 | 3000 |

    | `upload` | 5 | 100 | 500 |


    ## Scopes


    A credential carries an explicit scope set, chosen when it is issued. A call
    outside them is `403` with `insufficient-scope`, naming the scopes the
    operation needed. Read and run are separate throughout, so a credential can
    be allowed to read results without being allowed to spend money producing
    them.


    `chronology:read`, `chronology:write`, `clients:read`, `clients:write`,
    `compare:read`, `compare:run`, `compliance:read`, `compliance:run`,
    `credentials:rotate`, `documents:download`, `documents:read`,
    `documents:write`, `drafting:read`, `drafting:run`, `exports:create`,
    `exports:read`, `facts:read`, `facts:run`, `matrices:read`, `matrices:run`,
    `matrices:write`, `matters:read`, `matters:write`, `nda:read`, `nda:run`,
    `operations:read`, `playbooks:read`, `playbooks:run`, `playbooks:write`,
    `research:read`, `research:run`, `review:read`, `review:run`,
    `summaries:read`, `summaries:run`, `webhooks:read`, `webhooks:write`,
    `workflows:read`, `workflows:run`, `workflows:write`
  version: 1.0.0
servers:
  - url: https://api.vaquill.ai/workspace
    description: Vaquill Legal Workspace API (production)
  - url: /workspace
    description: Vaquill Legal Workspace API (relative to the mount)
security:
  - WorkspaceAuth: []
tags:
  - name: Operations
    description: >-
      The one job envelope. Every long-running call answers `202` with an
      operation, and polling this resource is the only way to learn it finished:
      there are no webhooks. Five statuses, no synonyms.
  - name: Clients
    description: The people and companies matters are filed under. Synchronous CRUD.
  - name: Matters
    description: >-
      The unit of work everything else hangs off. A matter scopes documents,
      drafts, reviews, comparisons and matrices, and it is what a credential's
      access is checked against.
  - name: Folders
    description: >-
      Organization inside and across matters. The same folders the web app
      shows, so one created here appears in the customer's browser.
  - name: Documents
    description: >-
      Files in a matter: their metadata, their ingested text, and the original
      bytes. A document is only usable by retrieval, drafting and review once
      its status is `succeeded`.
  - name: Uploads
    description: >-
      Getting files in. One presigned multipart flow at every size, with the
      bytes going straight to storage and never through this API. Initiate, PUT
      each part, then complete.
  - name: Research
    description: >-
      Asking legal questions and getting grounded, cited answers. This API does
      NOT stream: an ask answers `202` and you poll the operation, then read the
      answer off the message it points at. Conversation state is kept here, so
      you hold a chat id rather than replaying a transcript. Also covers the
      matter settings behind an answer, the skills you can ask through, and the
      standalone web-research tools.
  - name: Drafting
    description: >-
      Generating, revising and exporting draft documents. Bodies come out as
      sections and go in as markdown; the editor's own format is never on the
      wire. Rendered files come from the export route.
  - name: Playbooks
    description: >-
      The organization's negotiating positions, per contract type, and the
      starter templates to build them from. A playbook is the input a contract
      review is measured against.
  - name: Reviews
    description: >-
      Reviewing one contract against a playbook: clause analysis, redlines,
      flags, liability exposure and a reported sign-off gate. Export applies the
      redlines as native Word tracked changes.
  - name: Facts
    description: >-
      The cross-document fact ledger for a matter: what every document in it
      asserts, coalesced and cited back to its source passages.
  - name: Matter summary
    description: >-
      A citation-backed summary of everything filed to a matter, generated on
      demand and readable claim by claim.
  - name: Chronology
    description: >-
      The dated events across a matter's documents, as one timeline, with
      duplicate and date-conflict flags.
  - name: NDA triage
    description: >-
      Screening one inbound NDA against ten standard criteria and, where you
      name one, your own NDA playbook. Answers `green`, `yellow` or `red` with
      the reasoning per criterion, plus a report you can forward.
  - name: Compliance
    description: >-
      Checking one document against one regulation's requirement checklist: a
      verdict per requirement with the article it comes from, the gaps, and what
      to do about them. Only regulations with a real checklist behind them are
      accepted.
  - name: Comparisons
    description: >-
      Diffing two documents in a matter into structural changes, with a
      substantive-versus-cosmetic judgment and a downloadable redline.
  - name: Matrices
    description: >-
      Spreadsheet-style extraction across many documents: rows are documents,
      columns are questions, cells are answers with verified citations. Building
      a grid is free; running it is what costs.
  - name: Workflows
    description: >-
      Multi-step analyses from a fixed catalogue. Read a definition to learn
      what documents and inputs it takes, launch a run inside a matter, then
      download the artifacts it produces.
externalDocs:
  description: Getting started guide and error reference
  url: https://vaquill.ai/docs/workspace-api
paths:
  /v1/matters/{matterId}/reviews:
    get:
      tags:
        - Reviews
      summary: List contract reviews in a matter
      description: >-
        Every review in this matter, newest first.


        A listed review carries its status, its findings summary and its
        timestamps.

        The fields that describe what was ASKED FOR (`contractType`, `userSide`,

        `playbookId`, `jurisdiction`, `round`) are absent from a list and
        present on

        a `GET` by id: they live alongside the contract text, and returning them
        per

        row would mean pulling every contract in the page across the wire.
      operationId: reviews.list
      parameters:
        - name: matterId
          in: path
          required: true
          schema:
            type: string
            title: Matterid
          description: >-
            `mat_` identifier of the matter to work inside. Everything in this
            API hangs off a matter, and the matter in the path is what the
            authorization boundary is checked against. Take it from `GET
            /v1/matters`.
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            maximum: 200
            minimum: 1
            description: How many rows to return, 1 to 200. Defaults to 50.
            default: 50
            title: Limit
          description: How many rows to return, 1 to 200. Defaults to 50.
        - name: offset
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
            description: >-
              How many rows to skip before returning any. Combine with `limit`
              to page: `offset=0`, then `offset=50`, and so on. Offsets are
              positional, not stable, so a set that changes while you page can
              show a row twice or not at all.
            default: 0
            title: Offset
          description: >-
            How many rows to skip before returning any. Combine with `limit` to
            page: `offset=0`, then `offset=50`, and so on. Offsets are
            positional, not stable, so a set that changes while you page can
            show a row twice or not at all.
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Page_Review_'
              example:
                data:
                  - id: rev_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6
                    matterId: mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6
                    status: succeeded
                    contractType: msa
                    userSide: buyer
                    playbookId: value
                    jurisdiction: US
                    round: 1
                    summary: >-
                      Twelve substantive changes, seven of them in the liability
                      and indemnity sections.
                    overallRisk: yellow
                    businessImpactSummary: >-
                      Two changes shift risk toward us; the rest are
                      housekeeping.
                    approvalGate:
                      required: false
                      level: partner
                      dealBreakerCount: 1
                      reasons:
                        - clauseName: Limitation of Liability
                          approvalLevel: partner
                          isDealBreaker: false
                          note: 'Escalated to GC: deal value over $1M.'
                      summary: >-
                        Twelve substantive changes, seven of them in the
                        liability and indemnity sections.
                    liabilityExposure:
                      exposureLevel: yellow
                      verdict: >-
                        Liability is capped at fees paid in the preceding twelve
                        months.
                      capStatus: capped
                      capAmount: Fees paid in the preceding twelve months
                      capQuote: >-
                        shall not exceed the fees paid in the preceding twelve
                        months
                      grounding: verified
                      capScope: aggregate
                      capAdequate: false
                      mutualCap: false
                      consequentialDamagesExcluded: false
                      uncappedCarveouts:
                        - Indemnity for IP infringement
                        - Confidentiality breach
                      supercap: Two times fees for data-security breaches
                      indemnityExposure: Uncapped for third-party IP claims.
                      insuranceRequired: $5M commercial general liability
                      claimTimeBar: Claims must be brought within 12 months.
                    counterpartyMatch:
                      name: Acme Corporation
                      vendor: Acme Corporation
                      flexibility: limited
                      negotiationStrategyNote: >-
                        This paper is rarely amended below the enterprise tier;
                        lead with the liability cap.
                      counterpartyRedlinesCount: 4
                    clauses:
                      - clauseName: Limitation of Liability
                        clauseType: limitation_of_liability
                        sectionReference: '8.2'
                        currentLanguage: Supplier's total liability shall be unlimited.
                        severity: yellow
                        analysis: >-
                          The clause is uncapped and departs from the playbook's
                          standard position.
                        riskDescription: >-
                          Unlimited liability for a breach we cannot fully
                          control.
                        playbookPosition: >-
                          Cap liability at fees paid in the preceding twelve
                          months.
                        approvalLevel: partner
                        isDealBreaker: false
                    redlines:
                      - clauseName: Limitation of Liability
                        sectionReference: '8.2'
                        currentLanguage: Supplier's total liability shall be unlimited.
                        proposedLanguage: >-
                          Supplier's total liability shall not exceed the fees
                          paid in the preceding twelve months.
                        rationale: >-
                          Our standard position caps liability at fees paid in
                          the preceding 12 months.
                        priority: must_have
                        fallbackPosition: Two times fees paid in the preceding twelve months.
                        grounding: verified
                        approvalLevel: partner
                        isDealBreaker: false
                        nature: substantive
                    negotiationPriorities:
                      - tier: 1
                        tierLabel: Must have
                        items:
                          - Cap liability
                          - Remove uncapped indemnity
                    missingClauses:
                      - Force Majeure
                    flags:
                      - clauseName: Limitation of Liability
                        sectionReference: '8.2'
                        observation: >-
                          The counterparty entity name differs from the one on
                          the signature block.
                    parseWarning: >-
                      Two clauses could not be parsed and are omitted from the
                      findings.
                    deep:
                      clausesReviewed: 1
                      redlinesKept: 1
                      clearedAsCompliant: 1
                      clauseLimit: 40
                      clausesTruncated: false
                    createdAt: '2026-08-19T14:32:10Z'
                    completedAt: '2026-08-19T14:32:10Z'
                pagination:
                  limit: 50
                  offset: 0
                  total: 128
                  hasMore: false
        '401':
          description: >-
            The credential is missing, malformed, unknown, revoked or expired.
            `type` is `invalid-credential`, or `wrong-product-credential` when a
            `vq_key_` Data API key was sent to this API.
          headers:
            X-Request-ID:
              description: >-
                The id of this request. The same value appears as `requestId` in
                the body. Quote it when contacting support.
              schema:
                type: string
                examples:
                  - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6
            WWW-Authenticate:
              description: RFC 9110 authentication challenge.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        '403':
          description: >-
            The credential does not carry a scope this operation requires
            (`insufficient-scope`), or the organization's installation is
            suspended (`installation-inactive`).
          headers:
            X-Request-ID:
              description: >-
                The id of this request. The same value appears as `requestId` in
                the body. Quote it when contacting support.
              schema:
                type: string
                examples:
                  - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6
            WWW-Authenticate:
              description: RFC 9110 authentication challenge.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        '404':
          description: >-
            The resource does not exist, is not this organization's, or is
            outside this installation's matter allowlist. The three are
            deliberately indistinguishable, so the status code cannot be used to
            discover which ids exist in another organization. Each resource has
            its own `type`.
          headers:
            X-Request-ID:
              description: >-
                The id of this request. The same value appears as `requestId` in
                the body. Quote it when contacting support.
              schema:
                type: string
                examples:
                  - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        '422':
          description: >-
            The request does not match the published schema. `errors` names each
            rejected field and why. The submitted value is never echoed back.
          headers:
            X-Request-ID:
              description: >-
                The id of this request. The same value appears as `requestId` in
                the body. Quote it when contacting support.
              schema:
                type: string
                examples:
                  - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ValidationProblem'
        '429':
          description: Too many requests for this credential's tier. Honour `Retry-After`.
          headers:
            X-Request-ID:
              description: >-
                The id of this request. The same value appears as `requestId` in
                the body. Quote it when contacting support.
              schema:
                type: string
                examples:
                  - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6
            Retry-After:
              description: Seconds to wait before retrying.
              schema:
                type: integer
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        '500':
          description: >-
            An unexpected error on our side. The body carries a stable `type`
            and the request id and nothing else; the cause is in our logs.
          headers:
            X-Request-ID:
              description: >-
                The id of this request. The same value appears as `requestId` in
                the body. Quote it when contacting support.
              schema:
                type: string
                examples:
                  - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        '503':
          description: >-
            A dependency this request needs is unavailable, so nothing was done.
            Retryable. Authentication fails closed rather than admitting the
            request, so this is never a statement about your credential.
          headers:
            X-Request-ID:
              description: >-
                The id of this request. The same value appears as `requestId` in
                the body. Quote it when contacting support.
              schema:
                type: string
                examples:
                  - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
components:
  schemas:
    Page_Review_:
      properties:
        data:
          items:
            $ref: '#/components/schemas/Review'
          type: array
          title: Data
          description: The rows in this window, in the collection's default order.
        pagination:
          $ref: '#/components/schemas/Pagination'
          description: Where this window sits in the full result set.
      additionalProperties: false
      type: object
      required:
        - data
        - pagination
      title: Page[Review]
    Problem:
      type: object
      title: Problem
      description: >-
        An RFC 9457 problem document. Branch on `type`, which is stable; `title`
        and `detail` are written for people and may be reworded. Some problems
        carry extra members (`requiredScopes`, `limit`, `expectedVersion`),
        which is why this object is open.
      required:
        - type
        - title
        - status
        - detail
        - instance
      properties:
        type:
          type: string
          format: uri
          description: >-
            The stable identifier for this error, and the one field to branch
            on. Resolves to a page describing it.
          examples:
            - https://vaquill.ai/docs/workspace-api/errors/insufficient-scope
        title:
          type: string
          description: A short human-readable summary.
          examples:
            - Insufficient scope
        status:
          type: integer
          description: The HTTP status code, repeated.
          examples:
            - 403
        detail:
          type: string
          description: >-
            What went wrong on this specific request. May be reworded at any
            time.
          examples:
            - >-
              This credential carries matters:read. This operation needs
              matters:write.
        instance:
          type: string
          description: The path this problem occurred on.
          examples:
            - /workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6
        requestId:
          type: string
          description: >-
            The id of this request, identical to the `X-Request-ID` response
            header. Quote it when contacting support.
          examples:
            - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6
      additionalProperties: true
    ValidationProblem:
      type: object
      title: ValidationProblem
      description: >-
        A problem document for a schema rejection. `errors` lists the fields
        that were refused. The value you submitted is deliberately not echoed,
        so a validation failure cannot copy your content into an error response
        or into either side's logs.
      required:
        - type
        - title
        - status
        - detail
        - instance
        - errors
      properties:
        type:
          type: string
          format: uri
          description: >-
            The stable identifier for this error, and the one field to branch
            on. Resolves to a page describing it.
          examples:
            - https://vaquill.ai/docs/workspace-api/errors/insufficient-scope
        title:
          type: string
          description: A short human-readable summary.
          examples:
            - Insufficient scope
        status:
          type: integer
          description: The HTTP status code, repeated.
          examples:
            - 403
        detail:
          type: string
          description: >-
            What went wrong on this specific request. May be reworded at any
            time.
          examples:
            - >-
              This credential carries matters:read. This operation needs
              matters:write.
        instance:
          type: string
          description: The path this problem occurred on.
          examples:
            - /workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6
        requestId:
          type: string
          description: >-
            The id of this request, identical to the `X-Request-ID` response
            header. Quote it when contacting support.
          examples:
            - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6
        errors:
          type: array
          description: One entry per rejected field.
          items:
            type: object
            required:
              - location
              - message
              - type
            properties:
              location:
                type: string
                description: >-
                  Dotted path to the rejected field, for example
                  `body.contentMarkdown`.
              message:
                type: string
                description: Why it was rejected.
              type:
                type: string
                description: The validation rule that failed.
      additionalProperties: true
    Review:
      properties:
        id:
          type: string
          title: Id
          description: Public identifier, `rev_` followed by 32 hex characters.
          examples:
            - rev_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6
        matterId:
          type: string
          title: Matterid
          description: '`mat_` identifier of the matter this review belongs to.'
          examples:
            - mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6
        status:
          $ref: '#/components/schemas/OperationStatus'
          description: >-
            Review status, using the same five public values as an operation.
            While `queued` or `running`, every findings list is empty and the
            scalar fields are absent. That is the truthful shape of a review
            that has not happened yet, not an error.
          examples:
            - succeeded
        contractType:
          anyOf:
            - type: string
            - type: 'null'
          title: Contracttype
          description: Contract type the review ran as, echoed from the request.
          examples:
            - msa
        userSide:
          anyOf:
            - type: string
            - type: 'null'
          title: Userside
          description: Which side the review argued for, echoed from the request.
          examples:
            - buyer
        playbookId:
          anyOf:
            - type: string
            - type: 'null'
          title: Playbookid
          description: >-
            The playbook the review actually ran against. Absent when it ran
            against the built-in defaults, so the two cases can be told apart
            after the fact.
          examples:
            - pbk_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6
        jurisdiction:
          anyOf:
            - type: string
            - type: 'null'
          title: Jurisdiction
          description: Jurisdiction the review ran under.
          examples:
            - US
        round:
          type: integer
          title: Round
          description: Negotiation round this review was run for.
          default: 1
          examples:
            - 1
        summary:
          type: string
          title: Summary
          description: Prose summary of the review's conclusions.
          default: ''
          examples:
            - >-
              Twelve substantive changes, seven of them in the liability and
              indemnity sections.
        overallRisk:
          anyOf:
            - type: string
            - type: 'null'
          title: Overallrisk
          description: 'Overall risk rating for the contract: `green`, `yellow` or `red`.'
          examples:
            - yellow
        businessImpactSummary:
          anyOf:
            - type: string
            - type: 'null'
          title: Businessimpactsummary
          description: What the findings mean commercially, in plain language.
          examples:
            - Two changes shift risk toward us; the rest are housekeeping.
        approvalGate:
          anyOf:
            - $ref: '#/components/schemas/ReviewApprovalGate'
            - type: 'null'
          description: >-
            Whether a human should sign this off before it goes out. Reported,
            never enforced.
        liabilityExposure:
          anyOf:
            - $ref: '#/components/schemas/ReviewLiabilityExposure'
            - type: 'null'
          description: >-
            How much you are on the hook for: caps, carve-outs, indemnities and
            insurance.
        counterpartyMatch:
          anyOf:
            - $ref: '#/components/schemas/ReviewCounterpartyMatch'
            - type: 'null'
          description: >-
            Set when a known counterparty paper was recognized, which means the
            findings include counterparty-specific redlines layered on the
            general analysis.
        clauses:
          items:
            $ref: '#/components/schemas/ReviewClause'
          type: array
          title: Clauses
          description: >-
            Every clause analyzed, with its severity against the playbook
            position.
        redlines:
          items:
            $ref: '#/components/schemas/ReviewRedline'
          type: array
          title: Redlines
          description: >-
            Proposed edits, ready to send to counterparty counsel. Check each
            one's `grounding` before applying it automatically.
        negotiationPriorities:
          items:
            $ref: '#/components/schemas/ReviewNegotiationPriority'
          type: array
          title: Negotiationpriorities
          description: What to raise first and what to trade, in tiers.
        missingClauses:
          items:
            type: string
          type: array
          title: Missingclauses
          description: >-
            Standard clauses ABSENT from the contract. The one finding that
            cannot be expressed as a clause analysis, because there is no clause
            to analyze.
          examples:
            - - Force Majeure
        flags:
          items:
            $ref: '#/components/schemas/ReviewFlag'
          type: array
          title: Flags
          description: >-
            Things the reviewer noticed and deliberately did not redline: a
            wrong entity name, an odd schedule entry, a real ambiguity. Confirm
            these with a human before signing.
        parseWarning:
          anyOf:
            - type: string
            - type: 'null'
          title: Parsewarning
          description: >-
            Set when the model's output only partly parsed, which means the
            findings may be incomplete. Present is the difference between acting
            on the findings and asking a human first.
          examples:
            - Two clauses could not be parsed and are omitted from the findings.
        deep:
          anyOf:
            - $ref: '#/components/schemas/ReviewDeepMeta'
            - type: 'null'
          description: >-
            What the deep verification pass did. Absent on a standard review,
            which is the signal that no verification ran rather than that it
            found nothing.
        createdAt:
          type: string
          format: date-time
          title: Createdat
          description: When the review was created (RFC 3339).
          examples:
            - '2026-08-19T14:32:10Z'
        completedAt:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Completedat
          description: When the review reached a terminal status (RFC 3339).
          examples:
            - '2026-08-19T14:32:10Z'
      additionalProperties: false
      type: object
      required:
        - id
        - matterId
        - status
        - createdAt
      title: Review
      description: 'One contract review: its findings, or its progress toward them.'
    Pagination:
      properties:
        limit:
          type: integer
          title: Limit
          description: The `limit` that was applied to this request.
          examples:
            - 50
        offset:
          type: integer
          title: Offset
          description: The `offset` that was applied to this request.
          examples:
            - 0
        total:
          type: integer
          title: Total
          description: >-
            Total rows matching the filter, not the number returned in `data`.
            Use it to size a job before running it.
          examples:
            - 128
        hasMore:
          type: boolean
          title: Hasmore
          description: >-
            True when rows remain beyond this window. Derived from `offset +
            len(data) < total`, so a full final page correctly reports `false`
            rather than sending you after an empty page.
          examples:
            - false
      additionalProperties: false
      type: object
      required:
        - limit
        - offset
        - total
        - hasMore
      title: Pagination
      description: >-
        Where the caller is, and whether there is more.


        `total` is the count of rows matching the filter, not the count
        returned,

        so a caller can size a job before running it.
    OperationStatus:
      type: string
      enum:
        - queued
        - running
        - succeeded
        - failed
        - cancelled
      title: OperationStatus
      description: >-
        The public five. There is no sixth, and there are no synonyms.


        Internal vocabularies spell terminal success `completed`, `ready`,

        `extracted`, `succeeded` and `fresh`; terminal failure `failed` and
        `error`;

        queued `pending`, `queued` and `draft`. All of that is collapsed here by

        `app.workspace_api.adapters.status_map`, which refuses to guess.
    ReviewApprovalGate:
      properties:
        required:
          type: boolean
          title: Required
          description: >-
            Whether a human should sign this off before it goes to the
            counterparty. REPORTED, never enforced: it does not block the review
            or the export. Implement the gate on your side using this field.
          default: false
          examples:
            - false
        level:
          anyOf:
            - type: string
            - type: 'null'
          title: Level
          description: >-
            The highest sign-off any gating clause needs: `manager`, `partner`
            or `gc`. Absent when `required` is false.
          examples:
            - partner
        dealBreakerCount:
          type: integer
          title: Dealbreakercount
          description: How many clauses sit at or below the walk-away floor.
          default: 0
          examples:
            - 1
        reasons:
          items:
            $ref: '#/components/schemas/ReviewApprovalReason'
          type: array
          title: Reasons
          description: Which clauses drive the gate, and why each one does.
        summary:
          type: string
          title: Summary
          description: One-line explanation of the gate, suitable to show a reviewer.
          default: ''
          examples:
            - >-
              Twelve substantive changes, seven of them in the liability and
              indemnity sections.
      additionalProperties: false
      type: object
      title: ReviewApprovalGate
      description: >-
        Whether a human has to sign this off before it goes to the counterparty.


        **Reported, never enforced.** The gate is computed deterministically
        from the

        playbook's own `approvalLevel` and `dealBreaker` on clauses that
        actually

        deviated, and it is published as a fact about the result. It does not
        block

        the review, it does not block the export, and the operation reaches a

        terminal status either way.


        That is the same decision the acting-user header already carries (docs
        07.3):

        we record what we know and build no enforcement machinery we cannot
        honour.

        Enforcing would mean an approval workflow, an enrolled approver
        directory and

        a state a review can sit in indefinitely, which is precisely the "do not
        let

        it hang" failure the handoff for this track warned about. A caller that
        wants

        a gate has everything it needs to implement one: `required` says
        whether,

        `level` says who, and `reasons` says why.
    ReviewLiabilityExposure:
      properties:
        exposureLevel:
          type: string
          title: Exposurelevel
          description: >-
            Overall liability exposure from your side: `green`, `yellow` or
            `red`.
          examples:
            - yellow
        verdict:
          type: string
          title: Verdict
          description: Plain-language summary of the liability position.
          default: ''
          examples:
            - Liability is capped at fees paid in the preceding twelve months.
        capStatus:
          anyOf:
            - type: string
            - type: 'null'
          title: Capstatus
          description: >-
            Whether liability is capped: `capped`, `uncapped`, `partial` or
            `not_addressed`. Null when it could not be determined.
          examples:
            - capped
        capAmount:
          anyOf:
            - type: string
            - type: 'null'
          title: Capamount
          description: >-
            The cap as written, as a string rather than a number since contracts
            express it in many forms (a figure, a multiple of fees, a formula).
          examples:
            - Fees paid in the preceding twelve months
        capQuote:
          anyOf:
            - type: string
            - type: 'null'
          title: Capquote
          description: >-
            The verbatim contract sentence the cap claim is drawn from, so a
            headline number can be checked against the source rather than
            trusted.
          examples:
            - shall not exceed the fees paid in the preceding twelve months
        grounding:
          anyOf:
            - type: string
            - type: 'null'
          title: Grounding
          description: >-
            `verified` when `capQuote` is a literal span of the contract,
            `unverified` when it could not be found. Same meaning as on a
            redline.
          examples:
            - verified
        capScope:
          anyOf:
            - type: string
            - type: 'null'
          title: Capscope
          description: >-
            What the cap applies across: `per_claim`, `aggregate`, `both` or
            `unclear`.
          examples:
            - aggregate
        capAdequate:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Capadequate
          description: >-
            Whether the cap is meaningful against plausible harm and deal value.
            A cap tied to fees paid to date is inadequate even though a cap
            exists.
          examples:
            - false
        mutualCap:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Mutualcap
          description: Whether the cap applies to both sides equally.
          examples:
            - false
        consequentialDamagesExcluded:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Consequentialdamagesexcluded
          description: Whether consequential and indirect damages are excluded.
          examples:
            - false
        uncappedCarveouts:
          items:
            type: string
          type: array
          title: Uncappedcarveouts
          description: >-
            Categories of liability that sit OUTSIDE the cap, for example
            indemnity or confidentiality breaches.
          examples:
            - - Indemnity for IP infringement
              - Confidentiality breach
        supercap:
          anyOf:
            - type: string
            - type: 'null'
          title: Supercap
          description: >-
            A raised cap that applies to specific categories, when the contract
            sets one.
          examples:
            - Two times fees for data-security breaches
        indemnityExposure:
          anyOf:
            - type: string
            - type: 'null'
          title: Indemnityexposure
          description: What you are indemnifying the counterparty for.
          examples:
            - Uncapped for third-party IP claims.
        insuranceRequired:
          anyOf:
            - type: string
            - type: 'null'
          title: Insurancerequired
          description: Insurance the contract requires you to carry.
          examples:
            - $5M commercial general liability
        claimTimeBar:
          anyOf:
            - type: string
            - type: 'null'
          title: Claimtimebar
          description: Any deadline for bringing a claim under the contract.
          examples:
            - Claims must be brought within 12 months.
      additionalProperties: false
      type: object
      required:
        - exposureLevel
      title: ReviewLiabilityExposure
      description: >-
        How much the reviewer is on the hook for, in one panel.


        Every field is nullable and stays nullable. This is assembled
        defensively

        from LLM output about contract language that may not exist: a contract
        with

        no liability clause has no cap, and `null` is the true answer rather
        than a

        zero that reads as "capped at nothing".
    ReviewCounterpartyMatch:
      properties:
        name:
          type: string
          title: Name
          description: Name of the recognized counterparty paper.
          examples:
            - Acme Corporation
        vendor:
          type: string
          title: Vendor
          description: The vendor whose standard form this is.
          examples:
            - Acme Corporation
        flexibility:
          type: string
          title: Flexibility
          description: >-
            How negotiable this paper is in practice: `rigid`, `limited` or
            `standard`.
          examples:
            - limited
        negotiationStrategyNote:
          type: string
          title: Negotiationstrategynote
          description: How to approach negotiating against this specific paper.
          examples:
            - >-
              This paper is rarely amended below the enterprise tier; lead with
              the liability cap.
        counterpartyRedlinesCount:
          type: integer
          title: Counterpartyredlinescount
          description: >-
            How many redlines the counterparty overlay contributed on top of the
            general analysis. A non-zero value means the findings are tuned to
            this specific paper.
          default: 0
          examples:
            - 4
      additionalProperties: false
      type: object
      required:
        - name
        - vendor
        - flexibility
        - negotiationStrategyNote
      title: ReviewCounterpartyMatch
      description: >-
        A known counterparty paper was recognised in the contract text.


        Published so a caller knows the findings include counterparty-specific

        redlines layered on top of the general analysis, which changes how the
        result

        should be read. The catalogue slug and the phrases that matched are NOT

        published: they are our detection internals, and neither is actionable.
    ReviewClause:
      properties:
        clauseName:
          type: string
          title: Clausename
          description: >-
            Human-readable name of the clause, for example 'Limitation of
            Liability'.
          examples:
            - Limitation of Liability
        clauseType:
          type: string
          title: Clausetype
          description: >-
            Clause-type slug the analysis matched, the same key a playbook's
            `positions` map uses.
          examples:
            - limitation_of_liability
        sectionReference:
          anyOf:
            - type: string
            - type: 'null'
          title: Sectionreference
          description: Where the clause sits in the contract, for example `8.2`.
          examples:
            - '8.2'
        currentLanguage:
          type: string
          title: Currentlanguage
          description: >-
            The exact quote from the contract this analysis is about. Empty when
            the finding is that the clause is ABSENT, which is the one case with
            nothing to quote.
          default: ''
          examples:
            - Supplier's total liability shall be unlimited.
        severity:
          type: string
          title: Severity
          description: >-
            How far the clause deviates from the playbook position: `green`,
            `yellow` or `red`. Published as a plain string so a new level cannot
            break your client.
          examples:
            - yellow
        analysis:
          type: string
          title: Analysis
          description: What the reviewer concluded about this clause.
          examples:
            - >-
              The clause is uncapped and departs from the playbook's standard
              position.
        riskDescription:
          anyOf:
            - type: string
            - type: 'null'
          title: Riskdescription
          description: What could go wrong if the clause stands as written.
          examples:
            - Unlimited liability for a breach we cannot fully control.
        playbookPosition:
          anyOf:
            - type: string
            - type: 'null'
          title: Playbookposition
          description: The playbook position this clause was measured against.
          examples:
            - Cap liability at fees paid in the preceding twelve months.
        approvalLevel:
          anyOf:
            - type: string
            - type: 'null'
          title: Approvallevel
          description: >-
            Sign-off a deviation on this clause needs: `none`, `manager`,
            `partner` or `gc`. Computed server-side by matching the clause to
            its playbook position, never asserted by the model. Only meaningful
            when `severity` is not green.
          examples:
            - partner
        isDealBreaker:
          type: boolean
          title: Isdealbreaker
          description: True when the clause is at or below the playbook's walk-away floor.
          default: false
          examples:
            - false
      additionalProperties: false
      type: object
      required:
        - clauseName
        - clauseType
        - severity
        - analysis
      title: ReviewClause
      description: One clause, as analyzed against the playbook position for its type.
    ReviewRedline:
      properties:
        clauseName:
          type: string
          title: Clausename
          description: Which clause this edit applies to.
          examples:
            - Limitation of Liability
        sectionReference:
          anyOf:
            - type: string
            - type: 'null'
          title: Sectionreference
          description: Where the clause sits in the contract, for example `8.2`.
          examples:
            - '8.2'
        currentLanguage:
          type: string
          title: Currentlanguage
          description: >-
            The text to be replaced, as it stands in the contract. Empty for an
            insertion.
          default: ''
          examples:
            - Supplier's total liability shall be unlimited.
        proposedLanguage:
          type: string
          title: Proposedlanguage
          description: The replacement text to send to the counterparty.
          examples:
            - >-
              Supplier's total liability shall not exceed the fees paid in the
              preceding twelve months.
        rationale:
          type: string
          title: Rationale
          description: >-
            Why this edit is being proposed. Suitable to put in a margin
            comment.
          examples:
            - >-
              Our standard position caps liability at fees paid in the preceding
              12 months.
        priority:
          type: string
          title: Priority
          description: >-
            How hard to push for this edit: `must_have`, `should_have` or
            `nice_to_have`.
          examples:
            - must_have
        fallbackPosition:
          anyOf:
            - type: string
            - type: 'null'
          title: Fallbackposition
          description: >-
            What to retreat to if this edit is rejected, taken from the
            playbook's fallback ladder.
          examples:
            - Two times fees paid in the preceding twelve months.
        grounding:
          type: string
          title: Grounding
          description: >-
            Whether `currentLanguage` was found verbatim in the contract.
            `verified` means it was. `unverified` means it was NOT, so the edit
            may be misanchored. `insertion` means there is nothing to anchor
            because the clause is missing. An integration applying redlines
            automatically must stop and ask a human on `unverified`.
          default: verified
          examples:
            - verified
        approvalLevel:
          anyOf:
            - type: string
            - type: 'null'
          title: Approvallevel
          description: >-
            Sign-off this edit needs before it goes out: `none`, `manager`,
            `partner` or `gc`.
          examples:
            - partner
        isDealBreaker:
          type: boolean
          title: Isdealbreaker
          description: >-
            True when the clause this edit addresses is at or below the
            walk-away floor.
          default: false
          examples:
            - false
        nature:
          anyOf:
            - type: string
            - type: 'null'
          title: Nature
          description: >-
            `substantive` or `housekeeping`. Absent means unclassified, on a
            review produced before the pipeline classified this. Absent is NOT
            the same as `housekeeping`.
          examples:
            - substantive
      additionalProperties: false
      type: object
      required:
        - clauseName
        - proposedLanguage
        - rationale
        - priority
      title: ReviewRedline
      description: One proposed edit, ready to send to counterparty counsel.
    ReviewNegotiationPriority:
      properties:
        tier:
          type: integer
          title: Tier
          description: >-
            Priority tier: 1 is must-have and covers deal breakers, 2 is
            should-have, 3 is nice-to-have.
          examples:
            - 1
        tierLabel:
          type: string
          title: Tierlabel
          description: Human-readable name for the tier.
          examples:
            - Must have
        items:
          items:
            type: string
          type: array
          title: Items
          description: What to raise at this tier, in order.
          examples:
            - - Cap liability
              - Remove uncapped indemnity
      additionalProperties: false
      type: object
      required:
        - tier
        - tierLabel
        - items
      title: ReviewNegotiationPriority
      description: >-
        One tier of the negotiation plan: what to raise first, and what to
        trade.
    ReviewFlag:
      properties:
        clauseName:
          type: string
          title: Clausename
          description: Which clause or part of the contract the observation is about.
          examples:
            - Limitation of Liability
        sectionReference:
          anyOf:
            - type: string
            - type: 'null'
          title: Sectionreference
          description: Where it sits in the contract.
          examples:
            - '8.2'
        observation:
          type: string
          title: Observation
          description: >-
            What the reviewer noticed. These are things a human should confirm
            before signing, not edits, which makes them the most important field
            here for a caller automating the review away.
          examples:
            - >-
              The counterparty entity name differs from the one on the signature
              block.
      additionalProperties: false
      type: object
      required:
        - clauseName
        - observation
      title: ReviewFlag
      description: >-
        Something the reviewer noticed and deliberately did NOT redline.


        A wrong entity name, an odd schedule entry, a real ambiguity. These are
        not

        edits; they are things a human should confirm before signing, which
        makes

        them the most important thing on this surface for a caller that is
        otherwise

        automating the review away.
    ReviewDeepMeta:
      properties:
        clausesReviewed:
          type: integer
          title: Clausesreviewed
          description: How many first-pass flagged clauses the deep pass verified.
          examples:
            - 1
        redlinesKept:
          type: integer
          title: Redlineskept
          description: How many survived verification and are in `redlines`.
          examples:
            - 1
        clearedAsCompliant:
          type: integer
          title: Clearedascompliant
          description: >-
            How many first-pass flags the deep pass cleared as already
            compliant, and therefore dropped. Fewer false positives is the point
            of running deep.
          examples:
            - 1
        clauseLimit:
          type: integer
          title: Clauselimit
          description: >-
            The ceiling on how many flagged clauses a deep review verifies,
            currently 40.
          default: 40
          examples:
            - 40
        clausesTruncated:
          type: boolean
          title: Clausestruncated
          description: >-
            True when the deep pass hit its 40-clause ceiling, which means
            first-pass flags beyond it were NOT verified and are NOT in
            `redlines`. Treat the review as covering the first 40 findings only.
            A boolean rather than a count because the number dropped is not
            recorded anywhere upstream.
          default: false
          examples:
            - false
      additionalProperties: false
      type: object
      required:
        - clausesReviewed
        - redlinesKept
        - clearedAsCompliant
      title: ReviewDeepMeta
      description: >-
        What the deep verification pass did, present only when one ran.


        Absent on a standard review, which is the honest signal that no
        verification

        happened rather than a zeroed object implying one found nothing.


        `estimatedCostUsd` is dropped on the way through. It is our spend and
        our

        model choice, and it is on the list of things a published DTO always
        drops.
    ReviewApprovalReason:
      properties:
        clauseName:
          type: string
          title: Clausename
          description: The clause driving this part of the gate.
          examples:
            - Limitation of Liability
        approvalLevel:
          anyOf:
            - type: string
            - type: 'null'
          title: Approvallevel
          description: Sign-off this clause requires.
          examples:
            - partner
        isDealBreaker:
          type: boolean
          title: Isdealbreaker
          description: True when this clause is at or below the walk-away floor.
          default: false
          examples:
            - false
        note:
          anyOf:
            - type: string
            - type: 'null'
          title: Note
          description: >-
            Set when a conditional rule RAISED this clause's sign-off, for
            example 'Escalated to GC: deal value over $1M'. Absent when the
            level came straight from the playbook position.
          examples:
            - 'Escalated to GC: deal value over $1M.'
      additionalProperties: false
      type: object
      required:
        - clauseName
      title: ReviewApprovalReason
      description: One clause driving the review-level sign-off gate.
  securitySchemes:
    WorkspaceAuth:
      type: http
      scheme: bearer
      bearerFormat: vq_ws_*
      description: >-
        Workspace credential issued from the automation console at
        `/automation`. Send it as `Authorization: Bearer vq_ws_...`. This is NOT
        a Data API key: a `vq_key_` credential is refused here and names the
        other product in the error.

````