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

# Data-quality findings of the MRR calculation

> Findings the latest calculation recorded: contracts whose history cannot be reconstructed completely, billed amounts that differ from the contract, items that started and ended within a month, and similar. Findings report; they never change data. Most severe first.

Required permission: `analytics:read`.



## OpenAPI

````yaml assets/openapi-v2-finance.json get /api/analytics/mrr-financials/findings
openapi: 3.0.3
info:
  title: Fynn Finanzberichte API
  version: 2026-09
  description: >-
    The finance reporting API returns the same figures as the finance pages of
    the app: MRR and its movements, Accounted MRR, cash, receivables, revenue,
    the customer base, month-end snapshots with their restatements and the Excel
    books. Every amount is an exact decimal string in one currency, never
    converted and never a float. Months are `YYYY-MM` in the time zone of the
    organisation.


    Authenticate every request with an API token of your organisation
    (`Authorization: Bearer api_...`). Reading needs `analytics:read`, taking a
    snapshot and changing the settings `analytics:write`. Every route also needs
    the finance reports to be enabled for the organisation (feature flag
    `analytics.advanced`); otherwise it answers 403 `feature-not-available`.
servers:
  - url: https://coreapi.io
    description: Production
  - url: https://preview.coreapi.io
    description: Sandbox
security:
  - ApiToken: []
tags:
  - name: Datensätze
    description: Page datasets and the MRR table.
  - name: Drill-downs und Hinweise
    description: Lines behind a cell and data-quality findings.
  - name: Snapshots
    description: Month-end snapshots and their versions.
  - name: Excel-Exporte
    description: Excel books of the finance pages.
  - name: Definitionen
    description: The versioned definitions catalogue with its changelog.
  - name: Einstellungen
    description: Organisation-wide settings of the finance figures.
