> ## 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.

# One data-quality finding with its explanation

> The finding plus `explanation`: the customer, subscription, item and product it is about; the assumption the calculation made for the code (one German sentence); the details as labelled facts; and code-specific sections. `BILLED_VS_CONTRACT_DIFF` carries every checked month of the item (contract, billed, difference, days, tolerance), the invoice positions billed into the finding's month, the contract segments and the price changes of the plan. Sections that do not apply to the code are null.

Required permission: `analytics:read`.



## OpenAPI

````yaml assets/openapi-v2-finance.json get /api/analytics/mrr-financials/findings/{id}
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/{id}:
    get:
      tags:
        - Drill-downs und Hinweise
      summary: One data-quality finding with its explanation
      description: >-
        The finding plus `explanation`: the customer, subscription, item and
        product it is about; the assumption the calculation made for the code
        (one German sentence); the details as labelled facts; and code-specific
        sections. `BILLED_VS_CONTRACT_DIFF` carries every checked month of the
        item (contract, billed, difference, days, tolerance), the invoice
        positions billed into the finding's month, the contract segments and the
        price changes of the plan. Sections that do not apply to the code are
        null.


        Required permission: `analytics:read`.
      operationId: getFinding
      parameters:
        - name: id
          in: path
          description: Id of the finding.
          required: true
          schema:
            type: string
            format: uuid
            pattern: >-
              [0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}
      responses:
        '200':
          description: The finding with its explanation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FindingDetailView'
        '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'
        '404':
          description: No finding with this id in the latest calculation.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
      security:
        - ApiToken: []
