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

# Edit an alert

> Use the same field names and nesting as GET. Send only fields to change, including individual fields inside expected; omitted fields are preserved and null clears a nullable field. Use exact decimal strings and rates as fractions. expected.net_price and expected.total are calculated and read-only. invoiced, invoice_item, provenance, and status are read-only. citations accepts explicit upsert/remove changes by source_ref; omitted citations and fields are preserved. Field edits update the shared citation in every linked alert/topic; citation selectors relink only this alert. Shared edits are blocked by protected claims or locked topics. Document edits are re-verified against stored text; verification and metadata are server-owned. Inline markers must resolve against the resulting collection. Saving does not start checks or model work.



## OpenAPI

````yaml /openapi-preview.json patch /v1/alerts/{id}
openapi: 3.1.0
info:
  title: Watchdog API (preview)
  version: 1.0.0
  description: >-
    Development preview for agreements, price items, document relationships,
    canonical invoices, alerts and alert topics, claims and attached alerts,
    shared entity activity and comments, Document uploads, invoice imports,
    explicit invoice-agreement matching, and workflow runs. This contract is
    under development and is not served by api.watchdog.no. Request bodies are
    limited to 2 MiB (2,097,152 bytes), including all JSON fields and line data,
    except POST /v1/support/contact which permits 32 MiB for base64 attachments.
    File bytes are uploaded directly to storage. The existing public REST
    service retains its separate contract.
servers:
  - url: http://localhost:3500
    description: Local development Worker
