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

# List Expense Reports



## OpenAPI

````yaml /openapi/reimbursement/expenses/openapi.yaml get /v1/expense-reports
openapi: 3.0.3
info:
  title: Reimbursement
  description: API for managing reimbursement expenses.
  version: '1.0'
servers:
  - url: https://api.spirii.com/reimbursement
security:
  - BearerAuth: []
tags:
  - name: Reimbursement Expenses
    description: Operations related to expense reimbursement.
paths:
  /v1/expense-reports:
    get:
      tags:
        - Reimbursement Expenses
      summary: List Expense Reports
      operationId: listExpenseReports
      parameters:
        - $ref: '#/components/parameters/customerCrmId'
        - $ref: '#/components/parameters/expenseReportStatus'
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/page'
        - $ref: '#/components/parameters/sortByExpenseReport'
        - $ref: '#/components/parameters/sortDirection'
      responses:
        '200':
          description: Returns a paginated list of expense reports.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedExpenseReports'
        default:
          $ref: '#/components/responses/ProblemDetail'
components:
  parameters:
    customerCrmId:
      name: customerCrmId
      in: query
      required: false
      description: Filter Expense Reports by specific Fleet Customer ID.
      schema:
        type: integer
        example: 4567
    expenseReportStatus:
      name: status
      in: query
      required: false
      description: >
        Filter Expense Reports by specific status.


        Active is for current month. Pending is await approval. Approved means
        approved, but no funds transferred (if applicable). FundsReceived means
        transfer of funds was registered (if applicable).
      schema:
        $ref: '#/components/schemas/ExpenseReportStatus'
    limit:
      name: limit
      in: query
      required: false
      description: Maximum number of items to return per page.
      schema:
        type: integer
        minimum: 1
        maximum: 500
        default: 20
    page:
      name: page
      in: query
      required: false
      description: Page number, starting at 1.
      schema:
        type: integer
        minimum: 1
        default: 1
    sortByExpenseReport:
      name: sortBy
      in: query
      required: false
      description: Field to sort the list of Expense Reports by.
      schema:
        type: string
        enum:
          - id
          - period
          - status
    sortDirection:
      name: sortDirection
      in: query
      required: false
      description: The ordering direction.
      schema:
        type: string
        enum:
          - ASC
          - DESC
        default: DESC
  schemas:
    PaginatedExpenseReports:
      type: object
      properties:
        data:
          readOnly: true
          type: array
          description: The items on the current page.
          items:
            $ref: '#/components/schemas/ExpenseReport'
        pagination:
          description: Pagination metadata for navigating result pages.
          allOf:
            - $ref: '#/components/schemas/PaginationMeta'
      required:
        - data
        - pagination
    ExpenseReportStatus:
      type: string
      description: Status of the Expense Report.
      enum:
        - Active
        - Pending
        - Approved
        - FundsReceived
      x-enum-varnames:
        - Active
        - Pending
        - Approved
        - FundsReceived
      x-enum-descriptions:
        - Current month's expense report.
        - Expense Report ready to be approved.
        - Expense Report has been approved, but not yet paid for.
        - Expense Report has been finalized (approved and paid for).
    ExpenseReport:
      type: object
      properties:
        companyName:
          type: string
          description: Name of the fleet company associated with this Expense Report.
          example: Example Company Inc.
        currency:
          type: string
          nullable: true
          description: ISO 4217 currency code for the reimbursement amount.
          example: EUR
        emailAddressList:
          type: array
          description: Email addresses notified when the report is approved.
          items:
            type: string
            format: email
            nullable: true
          example:
            - manager1@email.com
            - manager2@email.com
        id:
          type: integer
          description: Unique identifier of the Expense Report.
          example: 42
        invalidInformation:
          description: >-
            Issues blocking approval of this Expense Report. When present, all
            flagged problems must be resolved before the report can be approved.
          allOf:
            - $ref: '#/components/schemas/InvalidInformation'
        period:
          $ref: '#/components/schemas/Period'
        status:
          $ref: '#/components/schemas/ExpenseReportStatus'
        totalAmountInCents:
          type: number
          description: >-
            Total reimbursable amount across all expenses, in the smallest
            currency unit (e.g. cents).
        totalConsumptionInWattHours:
          type: number
          description: >-
            Total energy consumed across all charging sessions in the report, in
            watt-hours.
      required:
        - companyName
        - id
        - period
        - status
        - totalAmountInCents
        - totalConsumptionInWattHours
    PaginationMeta:
      type: object
      readOnly: true
      properties:
        currentPage:
          readOnly: true
          type: integer
          description: The current page this paginator "points" to (indexed from 1).
          example: 3
        itemCount:
          readOnly: true
          type: integer
          description: The amount of items on this specific page.
          example: 20
        itemsPerPage:
          readOnly: true
          type: integer
          description: The amount of items that were requested per page.
          example: 25
        totalItems:
          readOnly: true
          type: integer
          nullable: true
          description: The total amount of items across all pages.
          example: 70
        totalPages:
          readOnly: true
          type: integer
          nullable: true
          description: The total amount of pages.
          example: 3
      required:
        - currentPage
        - itemCount
        - itemsPerPage
    ProblemDetail:
      type: object
      description: RFC 9457 problem details.
      properties:
        type:
          type: string
          example: about:blank
          description: >-
            A URI reference that identifies the problem type. When this member
            is not present, its value is assumed to be "about:blank".
          format: uri
        title:
          example: Bad Request
          description: >-
            A short, human-readable summary of the problem type. It should not
            change from occurrence to occurrence of the problem, except for
            purposes of localization.
          type: string
        status:
          example: 400
          description: >-
            The HTTP status code generated by the origin server for this
            occurrence of the problem.
          type: integer
        detail:
          example: Invalid request body
          description: >-
            A human-readable explanation specific to this occurrence of the
            problem.
          type: string
        instance:
          example: /v1/uri-called/
          description: >-
            A URI reference that identifies the specific occurrence of the
            problem.
          type: string
          format: uri-reference
        errors:
          example:
            - currentPage must be a positive integer
          description: >-
            Optional field containing additional error details, such as
            validation errors.
          type: array
          items:
            type: string
      required:
        - type
        - title
        - status
        - detail
        - instance
    InvalidInformation:
      type: object
      description: >-
        Issues blocking approval of the Expense Report. When present, all
        flagged problems must be resolved before the report can be approved.
      properties:
        awaitingExpenseReportList:
          type: array
          items:
            type: integer
          description: >-
            IDs of other Pending Expense Reports for the same fleet customer.
            These must be resolved before this report can be approved.
        companyCustomer:
          description: >-
            The fleet (company) customer has missing required fields.
            `customerCrmId` is the customer's Spirii ID, `name` is the company
            name, and `invalidFields` lists the names of the missing fields
            (possible values: `email`, `name`, `phoneNumber`, `address`, `city`,
            `country`, `zipcode`).
          allOf:
            - $ref: '#/components/schemas/InvalidCustomerFields'
        supplierCustomer:
          description: >-
            The fleet supplier (or operator) has missing required fields.
            `customerCrmId` is the supplier's Spirii ID, `name` is the supplier
            name, and `invalidFields` lists the names of the missing fields
            (possible values: `name`, `address`, `city`, `country`, `zipcode`).
          allOf:
            - $ref: '#/components/schemas/InvalidCustomerFields'
        invalidBeneficiary:
          description: >-
            One or more expenses are linked to the fleet company customer
            instead of an individual driver customer. `customerCrmId` is the
            fleet customer's Spirii ID, and `expenseIds` contains the IDs of the
            affected expenses. These must be re-linked to the correct driver
            customer before the report can be approved.
          allOf:
            - $ref: '#/components/schemas/InvalidBeneficiary'
        kycNotPassed:
          type: boolean
          description: >-
            When `true`, the fleet customer has not completed KYC (Know Your
            Customer) verification with PPS.
        missingReimbursementRates:
          type: array
          items:
            $ref: '#/components/schemas/MissingReimbursementRate'
          description: >-
            Charging locations with CDRs that have missing reimbursement rate
            data. Each entry identifies a location and the end dates of affected
            charging sessions.
        recipientList:
          type: array
          items:
            $ref: '#/components/schemas/InvalidCustomerFields'
          description: >-
            Expense recipients (employees/drivers) with missing required
            personal information. `customerCrmId` is the driver's Spirii ID,
            `name` is their display name, and `invalidFields` lists the names of
            the missing fields (possible values: `email`, `name`, `iban`).
    Period:
      type: object
      description: Month of the most recent expense in the report.
      properties:
        year:
          type: integer
          description: Calendar year of the period.
          example: 2026
        monthIndex:
          type: integer
          minimum: 0
          maximum: 11
          description: A number between 0 and 11 (January to December).
          example: 0
      required:
        - year
        - monthIndex
    InvalidCustomerFields:
      type: object
      description: A customer with one or more invalid required fields blocking approval.
      properties:
        customerCrmId:
          type: string
          description: Spirii ID of the customer.
        name:
          type: string
          description: Display name of the customer.
        invalidFields:
          type: array
          items:
            type: string
          description: Names of the missing or invalid fields.
      required:
        - customerCrmId
        - name
        - invalidFields
    InvalidBeneficiary:
      type: object
      description: >-
        One or more expenses are linked to the fleet company customer instead of
        an individual driver customer. Usually due to an incorrectly configured
        Location, which is invalid for reimbursement.
      properties:
        customerCrmId:
          type: string
          description: Spirii ID of the fleet customer.
        expenseIds:
          type: array
          items:
            type: string
          description: >-
            IDs of the affected expenses that must be re-linked to the correct
            driver customer.
      required:
        - customerCrmId
        - expenseIds
    MissingReimbursementRate:
      type: object
      description: A charging location that has CDRs with missing reimbursement rate data.
      properties:
        locationId:
          type: integer
          description: Spirii ID of the location.
        locationName:
          type: string
          description: Display name of the charging location.
        cdrEndDates:
          type: array
          items:
            type: string
            format: date-time
          description: End dates of the affected charging sessions (ISO 8601).
      required:
        - locationId
        - locationName
        - cdrEndDates
  responses:
    ProblemDetail:
      description: >-
        An error occurred. Returns a response body conforming to [RFC
        9457](https://www.rfc-editor.org/rfc/rfc9457).
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetail'
  securitySchemes:
    BearerAuth:
      scheme: bearer
      bearerFormat: JWT
      description: Authorization via a JWT bearer token.
      type: http

````