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

# Update expense report for organization

> Updates an expense report. When the `action` query parameter is provided, performs the specified action instead of a field update. Otherwise, updates the allowed fields (`name`, `comment`, `customFields`, `expenseRecords`); any other fields in the request body are silently ignored.
`moveToNextStep` moves a report that is in `TRANSFER` or `TRANSFER_TO_RECIPIENT` to the next step of its send chain: to the next recipient, or to `SENT` when the chain is complete. `forwardToApprovalOrBooking` forwards a report that is `ON_HOLD` back into the approval or booking flow. Both are support tools and are restricted to the developer role. The report must belong to the organization in the path; a report of another organization is answered with 404 EXPENSE_REPORT_NOT_FOUND even when the caller administers that organization.
`sendReminder` reminds the owner of the report about it, and takes `{ "message": "..." }` as its body. Only reports that carry an invoice reference can be reminded, and only organization administrators and standard API keys may use it.




## OpenAPI

````yaml /openapi/findity-admin-api.json put /organizations/{organizationId}/reports/{reportId}
openapi: 3.1.0
info:
  title: Findity Admin API
  description: Findity Admin API
  version: 1.0.0
servers:
  - url: https://stage-api.findity.com/api/v1/admin
  - url: https://api.findity.com/api/v1/admin
security:
  - bearerAuth: []