security: []
paths:
  /v1/alerts/{id}:
    patch:
      tags:
        - Alerts
      summary: Edit an alert
      description: >-
        Use the same field names and nesting as GET. Send only fields to change,
        including individual fields inside expected; omitted fields are
        preserved and null clears a nullable field. Use exact decimal strings
        and rates as fractions. expected.net_price and expected.total are
        calculated and read-only. invoiced, invoice_item, provenance, and status
        are read-only. citations accepts explicit upsert/remove changes by
        source_ref; omitted citations and fields are preserved. Field edits
        update the shared citation in every linked alert/topic; citation
        selectors relink only this alert. Shared edits are blocked by protected
        claims or locked topics. Document edits are re-verified against stored
        text; verification and metadata are server-owned. Inline markers must
        resolve against the resulting collection. Saving does not start checks
        or model work.
      operationId: updateAlert
      parameters:
        - name: X-Organization-Id
          in: header
          required: false
          schema:
            type: string
          description: >-
            Required for personal API keys. Target one organization you have
            access to. Migrated keys may omit it to use their original
            organization. For Clerk sessions, it must match the active
            organization.
        - schema:
            type: string
            format: uuid
          required: true
          name: id
          in: path
        - schema:
            type: string
            minLength: 1
            maxLength: 200
            description: The exact ETag from GET /v1/alerts/{id} or the preceding edit.
          required: true
          description: The exact ETag from GET /v1/alerts/{id} or the preceding edit.
          name: if-match
          in: header
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                citations:
                  type: object
                  properties:
                    upsert:
                      type: array
                      items:
                        type: object
                        properties:
                          source_ref:
                            type: integer
                            exclusiveMinimum: 0
                            maximum: 2147483647
                          source:
                            anyOf:
                              - type: object
                                properties:
                                  source_type:
                                    type: string
                                    enum:
                                      - document
                                  document_id:
                                    type: string
                                    format: uuid
                                required:
                                  - source_type
                                  - document_id
                                additionalProperties: false
                              - type: object
                                properties:
                                  source_type:
                                    type: string
                                    enum:
                                      - web
                                  url:
                                    type: string
                                    maxLength: 20000
                                required:
                                  - source_type
                                  - url
                                additionalProperties: false
                              - type: object
                                properties:
                                  source_type:
                                    type: string
                                    enum:
                                      - agreement_items
                                  item_ids:
                                    type: array
                                    items:
                                      type: string
                                      format: uuid
                                    minItems: 1
                                    maxItems: 100
                                required:
                                  - source_type
                                  - item_ids
                                additionalProperties: false
                              - type: object
                                properties:
                                  source_type:
                                    type: string
                                    enum:
                                      - user_context
                                  text:
                                    type: string
                                    minLength: 1
                                    maxLength: 20000
                                required:
                                  - source_type
                                  - text
                                additionalProperties: false
                          quote:
                            type:
                              - string
                              - 'null'
                            maxLength: 20000
                          text:
                            type:
                              - string
                              - 'null'
                            maxLength: 20000
                          page:
                            type:
                              - string
                              - 'null'
                            maxLength: 20000
                          section_title:
                            type:
                              - string
                              - 'null'
                            maxLength: 20000
                          context_before:
                            type:
                              - string
                              - 'null'
                            maxLength: 20000
                          context_after:
                            type:
                              - string
                              - 'null'
                            maxLength: 20000
                          title:
                            type:
                              - string
                              - 'null'
                            maxLength: 20000
                          citation:
                            anyOf:
                              - type: object
                                properties:
                                  id:
                                    type: string
                                    format: uuid
                                required:
                                  - id
                                additionalProperties: false
                              - type: object
                                properties:
                                  source:
                                    anyOf:
                                      - type: object
                                        properties:
                                          source_type:
                                            type: string
                                            enum:
                                              - document
                                          document_id:
                                            type: string
                                            format: uuid
                                        required:
                                          - source_type
                                          - document_id
                                        additionalProperties: false
                                      - type: object
                                        properties:
                                          source_type:
                                            type: string
                                            enum:
                                              - web
                                          url:
                                            type: string
                                            maxLength: 20000
                                        required:
                                          - source_type
                                          - url
                                        additionalProperties: false
                                      - type: object
                                        properties:
                                          source_type:
                                            type: string
                                            enum:
                                              - agreement_items
                                          item_ids:
                                            type: array
                                            items:
                                              type: string
                                              format: uuid
                                            minItems: 1
                                            maxItems: 100
                                        required:
                                          - source_type
                                          - item_ids
                                        additionalProperties: false
                                      - type: object
                                        properties:
                                          source_type:
                                            type: string
                                            enum:
                                              - user_context
                                          text:
                                            type: string
                                            minLength: 1
                                            maxLength: 20000
                                        required:
                                          - source_type
                                          - text
                                        additionalProperties: false
                                  quote:
                                    type:
                                      - string
                                      - 'null'
                                    maxLength: 20000
                                  text:
                                    type:
                                      - string
                                      - 'null'
                                    maxLength: 20000
                                  page:
                                    type:
                                      - string
                                      - 'null'
                                    maxLength: 20000
                                  section_title:
                                    type:
                                      - string
                                      - 'null'
                                    maxLength: 20000
                                  context_before:
                                    type:
                                      - string
                                      - 'null'
                                    maxLength: 20000
                                  context_after:
                                    type:
                                      - string
                                      - 'null'
                                    maxLength: 20000
                                  title:
                                    type:
                                      - string
                                      - 'null'
                                    maxLength: 20000
                                required:
                                  - source
                                additionalProperties: false
                        required:
                          - source_ref
                        additionalProperties: false
                      maxItems: 100
                      default: []
                    remove:
                      type: array
                      items:
                        type: integer
                        exclusiveMinimum: 0
                        maximum: 2147483647
                      maxItems: 100
                      default: []
                  additionalProperties: false
                title:
                  type: string
                  minLength: 1
                  maxLength: 500
                explanation:
                  type:
                    - string
                    - 'null'
                  maxLength: 20000
                questions:
                  type: array
                  items:
                    type: string
                    maxLength: 2000
                  maxItems: 50
                expected:
                  type: object
                  properties:
                    base_price:
                      type:
                        - string
                        - 'null'
                      maxLength: 100
                      pattern: ^-?\d+(?:\.\d+)?$
                    quantity:
                      type:
                        - string
                        - 'null'
                      maxLength: 100
                      pattern: ^-?\d+(?:\.\d+)?$
                    discount:
                      type:
                        - string
                        - 'null'
                      maxLength: 100
                      pattern: ^-?\d+(?:\.\d+)?$
                    surcharge:
                      type:
                        - string
                        - 'null'
                      maxLength: 100
                      pattern: ^-?\d+(?:\.\d+)?$
                    adjustment_uplift:
                      type:
                        - string
                        - 'null'
                      maxLength: 100
                      pattern: ^-?\d+(?:\.\d+)?$
                    price_explanation:
                      type:
                        - string
                        - 'null'
                      maxLength: 20000
                    adjustment_explanation:
                      type:
                        - string
                        - 'null'
                      maxLength: 20000
                    product_code:
                      type:
                        - string
                        - 'null'
                      maxLength: 2000
                    description:
                      type:
                        - string
                        - 'null'
                      maxLength: 20000
                    unit:
                      type:
                        - string
                        - 'null'
                      maxLength: 2000
                  additionalProperties: false
              additionalProperties: false
      responses:
        '200':
          description: The alert with its current edit revision.
          headers:
            X-Request-Id:
              schema:
                type: string
              required: true
              description: >-
                Request identifier for support and diagnostics; also included in
                error bodies.
            Cache-Control:
              schema:
                type: string
                enum:
                  - private, no-store
              required: false
              description: >-
                Organization-scoped API responses must not be cached. May be
                absent for requests rejected before routing.
            X-RateLimit-Limit:
              schema:
                type: string
                example: '120'
              required: false
              description: >-
                Requests per minute for the applicable limiter, when evaluated.
                Authenticated requests use the credential limit; an IP rejection
                uses the IP limit.
            ETag:
              schema:
                type: string
                description: >-
                  Opaque revision of the stored alert. Send it unchanged in
                  If-Match when editing.
              required: true
              description: >-
                Opaque revision of the stored alert. Send it unchanged in
                If-Match when editing.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Alert'
        '400':
          description: >-
            Invalid request format, parameters, or body. Details contain up to
            20 actionable field errors; the complete encoded request body must
            be at most 2 MiB (2,097,152 bytes).
          headers:
            X-Request-Id:
              schema:
                type: string
              required: true
              description: >-
                Request identifier for support and diagnostics; also included in
                error bodies.
            Cache-Control:
              schema:
                type: string
                enum:
                  - private, no-store
              required: false
              description: >-
                Organization-scoped API responses must not be cached. May be
                absent for requests rejected before routing.
            X-RateLimit-Limit:
              schema:
                type: string
                example: '120'
              required: false
              description: >-
                Requests per minute for the applicable limiter, when evaluated.
                Authenticated requests use the credential limit; an IP rejection
                uses the IP limit.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error_validation_error'
              example:
                error:
                  code: validation_error
                  message: >-
                    Invalid request format, parameters, or body. Details contain
                    up to 20 actionable field errors; the complete encoded
                    request body must be at most 2 MiB (2,097,152 bytes).
                  request_id: req_example
        '401':
          description: Missing or invalid bearer credential.
          headers:
            X-Request-Id:
              schema:
                type: string
              required: true
              description: >-
                Request identifier for support and diagnostics; also included in
                error bodies.
            Cache-Control:
              schema:
                type: string
                enum:
                  - private, no-store
              required: false
              description: >-
                Organization-scoped API responses must not be cached. May be
                absent for requests rejected before routing.
            X-RateLimit-Limit:
              schema:
                type: string
                example: '120'
              required: false
              description: >-
                Requests per minute for the applicable limiter, when evaluated.
                Authenticated requests use the credential limit; an IP rejection
                uses the IP limit.
            WWW-Authenticate:
              schema:
                type: string
              required: false
              description: Bearer authentication challenge, when supplied.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error_invalid_token'
              example:
                error:
                  code: invalid_token
                  message: Missing or invalid bearer credential.
                  request_id: req_example
        '403':
          description: >-
            Access denied: forbidden, token_disabled, organization_required,
            insufficient_role, or mfa_required. Check the error code and
            effective permissions.
          headers:
            X-Request-Id:
              schema:
                type: string
              required: true
              description: >-
                Request identifier for support and diagnostics; also included in
                error bodies.
            Cache-Control:
              schema:
                type: string
                enum:
                  - private, no-store
              required: false
              description: >-
                Organization-scoped API responses must not be cached. May be
                absent for requests rejected before routing.
            X-RateLimit-Limit:
              schema:
                type: string
                example: '120'
              required: false
              description: >-
                Requests per minute for the applicable limiter, when evaluated.
                Authenticated requests use the credential limit; an IP rejection
                uses the IP limit.
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/Error_forbidden_token_disabled_organization_required_insufficient_role_mfa_required
              example:
                error:
                  code: forbidden
                  message: >-
                    Access denied: forbidden, token_disabled,
                    organization_required, insufficient_role, or mfa_required.
                    Check the error code and effective permissions.
                  request_id: req_example
        '404':
          description: The resource does not exist in the current organization.
          headers:
            X-Request-Id:
              schema:
                type: string
              required: true
              description: >-
                Request identifier for support and diagnostics; also included in
                error bodies.
            Cache-Control:
              schema:
                type: string
                enum:
                  - private, no-store
              required: false
              description: >-
                Organization-scoped API responses must not be cached. May be
                absent for requests rejected before routing.
            X-RateLimit-Limit:
              schema:
                type: string
                example: '120'
              required: false
              description: >-
                Requests per minute for the applicable limiter, when evaluated.
                Authenticated requests use the credential limit; an IP rejection
                uses the IP limit.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error_not_found'
              example:
                error:
                  code: not_found
                  message: The resource does not exist in the current organization.
                  request_id: req_example
        '409':
          description: >-
            The alert belongs to a completed claim, or this status transition is
            incompatible.
          headers:
            X-Request-Id:
              schema:
                type: string
              required: true
              description: >-
                Request identifier for support and diagnostics; also included in
                error bodies.
            Cache-Control:
              schema:
                type: string
                enum:
                  - private, no-store
              required: false
              description: >-
                Organization-scoped API responses must not be cached. May be
                absent for requests rejected before routing.
            X-RateLimit-Limit:
              schema:
                type: string
                example: '120'
              required: false
              description: >-
                Requests per minute for the applicable limiter, when evaluated.
                Authenticated requests use the credential limit; an IP rejection
                uses the IP limit.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error_conflict'
              example:
                error:
                  code: conflict
                  message: >-
                    The alert belongs to a completed claim, or this status
                    transition is incompatible.
                  request_id: req_example
        '412':
          description: >-
            The alert changed since the supplied ETag was read. Retrieve it
            again before editing.
          headers:
            X-Request-Id:
              schema:
                type: string
              required: true
              description: >-
                Request identifier for support and diagnostics; also included in
                error bodies.
            Cache-Control:
              schema:
                type: string
                enum:
                  - private, no-store
              required: false
              description: >-
                Organization-scoped API responses must not be cached. May be
                absent for requests rejected before routing.
            X-RateLimit-Limit:
              schema:
                type: string
                example: '120'
              required: false
              description: >-
                Requests per minute for the applicable limiter, when evaluated.
                Authenticated requests use the credential limit; an IP rejection
                uses the IP limit.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error_precondition_failed'
              example:
                error:
                  code: precondition_failed
                  message: >-
                    The alert changed since the supplied ETag was read. Retrieve
                    it again before editing.
                  request_id: req_example
        '429':
          description: The IP or authenticated credential exceeded its request limit.
          headers:
            X-Request-Id:
              schema:
                type: string
              required: true
              description: >-
                Request identifier for support and diagnostics; also included in
                error bodies.
            Cache-Control:
              schema:
                type: string
                enum:
                  - private, no-store
              required: false
              description: >-
                Organization-scoped API responses must not be cached. May be
                absent for requests rejected before routing.
            X-RateLimit-Limit:
              schema:
                type: string
                example: '120'
              required: false
              description: >-
                Requests per minute for the applicable limiter, when evaluated.
                Authenticated requests use the credential limit; an IP rejection
                uses the IP limit.
            Retry-After:
              schema:
                type: string
                example: '60'
              required: true
              description: Seconds to wait before retrying the request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error_rate_limit_exceeded'
              example:
                error:
                  code: rate_limit_exceeded
                  message: >-
                    The IP or authenticated credential exceeded its request
                    limit.
                  request_id: req_example
        '500':
          description: >-
            Unexpected server failure. Include the request ID when contacting
            support.
          headers:
            X-Request-Id:
              schema:
                type: string
              required: true
              description: >-
                Request identifier for support and diagnostics; also included in
                error bodies.
            Cache-Control:
              schema:
                type: string
                enum:
                  - private, no-store
              required: false
              description: >-
                Organization-scoped API responses must not be cached. May be
                absent for requests rejected before routing.
            X-RateLimit-Limit:
              schema:
                type: string
                example: '120'
              required: false
              description: >-
                Requests per minute for the applicable limiter, when evaluated.
                Authenticated requests use the credential limit; an IP rejection
                uses the IP limit.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error_internal_error'
              example:
                error:
                  code: internal_error
                  message: >-
                    Unexpected server failure. Include the request ID when
                    contacting support.
                  request_id: req_example
        '503':
          description: >-
            Authentication infrastructure is unavailable or rate limited. Honor
            Retry-After when provided.
          headers:
            X-Request-Id:
              schema:
                type: string
              required: true
              description: >-
                Request identifier for support and diagnostics; also included in
                error bodies.
            Cache-Control:
              schema:
                type: string
                enum:
                  - private, no-store
              required: false
              description: >-
                Organization-scoped API responses must not be cached. May be
                absent for requests rejected before routing.
            X-RateLimit-Limit:
              schema:
                type: string
                example: '120'
              required: false
              description: >-
                Requests per minute for the applicable limiter, when evaluated.
                Authenticated requests use the credential limit; an IP rejection
                uses the IP limit.
            Retry-After:
              schema:
                type: string
                example: '60'
              required: true
              description: Seconds to wait before retrying the request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error_service_unavailable'
              example:
                error:
                  code: service_unavailable
                  message: >-
                    Authentication infrastructure is unavailable or rate
                    limited. Honor Retry-After when provided.
                  request_id: req_example
      security:
        - ApiKeyBearer: []
        - ClerkSessionBearer: []