components:
  schemas:
    FindingDetailView:
      description: >-
        One finding with the explanation of what the calculation assumed and the
        data it saw.
      properties:
        finding:
          description: The finding, as in the findings list.
          allOf:
            - $ref: '#/components/schemas/FindingView'
        explanation:
          description: Why the finding exists and the records behind it.
          allOf:
            - $ref: '#/components/schemas/FindingExplanationView'
      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
    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
    FindingExplanationView:
      description: >-
        Explanation of a finding: the records it is about, the assumption the
        calculation made, the key facts, and code-specific sections. A section
        is null when it does not apply to the code.
      properties:
        entity:
          description: Customer, subscription, item and product the finding is about.
          allOf:
            - $ref: '#/components/schemas/FindingEntityView'
        assumption:
          description: >-
            The assumption the calculation made for this code, one German
            sentence.
          type: string
        facts:
          description: Key facts of the finding with German labels.
          type: array
          items:
            $ref: '#/components/schemas/FindingFactView'
        months:
          description: >-
            `BILLED_VS_CONTRACT_DIFF`: every checked month of the item, contract
            against billed.
          type: array
          items:
            $ref: '#/components/schemas/FindingContractMonthView'
          nullable: true
        invoices:
          description: >-
            `BILLED_VS_CONTRACT_DIFF`: the recurring invoice positions of the
            item billed into the finding's month; `MANUAL_INVOICE_POSITION`: the
            position.
          type: array
          items:
            $ref: '#/components/schemas/FindingInvoiceView'
          nullable: true
        contract:
          description: >-
            The contract segments of the item, row or subscription as the
            calculation stored them.
          type: array
          items:
            $ref: '#/components/schemas/FindingSegmentView'
          nullable: true
        priceHistory:
          description: >-
            Price changes recorded for the item's price plan (an empty list:
            none recorded).
          type: array
          items:
            $ref: '#/components/schemas/FindingPriceHistoryView'
          nullable: true
      type: object
    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
    FindingEntityView:
      description: The records a finding is about, with numbers and names.
      properties:
        type:
          description: >-
            Kind of record, e.g. `subscription_item`, `subscription`,
            `invoice_position`.
          type: string
        id:
          description: Id of that record.
          type: string
        customer:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/RefView'
        subscription:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/RefView'
        item:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/ItemRefView'
        product:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/RefView'
      type: object
    FindingFactView:
      description: >-
        One fact of a finding: the key in `details`, a German label and the
        value as text.
      properties:
        key:
          description: Key in the finding's `details`.
          type: string
        label:
          description: German label.
          type: string
        value:
          description: Value as text (amounts as exact decimals, instants in ISO 8601).
          type: string
          nullable: true
        money:
          description: >-
            The value as a money amount, for the amounts of a `RESTATEMENT`
            finding (`snapshotValue`, `currentValue`, `delta`); null otherwise.
          nullable: true
          allOf:
            - $ref: '#/components/schemas/MoneyView'
        causeLabel:
          description: >-
            German labels of the causes of a `RESTATEMENT` finding (key
            `causes`), comma-separated; null otherwise.
          type: string
          example: Vertragsende geändert
          nullable: true
      type: object
    FindingContractMonthView:
      description: >-
        One month of the billed-against-contract check of an item (30/360 day
        count).
      properties:
        month:
          description: Month (YYYY-MM).
          type: string
          example: 2026-03
        contractAmount:
          description: 'Contract amount of the month: monthly amount × contract days / 30.'
          allOf:
            - $ref: '#/components/schemas/MoneyView'
        billedAmount:
          description: >-
            Billed recurring net of the month: each position prorated by the
            days of its service period.
          allOf:
            - $ref: '#/components/schemas/MoneyView'
        difference:
          description: Billed − contract.
          allOf:
            - $ref: '#/components/schemas/MoneyView'
        prorationDays:
          description: Days of the month covered by the contract (30/360).
          type: integer
        tolerance:
          description: 'Allowed difference: max(2.00, 2 % of the contract amount).'
          allOf:
            - $ref: '#/components/schemas/MoneyView'
        invoiceLines:
          description: Number of invoice positions billed into the month.
          type: integer
        flagged:
          description: >-
            Whether the difference exceeds the tolerance (a finding exists for
            the month).
          type: boolean
        cause:
          description: >-
            Why billed and contract differ in the month (null when they are
            equal): `billing_start_later`, `not_yet_billed` (the next billing
            run will invoice it), `not_billed` (an elapsed month no run will
            invoice), `upcoming_invoice`, `trial`, `credit_or_cancellation`,
            `billed_after_end` (the contract ended before the month end, the
            invoices still bill it), `period_shift` (a service period starts at
            23:00 local time the day before, one day lands in the previous
            month), `price_mismatch`, `unknown`.
          type: string
          example: billing_start_later
          nullable: true
        causeLabel:
          description: German label of the cause ("Ursache").
          type: string
          example: Abrechnung beginnt später
          nullable: true
        expectedText:
          description: What was expected ("Erwartet"), e.g. "erste Rechnung am 01.12.2026".
          type: string
          example: erste Rechnung am 01.12.2026
          nullable: true
      type: object
    FindingInvoiceView:
      description: An invoice position behind a finding.
      properties:
        invoice:
          description: Invoice, cancellation or credit note.
          allOf:
            - $ref: '#/components/schemas/InvoiceRefView'
        positionId:
          description: Id of the position.
          type: string
        net:
          description: Net of the position (signed).
          allOf:
            - $ref: '#/components/schemas/MoneyView'
        shareInMonth:
          description: >-
            Part of the net that falls into the finding's month; equal to `net`
            without a service period.
          allOf:
            - $ref: '#/components/schemas/MoneyView'
        daysInMonth:
          description: >-
            Days of the service period in the month (30/360); null without a
            service period.
          type: integer
          nullable: true
        servicePeriodDays:
          description: >-
            Days of the whole service period (30/360); null without a service
            period.
          type: integer
          nullable: true
        serviceFrom:
          description: Service period start.
          type: string
          format: date-time
          nullable: true
        serviceTo:
          description: Service period end.
          type: string
          format: date-time
          nullable: true
        finalizationDate:
          description: Finalization date of the document.
          type: string
          format: date-time
          nullable: true
      type: object
    FindingSegmentView:
      description: >-
        A stored contract segment: a period with one monthly amount and the
        price inputs it was calculated from.
      properties:
        itemId:
          description: Subscription item, or the schedule product row without item.
          type: string
          nullable: true
        validFrom:
          description: Start (inclusive).
          type: string
          format: date-time
        validTo:
          description: End (exclusive); null while open.
          type: string
          format: date-time
          nullable: true
        monthlyAmount:
          description: Monthly amount (MRR contribution).
          allOf:
            - $ref: '#/components/schemas/MoneyView'
        quantity:
          description: Quantity as exact decimal.
          type: string
          nullable: true
        billingInterval:
          description: Billing interval of the price, e.g. `P1M`.
          type: string
          nullable: true
        priceSource:
          description: >-
            Where the price came from: `current` (the plan today), `history` (a
            recorded price change), `audit` (the change log), `assumed`.
          type: string
          nullable: true
        priceHistoryId:
          description: The price-history entry used, if any.
          type: string
          nullable: true
        sourceKind:
          description: 'Kind of source: `legacy_item` or `schedule_row`.'
          type: string
        inputs:
          description: >-
            The stored inputs (price inputs, price source, measurement,
            discounts, events).
          type: object
      type: object
    FindingPriceHistoryView:
      description: A recorded price change of a price plan.
      properties:
        id:
          description: Id of the entry.
          type: string
        appliedOn:
          description: From when the price applies.
          type: string
          format: date-time
        priceUpdate:
          description: The stored price of the entry.
          type: object
      type: object
    ItemRefView:
      description: A subscription item (or a schedule product row that has no item yet).
      properties:
        id:
          description: Item id, or the product row id for a scheduled row without item.
          type: string
        name:
          description: Display name of the item.
          type: string
          nullable: true
        productName:
          description: Name of the product.
          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
    InvoiceRefView:
      description: Reference to an invoice document.
      properties:
        id:
          description: Invoice id (UUID).
          type: string
          nullable: true
        number:
          description: Invoice number.
          type: string
          nullable: true
        type:
          description: Document type.
          type: string
          enum:
            - TYPE_INVOICE
            - TYPE_CREDIT
            - TYPE_CANCEL
          nullable: true
        status:
          description: Document status at the time of the calculation.
          type: string
          nullable: true
      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.

````