paths:
  /organizations/{organizationId}/reports/{reportId}:
    put:
      tags:
        - Expense Reports
      summary: Update expense report for organization
      description: >
        Updates an expense report. When the `action` query parameter is
        provided, performs the specified action instead of a field update.
        Otherwise, updates the allowed fields (`name`, `comment`,
        `customFields`, `expenseRecords`); any other fields in the request body
        are silently ignored.

        `moveToNextStep` moves a report that is in `TRANSFER` or
        `TRANSFER_TO_RECIPIENT` to the next step of its send chain: to the next
        recipient, or to `SENT` when the chain is complete.
        `forwardToApprovalOrBooking` forwards a report that is `ON_HOLD` back
        into the approval or booking flow. Both are support tools and are
        restricted to the developer role. The report must belong to the
        organization in the path; a report of another organization is answered
        with 404 EXPENSE_REPORT_NOT_FOUND even when the caller administers that
        organization.

        `sendReminder` reminds the owner of the report about it, and takes `{
        "message": "..." }` as its body. Only reports that carry an invoice
        reference can be reminded, and only organization administrators and
        standard API keys may use it.
      operationId: updateOrganizationExpenseReport
      parameters:
        - name: organizationId
          in: path
          required: true
          description: >-
            The unique identifier of the organization. String, UUID format
            (32-character hexadecimal). Required.
          schema:
            $ref: '#/components/schemas/Uuid'
            example: 05b8daba9ba14a49846fe77883248cf0
        - $ref: '#/components/parameters/expenseReportId'
        - $ref: '#/components/parameters/action'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              anyOf:
                - $ref: '#/components/schemas/UpdateExpenseReport'
                - $ref: '#/components/schemas/SendReminder'
                - $ref: '#/components/schemas/DeleteExternalVoucherInfo'
            examples:
              fieldUpdate:
                summary: Body for a field update
                value:
                  name: Business Trip Stockholm
                  comment: Updated comment for the expense report
                  expenseRecords:
                    - id: a73efe636a4d47359f3c28c3024b6d23
                  customFields:
                    - fieldDefinitionId: 2b965c866b634698811dabf45a491089
                      value: true
              sendReminder:
                summary: Body for action=sendReminder
                value:
                  message: Please have a look at this report
              setStatus:
                summary: Body for action=setStatus
                value:
                  status: SENT
                  bookingDate: 2026-08-05T00:00:00+0200
                  voucherNumber: V-2026-0042
              setStatusReturnToUser:
                summary: Body for action=setStatus that returns the report to its owner
                value:
                  status: NORMAL
                  messageText: Please add the missing receipt and send the report again
              deleteExternalVoucherInfo:
                summary: Body for action=deleteExternalVoucherInfo
                value:
                  recipientId: 3f2b1a0c9d8e7f6a5b4c3d2e1f0a9b8c
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExpenseReport'
              example:
                id: 550e8400-e29b-41d4-a716-446655440000
                name: Business Trip Stockholm
                personId: 123e4567-e89b-12d3-a456-426614174000
                organizationId: 550e8400-e29b-41d4-a716-446655440001
                dateCreated: '2024-01-15T09:30:00Z'
                lastUpdated: '2024-01-16T14:45:00Z'
                reportNumber: ER-2024-001
                comment: Business trip to Stockholm for client meeting
                emailRecipients: manager@company.com;finance@company.com
                status: APPROVED
                processStatus: PROCESSED
                type: MANUAL
                reimbursement: 2580.5
                reimbursementCurrency: SEK
                sent: '2024-01-16T10:00:00Z'
                paid: '2024-01-18T00:00:00Z'
                approved: '2024-01-17T15:30:00Z'
                previewUrl: >-
                  https://expense.findity.com/api/expensereports/550e8400-e29b-41d4-a716-446655440000
                meta:
                  autoApproval:
                    status: REJECTED
                    reasons:
                      - reason: POLICY_FAILURE
                        description: Violates the company's expense policy.
                      - reason: WEEKEND_PURCHASE_DATE
                        description: The purchase was made during a weekend.
                expenseRecords:
                  - id: rec1-550e8400-e29b-41d4-a716-446655440000
                    status: APPROVED
                    personId: 123e4567-e89b-12d3-a456-426614174000
                    organizationId: 550e8400-e29b-41d4-a716-446655440001
                    categoryId: cat1-550e8400-e29b-41d4-a716-446655440000
                    expenseReportId: 550e8400-e29b-41d4-a716-446655440000
                    dateCreated: '2024-01-15T09:30:00Z'
                    lastUpdated: '2024-01-16T14:45:00Z'
                    reimbursement: 1250
                    reimbursementCurrency: SEK
                    rejectComment: null
                    meta:
                      categoryIconUrl: >-
                        https://expense.findity.com/api/resources/8a5f867e9b204742a8cc2ca2b6c57358
                  - id: rec2-550e8400-e29b-41d4-a716-446655440000
                    status: APPROVED
                    personId: 123e4567-e89b-12d3-a456-426614174000
                    organizationId: 550e8400-e29b-41d4-a716-446655440001
                    categoryId: cat2-550e8400-e29b-41d4-a716-446655440000
                    expenseReportId: 550e8400-e29b-41d4-a716-446655440000
                    dateCreated: '2024-01-15T18:45:00Z'
                    lastUpdated: '2024-01-16T14:45:00Z'
                    reimbursement: 1330.5
                    reimbursementCurrency: SEK
                    rejectComment: null
                    meta:
                      categoryIconUrl: >-
                        https://expense.findity.com/api/resources/9b6f977f8c305753b9dd3db3c7d68469
                ownerName: John Doe
                firstName: John
                lastName: Doe
                organizationName: Acme Corporation
                organizationNumber: 556123-4567
                organizationLanguage: en
                organizationUseNewDimensions: true
                organizationRequiresAttestation: false
                organizationUsesPaymentBasis: true
                expenseRecordCount: 2
                totalAmount: 2580.5
                userCanModifyReports: true
                userCanSendReports: true
                reportGroup: 1
                onHoldStatus:
                  onHold: false
                  reason: null
                bank: SEB1234567890
                dueDate: '2024-01-25T00:00:00Z'
                cardNumber: '**** **** **** 1234'
                invoiceRef: INV-2024-001
                invoiceNumber: INV-2024-001
                invoiceDate: '2024-01-15T00:00:00Z'
                externalVoucherNumber: EXT-12345
                externalVoucherInformation: Successfully exported to external system
                externalVoucherErrorInformation: null
                externalVoucherId: ext-voucher-550e8400-e29b-41d4-a716-446655440000
                reminderSentToUser: false
                employeeId: EMP001
                validationErrors:
                  - errorMessage: 'Required field: Description'
                    errorCode: REQUIRED_FIELD
                    checkType: BLOCKER
                    property: description
                    expenseRecordId: 550e8400-e29b-41d4-a716-446655440001
                reminderSentToApprover: false
                approverReminded: false
                hasExpenseViolations: false
                message:
                  text: Please attach the receipt for the hotel expense
                  isAdminView: true
                hasRejectedExpenseRecords: false
                hasIncorrectApprovalChains: false
                approvalAllowed: true
                currentApproverInfo:
                  approverId: 456e7890-e89b-12d3-a456-426614174999
                  approverName: Jane Smith
                  approverEmail: jane.smith@company.com
                sendChain:
                  currentStep: 2
                  totalSteps: 3
                  nextApprover:
                    approverId: 789e0123-e89b-12d3-a456-426614174888
                    approverName: Bob Johnson
                    approverEmail: bob.johnson@company.com
                tag:
                  simulatedCardReport: false
                  integrationTest: false
                  dimensions:
                    project: PROJ-001
                    department: Sales
                customFields:
                  - fieldDefinitionId: 2b965c866b634698811dabf45a491089
                    value: true
        '204':
          description: >
            The report was deleted. Only `action=delete` answers with this
            status; a deleted report is no longer returned by the read
            endpoints, so there is nothing to render back.
        '400':
          description: Invalid action or missing parameter
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/400Error'
              examples:
                invalidAction:
                  value:
                    result: error
                    code: INVALID_ACTION
                    description: >-
                      Invalid action provided. Accepted values: reviewOk,
                      clearTransactions
                notOnHold:
                  summary: forwardToApprovalOrBooking on a report that is not on hold
                  value:
                    result: error
                    code: EXPENSE_REPORT_NOT_IN_STATUS_ON_HOLD
                    description: Expense report is not in status on hold, was NORMAL
                noInvoiceReference:
                  summary: sendReminder on a report without an invoice reference
                  value:
                    result: error
                    code: INVALID_PARAMETER
                    description: >-
                      Expense report 05b8daba9ba14a49846fe77883248cf0 has no
                      invoice reference and can not be reminded
                invalidStatus:
                  summary: setStatus was given a status this action does not handle
                  value:
                    result: error
                    code: INVALID_PARAMETER
                    description: >-
                      Invalid status specified, was 'DELETED'. Allowed statuses
                      are NEW, NORMAL, READY_TO_SEND, SENT, PAID
                missingStatus:
                  summary: setStatus without a status in the body
                  value:
                    result: error
                    code: MISSING_PARAMETER
                    description: status is required for action 'setStatus'
                unknownRecipient:
                  summary: >-
                    deleteExternalVoucherInfo with a recipient of another
                    organization
                  value:
                    result: error
                    code: INVALID_PARAMETER
                    description: >-
                      Recipient 3f2b1a0c9d8e7f6a5b4c3d2e1f0a9b8c does not belong
                      to organization 05b8daba9ba14a49846fe77883248cf0
        '403':
          description: >
            Forbidden — the expense report was not found, the user does not have
            access to it, or the caller lacks what the requested action needs.
            `simulateBilling` and `sendReminder` each require their own
            permission, `moveToNextStep` and `forwardToApprovalOrBooking`
            require the developer role, the other actions — including `delete` —
            only need access to the report.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/403Error'
              examples:
                noAccess:
                  summary: The caller may not edit this expense report
                  value:
                    result: error
                    description: Not allowed
                missingActionPermission:
                  summary: >
                    The caller may not use the requested action - a missing
                    permission for simulateBilling or sendReminder, or a missing
                    developer role for moveToNextStep and
                    forwardToApprovalOrBooking
                  value:
                    result: error
                    description: Insufficient rights
        '404':
          description: >
            Not found — the expense report does not exist, or it belongs to
            another organization than the one in the path.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/404Error-2'
              example:
                result: error
                code: EXPENSE_REPORT_NOT_FOUND
                description: Expense report not found