components:
  schemas:
    Alert:
      allOf:
        - $ref: '#/components/schemas/AlertSummary'
        - type: object
          properties:
            questions:
              type: array
              items:
                type: string
            price_item_ids:
              type: array
              items:
                type: string
                format: uuid
              description: >-
                Agreement price items the finding relies on. Read them with GET
                /v1/agreements/{id}/price-items?ids=.
            expected:
              type: object
              properties:
                base_price:
                  type:
                    - string
                    - 'null'
                  pattern: ^-?\d+(?:\.\d+)?$
                quantity:
                  type:
                    - string
                    - 'null'
                  pattern: ^-?\d+(?:\.\d+)?$
                discount:
                  type:
                    - string
                    - 'null'
                  pattern: ^-?\d+(?:\.\d+)?$
                surcharge:
                  type:
                    - string
                    - 'null'
                  pattern: ^-?\d+(?:\.\d+)?$
                adjustment_uplift:
                  type:
                    - string
                    - 'null'
                  pattern: ^-?\d+(?:\.\d+)?$
                net_price:
                  type:
                    - string
                    - 'null'
                  pattern: ^-?\d+(?:\.\d+)?$
                  readOnly: true
                  description: Calculated from expected pricing inputs.
                total:
                  type:
                    - string
                    - 'null'
                  pattern: ^-?\d+(?:\.\d+)?$
                  readOnly: true
                  description: Calculated from expected net price and quantity.
                price_explanation:
                  type:
                    - string
                    - 'null'
                adjustment_explanation:
                  type:
                    - string
                    - 'null'
                product_code:
                  type:
                    - string
                    - 'null'
                description:
                  type:
                    - string
                    - 'null'
                unit:
                  type:
                    - string
                    - 'null'
              required:
                - base_price
                - quantity
                - discount
                - surcharge
                - adjustment_uplift
                - net_price
                - total
                - price_explanation
                - adjustment_explanation
                - product_code
                - description
                - unit
            invoiced:
              type: object
              properties:
                base_price:
                  type:
                    - string
                    - 'null'
                  pattern: ^-?\d+(?:\.\d+)?$
                net_price:
                  type:
                    - string
                    - 'null'
                  pattern: ^-?\d+(?:\.\d+)?$
                quantity:
                  type:
                    - string
                    - 'null'
                  pattern: ^-?\d+(?:\.\d+)?$
                discount:
                  type:
                    - string
                    - 'null'
                  pattern: ^-?\d+(?:\.\d+)?$
                surcharge:
                  type:
                    - string
                    - 'null'
                  pattern: ^-?\d+(?:\.\d+)?$
                total:
                  type:
                    - string
                    - 'null'
                  pattern: ^-?\d+(?:\.\d+)?$
              required:
                - base_price
                - net_price
                - quantity
                - discount
                - surcharge
                - total
              readOnly: true
              description: Pricing values captured when the alert was created.
            evidence:
              type: object
              properties:
                citations:
                  type: array
                  items:
                    anyOf:
                      - type: object
                        properties:
                          source_ref:
                            type: integer
                            exclusiveMinimum: 0
                          citation_id:
                            type:
                              - string
                              - 'null'
                            format: uuid
                          title:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                          quote:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                          text:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                          verification:
                            type:
                              - string
                              - 'null'
                            enum:
                              - verified
                              - corrected
                              - recovered
                              - unverified
                              - null
                          verification_score:
                            type:
                              - number
                              - 'null'
                          available:
                            type: boolean
                            enum:
                              - true
                          source_type:
                            type: string
                            enum:
                              - document
                          document_id:
                            type: string
                            format: uuid
                          document_name:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                          page:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                          section_title:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                          context_before:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                          context_after:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                          original_quote:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                        required:
                          - source_ref
                          - citation_id
                          - title
                          - quote
                          - text
                          - verification
                          - verification_score
                          - available
                          - source_type
                          - document_id
                          - document_name
                          - page
                          - section_title
                          - context_before
                          - context_after
                          - original_quote
                      - type: object
                        properties:
                          source_ref:
                            type: integer
                            exclusiveMinimum: 0
                          citation_id:
                            type:
                              - string
                              - 'null'
                            format: uuid
                          title:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                          quote:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                          text:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                          verification:
                            type:
                              - string
                              - 'null'
                            enum:
                              - verified
                              - corrected
                              - recovered
                              - unverified
                              - null
                          verification_score:
                            type:
                              - number
                              - 'null'
                          available:
                            type: boolean
                            enum:
                              - true
                          source_type:
                            type: string
                            enum:
                              - web
                          url:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                          cited_at:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                        required:
                          - source_ref
                          - citation_id
                          - title
                          - quote
                          - text
                          - verification
                          - verification_score
                          - available
                          - source_type
                          - url
                          - cited_at
                      - type: object
                        properties:
                          source_ref:
                            type: integer
                            exclusiveMinimum: 0
                          citation_id:
                            type:
                              - string
                              - 'null'
                            format: uuid
                          title:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                          quote:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                          text:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                          verification:
                            type:
                              - string
                              - 'null'
                            enum:
                              - verified
                              - corrected
                              - recovered
                              - unverified
                              - null
                          verification_score:
                            type:
                              - number
                              - 'null'
                          available:
                            type: boolean
                            enum:
                              - true
                          source_type:
                            type: string
                            enum:
                              - agreement_items
                          item_ids:
                            type: array
                            items:
                              type: string
                              format: uuid
                          agreement_item_refs:
                            type: array
                            items:
                              type: string
                              maxLength: 10000
                        required:
                          - source_ref
                          - citation_id
                          - title
                          - quote
                          - text
                          - verification
                          - verification_score
                          - available
                          - source_type
                          - item_ids
                          - agreement_item_refs
                      - type: object
                        properties:
                          source_ref:
                            type: integer
                            exclusiveMinimum: 0
                          citation_id:
                            type:
                              - string
                              - 'null'
                            format: uuid
                          title:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                          quote:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                          text:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                          verification:
                            type:
                              - string
                              - 'null'
                            enum:
                              - verified
                              - corrected
                              - recovered
                              - unverified
                              - null
                          verification_score:
                            type:
                              - number
                              - 'null'
                          available:
                            type: boolean
                            enum:
                              - true
                          source_type:
                            type: string
                            enum:
                              - user_context
                        required:
                          - source_ref
                          - citation_id
                          - title
                          - quote
                          - text
                          - verification
                          - verification_score
                          - available
                          - source_type
                      - type: object
                        properties:
                          source_ref:
                            type:
                              - integer
                              - 'null'
                            exclusiveMinimum: 0
                          citation_id:
                            type:
                              - string
                              - 'null'
                            format: uuid
                          title:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                          quote:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                          text:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                          verification:
                            type:
                              - string
                              - 'null'
                            enum:
                              - verified
                              - corrected
                              - recovered
                              - unverified
                              - null
                          verification_score:
                            type:
                              - number
                              - 'null'
                          source_type:
                            type:
                              - string
                              - 'null'
                          page:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                          section_title:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                          context_before:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                          context_after:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                          original_quote:
                            type:
                              - string
                              - 'null'
                            maxLength: 10000
                          available:
                            type: boolean
                            enum:
                              - false
                          reason:
                            type: string
                            enum:
                              - source_unavailable
                        required:
                          - source_ref
                          - citation_id
                          - title
                          - quote
                          - text
                          - verification
                          - verification_score
                          - source_type
                          - page
                          - section_title
                          - context_before
                          - context_after
                          - original_quote
                          - available
                          - reason
                truncated:
                  type: boolean
                  description: >-
                    Excerpts are cut at 10,000 characters. Stored evidence is
                    unchanged.
              required:
                - citations
                - truncated
          required:
            - questions
            - price_item_ids
            - expected
            - invoiced
            - evidence
    Error_validation_error:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - validation_error
            message:
              type: string
            request_id:
              type: string
            description:
              type: string
            details:
              type: array
              items:
                type: object
                properties:
                  code:
                    type: string
                  field:
                    type: string
                  message:
                    type: string
                required:
                  - code
                  - field
                  - message
              maxItems: 20
            workflow_run_id:
              type: string
              format: uuid
            import_id:
              type: string
              format: uuid
            existing_party:
              type: object
              properties:
                type:
                  type: string
                  enum:
                    - supplier
                    - recipient
                id:
                  type: string
                  format: uuid
              required:
                - type
                - id
          required:
            - code
            - message
            - request_id
      required:
        - error
    Error_invalid_token:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - invalid_token
            message:
              type: string
            request_id:
              type: string
            description:
              type: string
            details:
              type: array
              items:
                type: object
                properties:
                  code:
                    type: string
                  field:
                    type: string
                  message:
                    type: string
                required:
                  - code
                  - field
                  - message
              maxItems: 20
            workflow_run_id:
              type: string
              format: uuid
            import_id:
              type: string
              format: uuid
            existing_party:
              type: object
              properties:
                type:
                  type: string
                  enum:
                    - supplier
                    - recipient
                id:
                  type: string
                  format: uuid
              required:
                - type
                - id
          required:
            - code
            - message
            - request_id
      required:
        - error
    Error_forbidden_token_disabled_organization_required_insufficient_role_mfa_required:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - forbidden
                - token_disabled
                - organization_required
                - insufficient_role
                - mfa_required
            message:
              type: string
            request_id:
              type: string
            description:
              type: string
            details:
              type: array
              items:
                type: object
                properties:
                  code:
                    type: string
                  field:
                    type: string
                  message:
                    type: string
                required:
                  - code
                  - field
                  - message
              maxItems: 20
            workflow_run_id:
              type: string
              format: uuid
            import_id:
              type: string
              format: uuid
            existing_party:
              type: object
              properties:
                type:
                  type: string
                  enum:
                    - supplier
                    - recipient
                id:
                  type: string
                  format: uuid
              required:
                - type
                - id
          required:
            - code
            - message
            - request_id
      required:
        - error
    Error_not_found:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - not_found
            message:
              type: string
            request_id:
              type: string
            description:
              type: string
            details:
              type: array
              items:
                type: object
                properties:
                  code:
                    type: string
                  field:
                    type: string
                  message:
                    type: string
                required:
                  - code
                  - field
                  - message
              maxItems: 20
            workflow_run_id:
              type: string
              format: uuid
            import_id:
              type: string
              format: uuid
            existing_party:
              type: object
              properties:
                type:
                  type: string
                  enum:
                    - supplier
                    - recipient
                id:
                  type: string
                  format: uuid
              required:
                - type
                - id
          required:
            - code
            - message
            - request_id
      required:
        - error
    Error_conflict:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - conflict
            message:
              type: string
            request_id:
              type: string
            description:
              type: string
            details:
              type: array
              items:
                type: object
                properties:
                  code:
                    type: string
                  field:
                    type: string
                  message:
                    type: string
                required:
                  - code
                  - field
                  - message
              maxItems: 20
            workflow_run_id:
              type: string
              format: uuid
            import_id:
              type: string
              format: uuid
            existing_party:
              type: object
              properties:
                type:
                  type: string
                  enum:
                    - supplier
                    - recipient
                id:
                  type: string
                  format: uuid
              required:
                - type
                - id
          required:
            - code
            - message
            - request_id
      required:
        - error
    Error_precondition_failed:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - precondition_failed
            message:
              type: string
            request_id:
              type: string
            description:
              type: string
            details:
              type: array
              items:
                type: object
                properties:
                  code:
                    type: string
                  field:
                    type: string
                  message:
                    type: string
                required:
                  - code
                  - field
                  - message
              maxItems: 20
            workflow_run_id:
              type: string
              format: uuid
            import_id:
              type: string
              format: uuid
            existing_party:
              type: object
              properties:
                type:
                  type: string
                  enum:
                    - supplier
                    - recipient
                id:
                  type: string
                  format: uuid
              required:
                - type
                - id
          required:
            - code
            - message
            - request_id
      required:
        - error
    Error_rate_limit_exceeded:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - rate_limit_exceeded
            message:
              type: string
            request_id:
              type: string
            description:
              type: string
            details:
              type: array
              items:
                type: object
                properties:
                  code:
                    type: string
                  field:
                    type: string
                  message:
                    type: string
                required:
                  - code
                  - field
                  - message
              maxItems: 20
            workflow_run_id:
              type: string
              format: uuid
            import_id:
              type: string
              format: uuid
            existing_party:
              type: object
              properties:
                type:
                  type: string
                  enum:
                    - supplier
                    - recipient
                id:
                  type: string
                  format: uuid
              required:
                - type
                - id
          required:
            - code
            - message
            - request_id
      required:
        - error
    Error_internal_error:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - internal_error
            message:
              type: string
            request_id:
              type: string
            description:
              type: string
            details:
              type: array
              items:
                type: object
                properties:
                  code:
                    type: string
                  field:
                    type: string
                  message:
                    type: string
                required:
                  - code
                  - field
                  - message
              maxItems: 20
            workflow_run_id:
              type: string
              format: uuid
            import_id:
              type: string
              format: uuid
            existing_party:
              type: object
              properties:
                type:
                  type: string
                  enum:
                    - supplier
                    - recipient
                id:
                  type: string
                  format: uuid
              required:
                - type
                - id
          required:
            - code
            - message
            - request_id
      required:
        - error
    Error_service_unavailable:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - service_unavailable
            message:
              type: string
            request_id:
              type: string
            description:
              type: string
            details:
              type: array
              items:
                type: object
                properties:
                  code:
                    type: string
                  field:
                    type: string
                  message:
                    type: string
                required:
                  - code
                  - field
                  - message
              maxItems: 20
            workflow_run_id:
              type: string
              format: uuid
            import_id:
              type: string
              format: uuid
            existing_party:
              type: object
              properties:
                type:
                  type: string
                  enum:
                    - supplier
                    - recipient
                id:
                  type: string
                  format: uuid
              required:
                - type
                - id
          required:
            - code
            - message
            - request_id
      required:
        - error
    AlertSummary:
      type: object
      properties:
        id:
          type: string
          format: uuid
        title:
          type:
            - string
            - 'null'
        explanation:
          type:
            - string
            - 'null'
        status:
          type: string
          enum:
            - pending
            - claimed
            - dismissed
            - credited
        correction_type:
          type: string
          enum:
            - modify_item
            - modify_invoice
            - add_item
        confidence:
          type: object
          properties:
            level:
              type:
                - string
                - 'null'
              enum:
                - high
                - mid
                - low
                - null
            reason:
              type:
                - string
                - 'null'
          required:
            - level
            - reason
        impact_amount:
          type:
            - string
            - 'null'
          pattern: ^-?\d+(?:\.\d+)?$
        currency_code:
          type: string
        organization_currency:
          type: object
          properties:
            currency_code:
              type: string
              description: The organization's reporting currency from its settings.
            impact_amount:
              type:
                - string
                - 'null'
              pattern: ^-?\d+(?:\.\d+)?$
          required:
            - currency_code
            - impact_amount
          description: The impact converted with the rate stored on the alert.
        freshness:
          type: string
          enum:
            - current
            - outdated
            - unknown
        invoice:
          type:
            - object
            - 'null'
          properties:
            id:
              type: string
              format: uuid
            invoice_number:
              type:
                - string
                - 'null'
            title:
              type:
                - string
                - 'null'
              description: The invoice's own title; its number is invoice_number.
            category:
              type: string
              enum:
                - invoice
                - credit_note
                - self_billed_invoice
            issued_date:
              type:
                - string
                - 'null'
              format: date
            due_date:
              type:
                - string
                - 'null'
              format: date
            currency_code:
              type:
                - string
                - 'null'
            total_amount_including_vat:
              type:
                - string
                - 'null'
              pattern: ^-?\d+(?:\.\d+)?$
          required:
            - id
            - invoice_number
            - title
            - category
            - issued_date
            - due_date
            - currency_code
            - total_amount_including_vat
        invoice_item:
          type:
            - object
            - 'null'
          properties:
            id:
              type: string
              format: uuid
            line_number:
              type: integer
            product_code:
              type:
                - string
                - 'null'
            description:
              type:
                - string
                - 'null'
            unit:
              type:
                - string
                - 'null'
          required:
            - id
            - line_number
            - product_code
            - description
            - unit
          readOnly: true
          description: >-
            Current linked invoice line details, not a snapshot at alert
            creation. Null when no accessible line is linked.
        agreement:
          type:
            - object
            - 'null'
          properties:
            id:
              type: string
              format: uuid
            title:
              type:
                - string
                - 'null'
            status:
              type: string
              enum:
                - draft
                - active
                - archived
            version:
              type: integer
              description: The current agreement version.
          required:
            - id
            - title
            - status
            - version
        supplier:
          type:
            - object
            - 'null'
          properties:
            id:
              type: string
              format: uuid
            title:
              type:
                - string
                - 'null'
          required:
            - id
            - title
        recipient:
          type:
            - object
            - 'null'
          properties:
            id:
              type: string
              format: uuid
            title:
              type:
                - string
                - 'null'
          required:
            - id
            - title
        topic:
          type:
            - object
            - 'null'
          properties:
            id:
              type: string
              format: uuid
            title:
              type:
                - string
                - 'null'
            is_locked:
              type: boolean
          required:
            - id
            - title
            - is_locked
        claim:
          type:
            - object
            - 'null'
          properties:
            id:
              type: string
              format: uuid
            title:
              type:
                - string
                - 'null'
            status:
              type: string
              enum:
                - pending
                - in_progress
                - completed
                - cancelled
          required:
            - id
            - title
            - status
          description: The claim this alert is currently attached to, if any.
        provenance:
          type: object
          properties:
            agreement_version:
              type:
                - integer
                - 'null'
              description: The agreement version assessed; compare with agreement.version.
            invoice_fingerprint:
              type:
                - string
                - 'null'
            retained_check:
              type:
                - object
                - 'null'
              properties:
                id:
                  type: string
                  format: uuid
              required:
                - id
              description: >-
                The immutable ComplianceCheck that produced this alert. Null for
                alerts created before retained checks existed; history is never
                reconstructed.
          required:
            - agreement_version
            - invoice_fingerprint
            - retained_check
        correction_relationships:
          type: array
          items:
            type: object
            properties:
              replacement_alert_id:
                type: string
                format: uuid
              replaced_alert_id:
                type: string
                format: uuid
            required:
              - replacement_alert_id
              - replaced_alert_id
          maxItems: 100
          description: >-
            Links between an added-item alert and the line alerts it replaces.
            Alerts connected by these links form one replacement set.
        correction_relationships_truncated:
          type: boolean
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
      required:
        - id
        - title
        - explanation
        - status
        - correction_type
        - confidence
        - impact_amount
        - currency_code
        - organization_currency
        - freshness
        - invoice
        - invoice_item
        - agreement
        - supplier
        - recipient
        - topic
        - claim
        - provenance
        - correction_relationships
        - correction_relationships_truncated
        - created_at
        - updated_at
  securitySchemes:
    ApiKeyBearer:
      type: http
      scheme: bearer
      description: >-
        Personal API key. Send X-Organization-Id. The required cumulative level
        is listed in x-watchdog-permission.
    ClerkSessionBearer:
      type: http
      scheme: bearer
      description: Clerk session with an active organization.

````