paths:
  /api/analytics/mrr-financials/findings:
    get:
      tags:
        - Drill-downs und Hinweise
      summary: Data-quality findings of the MRR calculation
      description: >-
        Findings the latest calculation recorded: contracts whose history cannot
        be reconstructed completely, billed amounts that differ from the
        contract, items that started and ended within a month, and similar.
        Findings report; they never change data. Most severe first.


        Required permission: `analytics:read`.
      operationId: listFindings
      parameters:
        - name: severity
          in: query
          description: Only findings of this severity.
          required: false
          schema:
            type: string
            enum:
              - error
              - warning
              - info
        - name: code
          in: query
          description: Only findings with this code, e.g. `BILLED_VS_CONTRACT_DIFF`.
          required: false
          schema:
            type: string
        - name: customerId
          in: query
          description: Only findings of this customer.
          required: false
          schema:
            type: string
            format: uuid
        - name: month
          in: query
          description: Only findings of this month (YYYY-MM).
          required: false
          schema:
            type: string
        - name: page
          in: query
          description: Page, starting at 1.
          required: false
          schema:
            type: integer
            default: 1
            minimum: 1
        - name: pageSize
          in: query
          description: Findings per page.
          required: false
          schema:
            type: integer
            default: 25
            maximum: 200
            minimum: 1
      responses:
        '200':
          description: One page of findings.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FindingsPageView'
        '401':
          description: Missing or invalid authentication.
        '403':
          description: >-
            Missing permission `analytics:read` (`FRAMEWORK__ACCESS_DENIED`), or
            the finance reports are not enabled for the organisation (feature
            flag `analytics.advanced`, `type`
            https://fynn.dev/problems/feature-not-available).
          content:
            application/problem+json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/Problem'
                  - $ref: '#/components/schemas/FeatureNotAvailableProblem'
        '422':
          description: >-
            Invalid query parameter. The body lists the offending parameters in
            `violations` (`propertyPath`, `message`, `code`).
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ValidationProblem'
      security:
        - ApiToken: []
components:
  schemas:
    FindingsPageView:
      description: One page of data-quality findings, most severe first.
      properties:
        data:
          description: Findings of this page.
          type: array
          items:
            $ref: '#/components/schemas/FindingView'
        meta:
          description: Pagination and the calculation time.
          allOf:
            - $ref: '#/components/schemas/PageMetaView'
        counts:
          description: Counts per severity over all findings (unfiltered).
          allOf:
            - $ref: '#/components/schemas/FindingCountsView'
        catalog:
          description: >-
            Every finding code with its German name and explanation (the one
            catalog the Excel books print too).
          type: array
          items:
            $ref: '#/components/schemas/FindingCodeView'
      type: object
    Problem:
      type: object
      description: >-
        Error body (problem+json). `type` is the error key, e.g.
        `ANALYTICS_MRR_FINANCIALS__SNAPSHOT_MONTH_NOT_ENDED`; further keys carry
        the parameters of the error.
      properties:
        status:
          type: integer
          example: 409
        type:
          type: string
          example: ANALYTICS_MRR_FINANCIALS__SNAPSHOT_MONTH_NOT_ENDED
        title:
          type: string
          example: An error occurred
        detail:
          type: string
          description: German sentence that can be shown to the user.
      required:
        - status
        - type
        - title
        - detail
      additionalProperties: true
    FeatureNotAvailableProblem:
      type: object
      description: >-
        403 body when the finance reports are not enabled for the organisation
        (feature flag `analytics.advanced`).
      properties:
        type:
          type: string
          enum:
            - https://fynn.dev/problems/feature-not-available
        title:
          type: string
          example: Feature not available
        detail:
          type: string
          example: >-
            The requested feature is not available. Please contact customer
            support.
        featureFlags:
          type: array
          items:
            type: string
          example:
            - analytics.advanced
      required:
        - type
        - title
        - detail
        - featureFlags
      additionalProperties: true
    ValidationProblem:
      type: object
      description: '422 body: one entry per rejected field in `violations`.'
      properties:
        status:
          type: integer
          example: 422
        type:
          type: string
          example: https://tools.ietf.org/html/rfc2616#section-10
        title:
          type: string
          example: Validation Failed
        detail:
          type: string
        violations:
          type: array
          items:
            $ref: '#/components/schemas/Violation'
      required:
        - status
        - type
        - violations
      additionalProperties: true
    FindingView:
      description: >-
        A data-quality finding of the latest calculation. Findings report, they
        never change data.
      properties:
        id:
          description: Id of the finding (stable across recalculations of unchanged data).
          type: string
        code:
          description: >-
            Finding code, e.g. `BILLED_VS_CONTRACT_DIFF`,
            `PRICE_HISTORY_UNKNOWN`, `INTRA_MONTH_LIFECYCLE`.
          type: string
          example: PRICE_HISTORY_UNKNOWN
        codeLabel:
          description: >-
            German name of the code (the one catalog; the code itself for an
            unknown code).
          type: string
          example: Preisverlauf unbekannt
        severity:
          description: Severity.
          type: string
          enum:
            - error
            - warning
            - info
        message:
          description: One English sentence describing the finding.
          type: string
        entityType:
          description: >-
            Kind of record the finding is about, e.g. `subscription_item`,
            `subscription`, `invoice_position`, `account:customer`.
          type: string
        entityId:
          description: Id of that record.
          type: string
        monthStart:
          description: >-
            Month the finding applies to (first day of the month, ISO 8601).
            Null when it is not month-specific.
          type: string
          format: date-time
          nullable: true
        customer:
          description: The customer the finding belongs to.
          nullable: true
          allOf:
            - $ref: '#/components/schemas/RefView'
        subscriptionId:
          description: Id of the subscription the finding belongs to.
          type: string
          nullable: true
        details:
          description: >-
            Code-specific details (for example billed and expected amounts as
            decimal strings).
          type: object
      type: object
    PageMetaView:
      description: Pagination of a list response.
      properties:
        page:
          description: Current page, starting at 1.
          type: integer
          example: 1
        pageSize:
          description: Maximum number of entries per page.
          type: integer
          example: 25
        total:
          description: Number of entries over all pages.
          type: integer
          example: 112
        sum:
          description: >-
            Sum of `amount` over all entries of all pages (drill-down lists
            only). It equals the value of the cell the list explains; for
            contraction and lost the lines carry the signed change, so their sum
            is the negative of the unsigned cell.
          nullable: true
          allOf:
            - $ref: '#/components/schemas/MoneyView'
        asOf:
          description: >-
            When the figures were last calculated (ISO 8601). Null when no
            calculation exists yet.
          type: string
          format: date-time
          nullable: true
      type: object
    FindingCountsView:
      description: Number of data-quality findings of the latest calculation per severity.
      properties:
        error:
          description: Findings that point at wrong numbers.
          type: integer
          example: 0
        warning:
          description: Findings that point at data that should be checked.
          type: integer
          example: 3
        info:
          description: Informational findings.
          type: integer
          example: 12
      type: object
    FindingCodeView:
      description: One finding code of the catalog with its German name and explanation.
      properties:
        code:
          description: Finding code.
          type: string
          example: PRICE_HISTORY_UNKNOWN
        label:
          description: German name of the code.
          type: string
          example: Preisverlauf unbekannt
        explanation:
          description: >-
            German explanation: what the calculation assumed or did for this
            code.
          type: string
      type: object
    Violation:
      type: object
      properties:
        propertyPath:
          type: string
          example: to
        message:
          type: string
          example: Der Zeitraum darf höchstens 36 Monate umfassen.
        code:
          type: string
          example: analytics.mrr_financials.range_too_long
      required:
        - propertyPath
        - message
        - code
    RefView:
      description: >-
        Reference to a customer, subscription, product or invoice: id, number
        and display name where they exist.
      properties:
        id:
          description: Id (UUID).
          type: string
          nullable: true
        number:
          description: >-
            Human-readable number (customer number, subscription number, invoice
            number).
          type: string
          nullable: true
        name:
          description: Display name.
          type: string
          nullable: true
      type: object
    MoneyView:
      description: >-
        A money amount. `amount` is an exact decimal string with two decimal
        places (net, excluding VAT, unless stated otherwise); `currency` is the
        ISO-4217 code.
      properties:
        amount:
          description: >-
            Exact decimal amount with two decimal places, dot as separator.
            Negative amounts carry a leading minus.
          type: string
          example: '1234.56'
        currency:
          description: ISO-4217 currency code.
          type: string
          example: EUR
      type: object
  securitySchemes:
    ApiToken:
      type: http
      scheme: bearer
      description: >-
        API token of the organisation. Send it as Authorization: Bearer api_...
        The token is bound to exactly one organisation.

````