components:
  schemas:
    Uuid:
      type: string
      pattern: ^[0-9a-fA-F]{32}$
      description: UUID without dashes (32-character hex string)
    UpdateExpenseReport:
      type: object
      description: >-
        Fields that can be updated on an expense report. Any other fields in the
        request body are silently ignored.
      required: []
      properties:
        name:
          type: string
          description: >-
            The display name of the expense report. String, maximum 255
            characters.
        comment:
          type: string
          description: >-
            Comment on the expense report. String, unlimited characters. When
            action=approve or action=reject is used, this is instead stored as
            the comment on the approval decision.
        customFields:
          description: >-
            Array of custom field values to set on the expense report. Each item
            must include a `fieldDefinitionId` and a `value`. Array of custom
            field objects.
          allOf:
            - $ref: '#/components/schemas/ArrayOfCustomFields'
        expenseRecords:
          type: array
          description: >-
            Array of bare expense record objects to include in this report.
            Exclude a record to to delete it from a report.
          items:
            $ref: '#/components/schemas/IdObject'
            description: A bare expense record object with only id.
        status:
          type: string
          description: >
            Target lifecycle status of the report, case insensitive. String.
            Required when action=setStatus, ignored otherwise. Accepted values
            are NEW, NORMAL, READY_TO_SEND, SENT and PAID; any other value,
            known lifecycle status or not, is rejected with 400
            INVALID_PARAMETER, since the remaining statuses are reached through
            their own processing. The transition itself is not validated - the
            report is moved to the given status whatever its current one is, so
            the caller decides what makes sense.
        voucherNumber:
          type: string
          description: >
            External voucher number to store on the report and its expense
            records. String, unlimited characters. Optional, only used with
            action=setStatus.
        errorText:
          type: string
          description: >
            Error information to store on the report; the previous error status
            is cleared first. String, unlimited characters. Optional, only used
            with action=setStatus.
        bookingDate:
          type: string
          format: date-time
          description: >
            Accounting booking date of the report, the date the report is booked
            on. Stored on the report itself and used when reports are exported
            and sorted by booking date. String, date-time format. Optional, only
            used with action=setStatus for the SENT and PAID statuses. When
            omitted it defaults to the current time: always on a move to SENT,
            and on a move to PAID only when the report has no booking date yet.
        sentToBookingDate:
          type: string
          format: date-time
          description: >
            Date the report was handed over to booking. Stored separately from
            `bookingDate` and passed on to the integration in the send chain
            payload. String, date-time format. Optional, only used with
            action=setStatus for the SENT and PAID statuses, and defaults the
            same way as `bookingDate`.
        paidDate:
          type: string
          format: date-time
          description: >
            Paid date to store on the report. String, date-time format.
            Optional, only used with action=setStatus for the PAID status;
            defaults to the current time when the status changes.
        messageText:
          type: string
          description: >
            Message sent to the report owner when the report is returned to the
            user. String, unlimited characters. Optional, only used with
            action=setStatus. Supplying it is enough to treat the change as a
            return to the owner when the target status is NEW or NORMAL,
            `returnToUser` does not have to be set as well.
        returnToUser:
          type: boolean
          description: >
            Marks the status change as a return to the report owner. Boolean.
            Optional, only used with action=setStatus. Set it to notify the
            owner for any target status, or when moving to NEW or NORMAL without
            a `messageText`. It is redundant when `messageText` is given
            together with the NEW or NORMAL status, which already counts as a
            return.
        approvalChainId:
          allOf:
            - $ref: '#/components/schemas/Uuid'
          description: >
            Id of the approval chain the decision applies to. String, UUID
            format (32-character hex). Required when action=approve or
            action=reject, ignored otherwise. Must belong to the report in the
            path.
        rejectedExpenseRecords:
          type: array
          description: >
            Expense records to reject. Array of objects, optional. Only used
            with action=approve or action=reject. Every record of the report
            that is not listed here is approved, so an omitted or empty list
            approves the whole report; with action=reject an omitted list
            rejects every record of the report.
          items:
            type: object
            required:
              - id
            properties:
              id:
                allOf:
                  - $ref: '#/components/schemas/Uuid'
                description: >
                  Id of the expense record to reject. String, UUID format
                  (32-character hex). Required. Must belong to the report in the
                  path.
              rejectComment:
                type: string
                description: >
                  Comment explaining why the record was rejected. String,
                  unlimited characters. Optional.
        nextStepApproverIds:
          type: array
          description: >
            Ids of the approvers to use for the next approval step. Array of
            strings, optional. Only relevant for action=approve when the
            approval section requires next step approvers to be chosen; the ids
            must be approver candidates of the next approval step.
          items:
            allOf:
              - $ref: '#/components/schemas/Uuid'
            description: Id of an approver. String, UUID format (32-character hex).
    SendReminder:
      type: object
      description: Request body for the single report `sendReminder` action.
      required: []
      properties:
        message:
          type: string
          description: >
            Message included in the reminder mail sent to the report owner.
            String. Optional, the mail is sent without a message when omitted.
    DeleteExternalVoucherInfo:
      type: object
      description: Request body for the single report `deleteExternalVoucherInfo` action.
      required: []
      properties:
        recipientId:
          type: string
          description: >
            Recipient whose voucher numbers are also cleared from the report's
            send chain. String, UUID format (32-character hexadecimal).
            Optional; when omitted only the report and its expense records are
            cleared and the send chain keeps its voucher numbers. A recipient
            that does not belong to the organization is answered with 400
            INVALID_PARAMETER, and nothing is cleared.
          example: 3f2b1a0c9d8e7f6a5b4c3d2e1f0a9b8c
    ExpenseReport:
      type: object
      properties:
        comment:
          type: string
        dateCreated:
          type: string
          readOnly: true
        emailRecipients:
          type: string
        expenseRecords:
          type: array
          items:
            $ref: '#/components/schemas/ExpenseRecord'
        id:
          type: string
        lastUpdated:
          type: string
        name:
          type: string
        organizationId:
          $ref: '#/components/schemas/Uuid'
        personId:
          $ref: '#/components/schemas/Uuid'
        previewUrl:
          type: string
          readOnly: true
        reportNumber:
          type: string
        sent:
          type: string
          readOnly: true
        paid:
          type: string
          format: date-time
          readOnly: true
          description: >-
            Date when the expense report was paid. ISO-8601 format (e.g.,
            2024-01-15T10:30:00Z). Read-only.
        approved:
          type: string
          format: date-time
          readOnly: true
          description: >-
            Date when the expense report was approved. ISO-8601 format (e.g.,
            2024-01-15T10:30:00Z). Read-only.
        status:
          type: string
          enum:
            - APPROVAL
            - APPROVED
            - READY_TO_SEND
            - BULK_TRANSFER
            - ERROR
            - NEW
            - NORMAL
            - ON_HOLD
            - PAID
            - REJECTED
            - SEND
            - SENT
            - TRANSFER
            - TRANSFER_TO_RECIPIENT
            - REVIEW
          readOnly: true
        processStatus:
          type: string
          enum:
            - DRAFT
            - PROCESSING
            - PROCESSED
            - REJECTED
          readOnly: true
        reimbursement:
          type: number
          readOnly: true
        reimbursementCurrency:
          type: string
          readOnly: true
        type:
          type: string
          enum:
            - AUTOMATIC
            - MANUAL
            - COMPANY_CARD
          readOnly: true
        ownerName:
          type: string
        firstName:
          type: string
          description: First name of the expense report owner
        lastName:
          type: string
          description: Last name of the expense report owner
        adminErrorInformation:
          type: string
          description: Error information from admin operations
        organizationName:
          type: string
        organizationNumber:
          type: string
        organizationLanguage:
          type: string
        organizationUseNewDimensions:
          type: boolean
        organizationRequiresAttestation:
          type: boolean
        organizationUsesPaymentBasis:
          type: boolean
        organizationReviewType:
          type: string
          enum:
            - NONE
            - AFTER_SEND
            - AFTER_APPROVAL
          description: >-
            Review type for the organization. None, before approval, or after
            approval. The AFTER_SEND value actually means before approval.
        expenseRecordCount:
          type: integer
          description: Number of expense records in this report
        totalAmount:
          type: number
          description: Total amount of all expense records in the report
        userCanModifyReports:
          type: boolean
        userCanSendReports:
          type: boolean
        reportGroup:
          type: integer
        onHoldStatus:
          type: object
          description: On-hold status information
          readOnly: true
          properties:
            cards:
              type: array
              items:
                type: object
                properties:
                  bank:
                    type: string
                    description: Bank identifier
                  cardNumber:
                    type: string
                    description: Card number (masked)
              description: List of active cards associated with the expense report
            cardMissingConfig:
              type: array
              items:
                type: object
                properties:
                  erId:
                    type: string
                    description: Expense record ID
                  bank:
                    type: string
                    description: Bank identifier
                  cardNumber:
                    type: string
                    description: Card number (masked)
                  cardExternalId:
                    type: string
                    description: External card ID
              description: List of cards missing configuration
            transactionWithAuthStatus:
              type: array
              items:
                type: string
              description: >-
                List of expense record IDs with authorization status
                transactions
            cardDeleted:
              type: array
              items:
                type: object
                properties:
                  erId:
                    type: string
                    description: Expense record ID
                  bank:
                    type: string
                    description: Bank identifier
                  cardNumber:
                    type: string
                    description: Card number (masked)
                  cardExternalId:
                    type: string
                    description: External card ID
              description: List of deleted cards
            allTransactionsEligibleForClearing:
              type: boolean
              description: Whether all transactions are eligible for manual clearing
        bank:
          type: string
          description: Bank information for payment
        dueDate:
          type: string
          format: date-time
          description: Payment due date. ISO-8601 format (e.g., 2024-01-15T10:30:00Z).
        cardNumber:
          type: string
          description: Card number (masked)
        invoiceRef:
          type: string
          description: Invoice reference
        invoiceNumber:
          type: string
          description: Invoice number
        invoiceDate:
          type: string
          format: date-time
          description: Invoice date. ISO-8601 format (e.g., 2024-01-15T10:30:00Z).
        externalVoucherNumber:
          type: string
          description: External voucher number from integration
        externalVoucherInformation:
          type: string
          description: External voucher information
        externalVoucherErrorInformation:
          type: string
          description: Error information from external voucher system
        externalVoucherId:
          type: string
          description: External voucher ID
        reminderSentToUser:
          type: boolean
          description: Whether a reminder has been sent to the user
        hasExpenseViolations:
          type: boolean
          description: >-
            Whether any expense in the report has an unhandled policy violation
            (duplicate receipt or other)
        message:
          type: object
          description: >
            The latest direct message of the report, used for the message icon
            in the report list. Always returned when the report has a message,
            omitted otherwise. Use the 'meta.messages' include to get the
            report's messages (on the single-report endpoints only the messages
            sent to the report owner).
          required:
            - text
            - isAdminView
          properties:
            text:
              type: string
              description: >-
                The text of the latest direct message on the report. Plain text
                with no fixed maximum length.
            isAdminView:
              type: boolean
              description: Whether the message was written from the admin view
        approverReminded:
          type: boolean
          description: Whether an approver has been reminded
        reminderSentToApprover:
          type: boolean
          deprecated: true
          description: >-
            Deprecated, use approverReminded. Whether an approver has been
            reminded
        employeeId:
          type: string
          description: Employee ID (included when 'employeeId' is in include parameter)
        validationErrors:
          type: array
          description: >
            Validation errors of the report and of its expenses (included when
            'validationErrors' is in include parameter). Errors on an expense
            carry the expenseRecordId of that expense; errors on the report
            itself have no expenseRecordId.
          items:
            type: object
            required:
              - errorMessage
              - errorCode
              - checkType
            properties:
              errorMessage:
                type: string
                description: Translated, human-readable text of the error
              errorCode:
                type: string
                description: Code of the error, for example REQUIRED_FIELD
              checkType:
                type: string
                enum:
                  - ERROR
                  - BLOCKER
                  - WARNING
                description: >
                  Severity of the error. ERROR - the document cannot be saved,
                  BLOCKER - the report cannot be sent, WARNING - informational
                  only
              property:
                type: string
                description: >-
                  The field the error applies to, or the custom field definition
                  id for custom fields. Omitted when the error is not tied to a
                  field.
              expenseRecordId:
                type: string
                description: >-
                  The expense the error belongs to. Omitted for errors on the
                  report itself.
        hasRejectedExpenseRecords:
          type: boolean
          description: >-
            Whether the report has rejected expense records (included when
            'approvalChain' is in include parameter)
        hasIncorrectApprovalChains:
          type: boolean
          description: >-
            Whether the report has incorrect approval chains (included when
            'approvalChain' or 'sendChain' is in include parameter)
        approvalAllowed:
          type: boolean
          description: >-
            Whether approval is allowed for this report (included when
            'approvalChain' is in include parameter)
        currentApproverInfo:
          type: object
          description: >-
            Information about the current approver (included when
            'approvalChain' is in include parameter)
          properties:
            singleApprover:
              type: boolean
              description: Whether the report has a single approver
            hasIncorrectApprovalChains:
              type: boolean
              description: Whether the report has incorrect approval chains
            approvalChainId:
              type: string
              description: The approval chain ID
            fullName:
              type: string
              description: Full name of the current approver
            email:
              type: string
              description: Email address of the current approver
        sendChain:
          type: object
          description: >-
            Send chain information (included when 'sendChain' is in include
            parameter)
          properties:
            isComplete:
              type: boolean
              description: Whether every active step in the chain has been sent
            senders:
              type: array
              items:
                type: object
                properties:
                  status:
                    type: string
                    description: >
                      Status of this step in the chain. The step a report is
                      currently waiting on is the one with the lowest sortOrder
                      among the steps still in TRANSFER_TO_RECIPIENT, which is
                      what the recipientId filter matches on.
                  recipient:
                    type: object
                    description: The recipient this step sends to
                    properties:
                      id:
                        type: string
                        description: >-
                          Id of the recipient, the value the recipientId filter
                          takes
                      integrationPluginName:
                        type: string
                        description: >-
                          The integration plugin that delivers to this
                          recipient, if the recipient is served by one
                  sortOrder:
                    type: integer
                    description: Position of this step in the chain, ascending
                  collectReport:
                    type: boolean
                    description: >-
                      Whether this step collects the report instead of sending
                      it on
                  recordInstances:
                    type: array
                    description: >-
                      The per expense record send instances belonging to this
                      step
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                          description: External id of the record send instance
                        expenseRecordId:
                          type: string
                          description: The expense record this instance belongs to
                        externalVoucherNumber:
                          type: string
                          description: Voucher number the recipient booked the record under
                        externalVoucherId:
                          type: string
                          description: The recipient's own id for the voucher
                        externalVoucherUrl:
                          type: string
                          description: Link to the voucher in the recipient system
                        externalVoucherInformation:
                          type: string
                          description: Message returned by the recipient for this record
                        externalVoucherErrorInformation:
                          type: string
                          description: Error returned by the recipient for this record
                        bookingDate:
                          type: string
                          format: date-time
                          description: When the recipient booked the record
                        includedInRecipient:
                          type: boolean
                          description: >-
                            Whether the record was part of what was sent to the
                            recipient
                  uniqueVoucherNumbers:
                    type: array
                    items:
                      type: string
                    description: Unique voucher numbers
                  numberOfNonBookedExpenses:
                    type: integer
                    description: Number of non-booked expenses
                  numberOfBookedExpenses:
                    type: integer
                    description: Number of booked expenses
                  aggregatedVoucherNumbers:
                    type: string
                    description: Aggregated voucher numbers
                  aggregatedVoucherInformation:
                    type: string
                    description: Aggregated voucher information
                  aggregatedVoucherErrorInformation:
                    type: string
                    description: Aggregated voucher error information
              description: List of senders in the chain
        tag:
          type: object
          description: Tag information (included when 'tag' is in include parameter)
          properties:
            simulatedCardReport:
              type: boolean
            dimensions:
              type: object
        meta:
          type: object
          description: >-
            Server-computed metadata for the report. Each property is opt-in
            through the include parameter.
          properties:
            autoApproval:
              type: object
              required:
                - status
              description: >
                AI review guidance for the report, produced by the Controller
                agent and rolled up from the verdicts on the report's expenses.
                Only present when 'meta.autoApproval' is in the include
                parameter, the feature is enabled for the organization, and the
                agent has reached a verdict for every expense in the report.
              properties:
                status:
                  type: string
                  enum:
                    - APPROVED
                    - REJECTED
                  description: >
                    The verdict for the whole report. APPROVED means the report
                    is low risk and needs no manual attention. REJECTED means at
                    least one of its expenses was flagged and the report needs
                    manual review - no rejection has taken place and the
                    report's own status is unaffected. The two values match the
                    per-expense verdict the expense API already exposes under
                    meta.autoApproval, so a client can use one mapping for both.
                    A report the agent has not finished with is omitted entirely
                    rather than reported as pending.
                  readOnly: true
                reasons:
                  type: array
                  description: >
                    Why the agent reached that verdict, in the same wording the
                    approver app shows the end user and already translated for
                    the caller's locale. For REJECTED these are the deviations
                    found on the report's expenses, de-duplicated across them
                    and ordered by reason code. For APPROVED these are the
                    checks that came back clean. Omitted when there is nothing
                    to show, so a REJECTED report can arrive without it.
                  readOnly: true
                  items:
                    type: object
                    required:
                      - reason
                      - description
                    properties:
                      reason:
                        type: string
                        enum:
                          - SIMILAR_REJECTED_ORG
                          - SIMILAR_REJECTED_PERSON
                          - SIMILAR_REJECTED_GLOBAL
                          - POLICY_FAILURE
                          - NOT_VALID_RECEIPT
                          - DEVIATING_AMOUNT_ORG
                          - DEVIATING_AMOUNT_PERSON
                          - DEVIATING_AMOUNT_GLOBAL
                          - PREDICT_AMOUNT_DEVIATION
                          - WEEKEND_PURCHASE_DATE
                          - SPECIAL_ITEM_ALCOHOL
                          - SPECIAL_ITEM_TOBACCO
                        description: >
                          The check the agent ran. The set is closed and matches
                          the agent's reason types; new codes are only added
                          together with a new agent capability.
                      description:
                        type: string
                        description: The translated sentence shown for that reason.
        customFields:
          $ref: '#/components/schemas/ArrayOfCustomFields'
    400Error:
      type: object
      properties:
        result:
          type: string
        code:
          type: string
        description:
          type: string
    403Error:
      type: object
      properties:
        result:
          type: string
        description:
          type: string
      example:
        result: error
        description: Not allowed
    404Error-2:
      type: object
      properties:
        result:
          type: string
        code:
          type: string
        description:
          type: string
    ArrayOfCustomFields:
      type: array
      items:
        type: object
        properties:
          fieldDefinitionId:
            $ref: '#/components/schemas/Uuid'
          value:
            $ref: '#/components/schemas/AnyValue'
    IdObject:
      type: object
      properties:
        id:
          type: string
    ExpenseRecord:
      type: object
      description: ExpenseRecord format
      properties:
        id:
          type: string
        status:
          type: string
          enum:
            - NEW
            - NORMAL
            - APPROVAL
            - APPROVED
            - REJECTED
          readOnly: true
        personId:
          $ref: '#/components/schemas/Uuid'
        dateCreated:
          type: string
          readOnly: true
        lastUpdated:
          type: string
          readOnly: true
        organizationId:
          $ref: '#/components/schemas/Uuid'
        categoryId:
          $ref: '#/components/schemas/Uuid'
        rejectComment:
          type: string
          readOnly: true
        expenseReportId:
          $ref: '#/components/schemas/Uuid'
        reimbursement:
          type: number
          readOnly: true
        reimbursementCurrency:
          type: string
          readOnly: true
        meta:
          type: object
          properties:
            categoryIconUrl:
              type: string
              example: >-
                https://expense.findity.com/api/resources/8a5f867e9b204742a8cc2ca2b6c57358
    AnyValue:
      description: 'Can be: string, number, integer, date, boolean'
  parameters:
    expenseReportId:
      in: path
      name: reportId
      required: true
      description: The id of the expense report to retrieve
      schema:
        $ref: '#/components/schemas/Uuid'
      example: f328e47d595c40ad80f27f52626c5b92
    action:
      in: query
      name: action
      required: false
      description: >
        Action to perform on the expense report instead of a field update.
        String, enum. Optional. Accepted values: reviewOk, clearTransactions,
        approve, reject, simulateBilling, sendReminder, setStatus,
        moveToNextStep, forwardToApprovalOrBooking, deleteExternalVoucherInfo,
        delete.

        `approve` and `reject` submit an approval decision for the report's
        approval chain and require a request body holding `approvalChainId`.
        `approve` carries the per record decisions, so partial approvals are
        supported; `reject` rejects every expense record of the report unless
        explicit records are supplied.

        `simulateBilling` assigns a generated billing file reference to the
        report and to its card transactions, sets the due date to tomorrow and
        renames the report. It requires the
        `adminApiExpenseReports:updateExpenseReport-simulateBilling` permission
        and is intended as a developer and support tool.

        `sendReminder` reminds the owner of the report about it and takes an
        optional `message` in the request body. It requires the
        `adminApiExpenseReports:updateExpenseReport-sendReminder` permission,
        and only reports that carry an invoice reference can be reminded.

        `setStatus` moves the report to the status given in the request body.
        Changing the status of several reports at once, and moving reports to
        another recipient, is a separate operation: `PUT
        /organizations/{organizationId}/reports?action=setStatus`.

        `deleteExternalVoucherInfo` clears the external voucher reference from
        the report and from every expense record in it. With `recipientId` in
        the request body, the voucher numbers of that recipient's step in the
        send chain are cleared as well and a change log entry is written;
        without it, only the report and its records are cleared. A recipient of
        another organization is answered with 400 and nothing is cleared.

        `delete` soft-deletes the report: the report and every expense record in
        it are moved to status DELETED, the report's approval chains are removed
        and a DELETED change log entry is written. Nothing is removed from the
        database. Unlike the other actions this one answers 204 with no body,
        because a deleted report is no longer returned by the read endpoints. It
        is idempotent - deleting an already deleted report answers 204 as well -
        and it has no status or report-type restriction, matching what the admin
        UI allows today. It needs no permission of its own beyond access to the
        report, the same as `reviewOk`, `clearTransactions`, `approve`, `reject`
        and `setStatus`.

        `moveToNextStep` and `forwardToApprovalOrBooking` advance the report in
        its send chain. Both are restricted to the developer role and answer 403
        for anyone else. Use `PUT
        /organizations/{organizationId}/reports?action=moveToNextStep` to
        advance several reports at once.
      schema:
        type: string
        enum:
          - reviewOk
          - clearTransactions
          - approve
          - reject
          - simulateBilling
          - sendReminder
          - setStatus
          - moveToNextStep
          - forwardToApprovalOrBooking
          - deleteExternalVoucherInfo
          - delete
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

````