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

# Recurring revenue page datasets

> Key figures (MRR, ARR, net new MRR, quick ratio) with twelve months of history, the MRR bridge and its reasons per month, contractually committed MRR with the known MRR and events of the next twelve months, the MRR table, the snapshot state of every MRR cell and the definitions catalogue. Amounts are exact decimal strings in one currency, never converted.

Required permission: `analytics:read`.



## OpenAPI

````yaml assets/openapi-v2-finance.json get /api/analytics/finance/recurring
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/finance/recurring:
    get:
      tags:
        - Datensätze
      summary: Recurring revenue page datasets
      description: >-
        Key figures (MRR, ARR, net new MRR, quick ratio) with twelve months of
        history, the MRR bridge and its reasons per month, contractually
        committed MRR with the known MRR and events of the next twelve months,
        the MRR table, the snapshot state of every MRR cell and the definitions
        catalogue. Amounts are exact decimal strings in one currency, never
        converted.


        Required permission: `analytics:read`.
      operationId: getFinanceRecurring
      parameters:
        - name: from
          in: query
          description: >-
            First month (YYYY-MM, time zone of the organisation). Default: `to`
            minus 11 months.
          required: false
          schema:
            type: string
        - name: to
          in: query
          description: 'Last month (YYYY-MM). Default: the current month. At most 36 months.'
          required: false
          schema:
            type: string
        - name: currency
          in: query
          description: 'ISO-4217 code. Default: the default currency.'
          required: false
          schema:
            type: string
        - name: scope
          in: query
          description: 'Movement scope. Default: the organisation setting.'
          required: false
          schema:
            type: string
            enum:
              - subscription
              - invoice_address
              - customer
              - organisation
        - name: segmentId
          in: query
          description: 'Analytics segment: only its customers.'
          required: false
          schema:
            type: string
            format: uuid
        - name: month
          in: query
          description: >-
            Month preselected for the bridge (YYYY-MM, within the range).
            Default: the last month of the range that has ended.
          required: false
          schema:
            type: string
      responses:
        '200':
          description: The datasets.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RecurringDatasetView'
        '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:
    RecurringDatasetView:
      description: >-
        Recurring revenue page: key figures, MRR bridge with reasons, committed
        and known forward MRR, the MRR table and the definitions.
      properties:
        tenantName:
          description: Name of the organisation.
          type: string
        currency:
          description: Currency of every amount (ISO-4217).
          type: string
          example: EUR
        asOf:
          description: Calculation time; null before the first calculation.
          type: string
          format: date-time
          nullable: true
        months:
          description: Months of the range (YYYY-MM), ascending.
          type: array
          items:
            type: string
        mrrWire:
          description: The MRR table (same shape as `GET /api/analytics/mrr-financials`).
          allOf:
            - $ref: '#/components/schemas/MrrFinancialsTableView'
        recurring:
          description: Key figures, bridge months and backlog.
          allOf:
            - $ref: '#/components/schemas/RecurringView'
        selectedMonth:
          description: >-
            Month preselected for the bridge (the `month` parameter, default the
            last complete month of the range).
          type: string
          example: 2026-08
          nullable: true
        mrrCells:
          description: >-
            Snapshot state per snapshotted table row, aligned with `months`: the
            copied MRR rows (`mrr_bop`, `mrr_eop`, `new`, `expansion`,
            `contraction`, `lost`, `resurrecting`) and the rows derived from
            them with the table's formulas (`arr_eop`; `revenue_churn_rate` and
            `mom_growth` as rates at scale 6; their `restatement` is always
            null). Rows not listed keep their current values and are named in
            `meta.notSnapshotted`. Empty object when the range has no snapshot
            or a segment is applied (snapshots are organisation-wide).
          type: object
          additionalProperties:
            type: array
            items:
              oneOf:
                - $ref: '#/components/schemas/MrrCellMarkerView'
              nullable: true
        definitions:
          description: Definitions catalogue.
          allOf:
            - $ref: '#/components/schemas/MetricDefinitionsView'
        meta:
          description: Calculation time, scope, currency, findings, filters not applied.
          allOf:
            - $ref: '#/components/schemas/FinanceMetaView'
      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
    MrrFinancialsTableView:
      description: >-
        The MRR financials table: one value per row and month. Money values are
        objects with an exact decimal `amount` (two places) and `currency`;
        rates are exact decimal strings with six places (`"0.001600"` = 0.16 %).
        Contraction and lost are unsigned amounts (they lower MRR); reason
        amounts are signed.
      properties:
        months:
          description: >-
            Months of the range (YYYY-MM, time zone of the organisation),
            ascending. Every series is aligned with this list.
          type: array
          items:
            type: string
            example: 2026-09
        rows:
          description: >-
            Series per row key: `one_off` (Net (gross − tax, after position
            discounts) of the one-off positions of the documents finalized in
            the month: one-time prices of subscription items, manual positions,
            setup fees, and discounts without a parent position (dunning fees
            are other operating income, not revenue); credit notes and
            cancellations count negative.), `variable` (Net (gross − tax, after
            position discounts) of the usage-based positions of the documents
            finalized in the month: usage quantities, metered measurements and
            percentage prices; credit notes and cancellations count negative.),
            `mrr_bop`, `mrr_eop` (MRR at the end of the previous / this month),
            `accounted_mrr` ("Accounted MRR": the recurring invoice positions'
            shares of the month by their service period, 30/360; null for a
            snapshot copy), `billing_gap` ("Differenz Vertrag zu Rechnung":
            `mrr_eop − accounted_mrr`, its causes under `reasons.billing_gap`),
            `new`, `expansion`, `contraction`, `lost`, `resurrecting`
            (movements), `arr_eop` (MRR × 12), `revenue_churn_rate`
            ((contraction + lost) / BoP), `mom_growth` ((EoP − BoP) / BoP),
            `cash_collected` ("Zahlungseingang") and its split by the invoice
            the money pays, adding up to it: `cash_collected_this_month`
            (invoices finalized in the same month),
            `cash_collected_other_months` (invoices of other months),
            `cash_collected_unassigned` (no finalized invoice: top-ups,
            prepayments, the part above the gross of an overpaid invoice),
            `cash_collected_refund_returned` ("Erstattung zurückgekommen": a
            negative refund matched from the bank account), `cash_refunded`
            ("Zahlungsausgang": refunds, chargebacks, payouts and return debit
            fees) and its split by kind, adding up to it: `cash_refunded_refund`
            ("Erstattungen"), `cash_refunded_chargeback` ("Rücklastschriften"),
            `cash_refunded_payout` ("Auszahlungen"), `cash_refunded_return_fee`
            ("Rücklastschrift-Gebühren": the bank fee of a return debit without
            a return case, not part of the invoice; all four null for a snapshot
            copy), `cash_corrections` ("Korrekturen": refunds entered by hand
            and cancelled by a counter-entry, no money moved, outside cash in
            and out; 0 over a range that holds both entries) with
            `cash_corrections_reversed` ("storniert") and
            `cash_corrections_counter` ("Gegenbuchung", negative; all three null
            for a snapshot copy), `cash_net` (by payment date, whatever month
            the invoice belongs to), `cash_forecast` ("Rechnungsprognose
            (brutto)": gross of the invoices the billing forecast expects in the
            month; null for elapsed months), `receivables_eop` (open amounts of
            finalized invoices at the month end; months after the current one
            carry the invoices open today forward). A value is null when the
            month has no data at all.
          type: object
          additionalProperties:
            type: array
            items:
              nullable: true
              oneOf:
                - $ref: '#/components/schemas/MoneyView'
                - type: string
                  example: '0.012500'
        totals:
          description: >-
            Total column per row key: flows are summed over the range, `mrr_bop`
            is the BoP of the first month, `mrr_eop`, `accounted_mrr`,
            `billing_gap`, `arr_eop` and `receivables_eop` are the value of the
            last month, rates are null. Totals are computed from the exact
            amounts and rounded once, so they can differ by a cent from the sum
            of the rounded cells.
          type: object
          additionalProperties:
            nullable: true
            oneOf:
              - $ref: '#/components/schemas/MoneyView'
              - type: string
        reasons:
          description: >-
            Reason split of the movements: `expansion` and `contraction` (and
            `new`, `lost`, `resurrecting` for the detail view), each a map from
            reason (`price_change`, `quantity_change`, `discount_start`,
            `plan_change`, …) to a series aligned with `months`. Amounts are
            signed: contraction reasons are negative. `billing_gap`: the
            difference contract − invoice per cause (`partial_month`,
            `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`, `period_shift`, `price_mismatch`, `unknown`);
            the causes of a month add up to the `billing_gap` cell.
          type: object
          additionalProperties:
            description: Reason => series of money values aligned with `months`.
            type: object
        meta:
          description: Calculation time, effective scope and currency, finding counts.
          allOf:
            - $ref: '#/components/schemas/FinanceMetaView'
        reasonLabels:
          description: >-
            German name of every key of `reasons`: the movement reasons (the one
            catalogue, the same names as the card "Ursachen der Bewegungen";
            every reason is its own "davon" row, added and removed products are
            not netted) and the causes of `billing_gap`. "Sonstiges" only for a
            key outside the catalogue.
          type: object
          example:
            contract_start: Vertragsbeginn
            price_change: Preisänderung
            not_billed: Nicht abgerechnet
          additionalProperties:
            type: string
      type: object
    RecurringView:
      description: Datasets of the recurring revenue page.
      properties:
        kpis:
          description: 'Key figures: MRR, ARR, net new MRR, quick ratio.'
          type: array
          items:
            $ref: '#/components/schemas/KpiTileView'
        movementMonths:
          description: Bridge and reasons per month of the range.
          type: array
          items:
            $ref: '#/components/schemas/MovementMonthView'
        backlog:
          description: Committed MRR and known forward MRR.
          allOf:
            - $ref: '#/components/schemas/BacklogView'
      type: object
    MrrCellMarkerView:
      description: Snapshot state of one MRR cell.
      properties:
        snapshot:
          description: >-
            Value of the latest month-end snapshot as an exact decimal (a rate
            row: the rate at scale 6); null when the month has none.
          type: string
          example: '150.00'
          nullable: true
        snapshotVersion:
          description: Version of that snapshot.
          type: integer
          example: 1
          nullable: true
        restatement:
          description: >-
            Difference to the snapshot; null when there is none. Only
            snapshotted figures (`mrr_bop`, `mrr_eop` and the five movements)
            carry one.
          nullable: true
          allOf:
            - $ref: '#/components/schemas/RestatementMarkerView'
        snapshotAccounts:
          description: >-
            Accounts in the snapshot: `mrr_eop` the accounts with MRR above 0 at
            the month end, a movement row the accounts with that movement; null
            for the other rows.
          type: integer
          example: 2
          nullable: true
      type: object
    MetricDefinitionsView:
      description: The definitions catalogue the figures are computed by.
      properties:
        version:
          description: Catalogue version.
          type: string
          example: v2
        validFrom:
          description: Date from which the version applies (YYYY-MM-DD).
          type: string
          example: '2026-09-28'
        entries:
          description: The definitions.
          type: array
          items:
            $ref: '#/components/schemas/MetricDefinitionView'
        changelog:
          description: >-
            Every version of the catalogue, newest first, with the definitions
            whose meaning changed.
          type: array
          items:
            $ref: '#/components/schemas/MetricDefinitionsVersionView'
      type: object
    FinanceMetaView:
      description: >-
        Context of a finance response: calculation time, the effective scope,
        currency and month range, and the finding counts.
      properties:
        asOf:
          description: >-
            When the figures were last calculated (ISO 8601). Null when no
            calculation exists yet.
          type: string
          format: date-time
          nullable: true
        buildId:
          description: >-
            Id of the calculation the figures come from. Null when no
            calculation exists yet.
          type: string
          nullable: true
        scope:
          description: >-
            Effective movement scope: the level on which new, expansion,
            contraction, lost and resurrecting are classified.
          type: string
          enum:
            - subscription
            - invoice_address
            - customer
            - organisation
          example: invoice_address
        currency:
          description: >-
            Effective currency (ISO-4217). Amounts are never converted between
            currencies.
          type: string
          example: EUR
        from:
          description: First month of the range (YYYY-MM, time zone of the organisation).
          type: string
          example: 2025-10
        to:
          description: Last month of the range (YYYY-MM, time zone of the organisation).
          type: string
          example: 2026-09
        findings:
          description: Number of data-quality findings of the calculation.
          allOf:
            - $ref: '#/components/schemas/FindingCountsView'
        filtersNotApplied:
          description: >-
            Datasets of this response that ignore the customer, product or
            segment filter because the underlying facts have no such dimension
            (for example receivables at past month ends).
          type: array
          items:
            type: string
        notSnapshotted:
          description: >-
            MRR table rows a month-end snapshot does not hold (invoice, cash and
            forecast figures). In the snapshot view they keep their current
            values. Empty when the range has no snapshot or a segment is
            applied.
          type: array
          items:
            type: string
          example:
            - one_off
            - accounted_mrr
            - cash_collected
        projectedFrom:
          description: >-
            First month of the range after the current one (YYYY-MM): from there
            the month-end stocks (open receivables, amounts owed to customers)
            carry today's open invoices forward, a projection as of today
            ("Prognose (Stand heute)"), not a fact. Null when the range ends in
            or before the current month.
          type: string
          example: 2026-10
          nullable: true
        forecast:
          description: >-
            Completeness of the invoice forecast ("Rechnungsprognose") in the
            range: `incomplete` with the number of subscriptions whose forecast
            failed. The forecast rows then show what the other subscriptions
            bring; they are marked "unvollständig", never read as 0.
          allOf:
            - $ref: '#/components/schemas/ForecastStatusView'
        build:
          description: >-
            The latest calculation attempt, also when it failed ("Berechnung
            abgebrochen"). Null when the organisation was never calculated.
          nullable: true
          allOf:
            - $ref: '#/components/schemas/BuildAttemptView'
        dataBuildId:
          description: >-
            Id of the calculation the figures come from (the last successful
            one). Differs from `build.buildId` when the latest attempt failed.
            Null when no calculation exists yet.
          type: string
          nullable: true
      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
    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
    KpiTileView:
      description: >-
        One key figure tile: value of `asOfMonth`, change to the previous month
        and up to twelve points of history.
      properties:
        id:
          description: >-
            Stable id of the figure (`mrr`, `arr`, `accounted_mrr`, `net_new`,
            `quick_ratio`, `active`, `arpa`, `nrr`, `grr`, `net_cash`,
            `outstanding`, `overdue`, `dso`, `dso_12m`).
          type: string
          example: mrr
        title:
          description: German title.
          type: string
          example: MRR
        valueKind:
          description: >-
            How to format the value and the change: `money`, `rate` (0.125000 =
            12.5 %), `ratio`, `count`, `days`.
          type: string
          enum:
            - money
            - rate
            - ratio
            - count
            - days
        value:
          description: >-
            The value as an exact decimal string; null when it cannot be
            computed.
          type: string
          example: '12500.00'
          nullable: true
        delta:
          description: >-
            Change to the previous month in the same unit (for rates: the
            difference of the rates); null without a comparison.
          type: string
          example: '250.00'
          nullable: true
        better:
          description: Which direction is favourable.
          type: string
          enum:
            - up
            - down
        sparkline:
          description: Up to twelve values, oldest first, ending with the value.
          type: array
          items:
            type: string
            nullable: true
        caption:
          description: >-
            Reference shown under the value (`im Zeitraum`, `heute`); null when
            the value is the month at the end of the range.
          type: string
          nullable: true
        asOfMonth:
          description: >-
            Month the value belongs to (YYYY-MM): the month at the end of its
            series; for `heute` tiles the running month. On the recurring page
            the tiles show the last COMPLETE month by default and carry the
            running month in `current`.
          type: string
          example: 2026-08
          nullable: true
        monthComplete:
          description: >-
            False when `asOfMonth` is the running month (or later): the value is
            not final ("laufend"). True for an ended month.
          type: boolean
          example: true
          nullable: true
        current:
          description: >-
            The running month next to a tile that shows the last complete month
            (recurring page); null otherwise.
          nullable: true
          allOf:
            - $ref: '#/components/schemas/KpiCurrentView'
      type: object
    MovementMonthView:
      description: MRR bridge of one month with its reasons.
      properties:
        month:
          description: Month (YYYY-MM).
          type: string
          example: 2026-08
        bop:
          description: MRR at the start of the month.
          type: string
          example: '12000.00'
        eop:
          description: MRR at the end of the month.
          type: string
          example: '12500.00'
        steps:
          description: The five movements in bridge order.
          type: array
          items:
            $ref: '#/components/schemas/BridgeStepView'
        reasons:
          description: Reason split of the movements (non-zero entries only).
          type: array
          items:
            $ref: '#/components/schemas/ReasonEntryView'
        snapshotBop:
          description: >-
            MRR at the end of the previous month as its month-end snapshot
            reported it; null when that month has no snapshot or nothing changed
            since. Then `snapshotBop` + Σ `corrections` = `bop`.
          type: string
          example: '12100.00'
          nullable: true
        corrections:
          description: >-
            Changes to the previous month found after its snapshot, per cause (a
            subscription voided after the snapshot is `voided`, "Annulliert"):
            the bridge runs `snapshotBop` + corrections = `bop`, + steps =
            `eop`. Empty without a snapshot or change.
          type: array
          items:
            $ref: '#/components/schemas/BridgeCorrectionView'
      type: object
    BacklogView:
      description: >-
        Contractually committed MRR as of the current month and the known MRR of
        the next twelve months.
      properties:
        asOfMonth:
          description: The month the figures refer to (YYYY-MM).
          type: string
          example: 2026-09
        committed:
          description: Σ MRR × remaining fixed contract months.
          type: string
          example: '54000.00'
        averageRemainingMonths:
          description: >-
            Average remaining fixed term in months, weighted with MRR (one
            decimal).
          type: string
          example: '4.3'
        accounts:
          description: Paying accounts with a fixed remaining term.
          type: integer
          example: 42
        buckets:
          description: Committed amount by remaining term.
          type: array
          items:
            $ref: '#/components/schemas/BacklogBucketView'
        forward:
          description: >-
            First point: MRR at the end of `asOfMonth`; then the twelve
            following months.
          type: array
          items:
            $ref: '#/components/schemas/ForwardPointView'
        events:
          description: Known changes of the following months.
          type: array
          items:
            $ref: '#/components/schemas/BacklogEventView'
      type: object
    RestatementMarkerView:
      description: How far the current value of a cell differs from its month-end snapshot.
      properties:
        delta:
          description: Current value minus snapshot value.
          type: string
          example: '-100.00'
        accounts:
          description: Accounts whose MRR at month end changed since the snapshot.
          type: integer
          example: 1
        cause:
          description: >-
            Main cause: `voided`, `pause_changed`, `segment_added`,
            `segment_removed`, `contract_end_changed`, `price_history_changed`,
            `quantity_changed`, `discount_changed`, `source_repair`.
          type: string
          nullable: true
        causeLabel:
          description: German label of `cause`.
          type: string
          example: Vertragsende geändert
          nullable: true
      type: object
    MetricDefinitionView:
      description: One entry of the definitions catalogue.
      properties:
        id:
          description: Stable id.
          type: string
          example: nrr
        title:
          description: German title.
          type: string
          example: NRR 12 Monate
        definition:
          description: German definition.
          type: string
        formula:
          description: Formula.
          type: string
      type: object
    MetricDefinitionsVersionView:
      description: One version of the definitions catalogue in the changelog.
      properties:
        version:
          description: Catalogue version.
          type: string
          example: v2
        validFrom:
          description: Date from which the version applies (YYYY-MM-DD).
          type: string
          example: '2026-09-28'
        changes:
          description: >-
            The definitions whose meaning changed with this version (empty for
            the first version).
          type: array
          items:
            $ref: '#/components/schemas/MetricDefinitionChangeView'
      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
    ForecastStatusView:
      description: >-
        Whether the invoice forecast of the range is complete: the billing
        forecast of a subscription can fail (finding `FORECAST_FAILED`), and
        that subscription is then missing from every forecast month. A forecast
        cell of an incomplete forecast is a lower bound, never "no invoices".
      properties:
        incomplete:
          description: >-
            True when the forecast of at least one subscription failed and the
            range contains forecast months (the current month or later).
          type: boolean
          example: false
        failedSubscriptions:
          description: >-
            Number of subscriptions whose billing forecast failed (0 when
            complete).
          type: integer
          example: 0
      type: object
    BuildAttemptView:
      description: >-
        The latest calculation attempt. When it failed, the figures still come
        from the last successful calculation (`meta.dataBuildId`, `meta.asOf`).
      properties:
        status:
          description: >-
            Outcome of the attempt: `succeeded`, or `failed` when it broke a
            consistency check and was cancelled (nothing of it was stored).
          type: string
          enum:
            - succeeded
            - failed
          example: failed
        builtAt:
          description: When the attempt started (ISO 8601).
          type: string
          format: date-time
        buildId:
          description: Id of the attempt. Equal to `meta.dataBuildId` when it succeeded.
          type: string
        failed:
          description: The broken checks; null unless `status` is `failed`.
          nullable: true
          allOf:
            - $ref: '#/components/schemas/BuildFailureView'
      type: object
    KpiCurrentView:
      description: >-
        The running month of a key figure tile whose value shows the last
        complete month: the value so far and its change to the previous month.
      properties:
        asOfMonth:
          description: Month of the value (YYYY-MM), the running month.
          type: string
          example: 2026-09
        value:
          description: >-
            The value so far as an exact decimal string (unit as the tile); null
            when it cannot be computed.
          type: string
          example: '5279.33'
          nullable: true
        delta:
          description: >-
            Change to the previous month in the tile's unit; null where the tile
            compares complete months only (Accounted MRR) or without a
            comparison.
          type: string
          example: '1916.00'
          nullable: true
        monthComplete:
          description: 'Always false: the month has not ended.'
          type: boolean
          example: false
      type: object
    BridgeStepView:
      description: One step of the MRR bridge of a month.
      properties:
        key:
          description: 'Movement: `new`, `expansion`, `resurrecting`, `contraction`, `lost`.'
          type: string
          enum:
            - new
            - expansion
            - resurrecting
            - contraction
            - lost
        value:
          description: 'Amount with display sign: contraction and lost are negative.'
          type: string
          example: '-120.00'
        accounts:
          description: Accounts with this movement.
          type: integer
          example: 3
      type: object
    ReasonEntryView:
      description: Amount of one movement reason in a month.
      properties:
        movement:
          description: Movement the reason belongs to.
          type: string
          enum:
            - new
            - expansion
            - resurrecting
            - contraction
            - lost
        reason:
          description: >-
            Reason (`contract_start`, `price_change`, `quantity_change`,
            `discount_start`, `pause`, `contract_end`, `voided`, …).
          type: string
          example: price_change
        amount:
          description: Signed amount (decreases negative).
          type: string
          example: '45.00'
        accounts:
          description: Accounts of the movement whose change carries this reason.
          type: integer
          example: 2
        label:
          description: >-
            German name of the reason, the same as in the MRR table's "davon"
            rows (`reasonLabels`).
          type: string
          example: Preisänderung
      type: object
    BridgeCorrectionView:
      description: >-
        A correction of the bridge: a change to the previous month found after
        its month-end snapshot, per cause (e.g. `voided`, "Annulliert").
      properties:
        key:
          description: Restatement cause.
          type: string
          enum:
            - voided
            - pause_changed
            - segment_added
            - segment_removed
            - contract_end_changed
            - price_history_changed
            - quantity_changed
            - discount_changed
            - source_repair
        label:
          description: German name of the cause, the same as on the restatement rows.
          type: string
          example: Annulliert
        value:
          description: >-
            Signed amount: the change of the previous month's MRR at its end
            since the snapshot.
          type: string
          example: '-100.00'
      type: object
    BacklogBucketView:
      description: Committed MRR of the accounts in one band of remaining fixed term.
      properties:
        key:
          description: 'Band: `lt3` (under 3 months), `3to6`, `6to12` (up to 12), `gt12`.'
          type: string
          enum:
            - lt3
            - 3to6
            - 6to12
            - gt12
        amount:
          description: Committed amount (MRR × remaining months).
          type: string
          example: '4500.00'
      type: object
    ForwardPointView:
      description: Known MRR at the end of one month.
      properties:
        month:
          description: Month (YYYY-MM).
          type: string
          example: 2026-10
        mrr:
          description: MRR at the end of the month from the contract data known today.
          type: string
          example: '12400.00'
      type: object
    BacklogEventView:
      description: A known future change of MRR.
      properties:
        id:
          description: Stable id of the event line.
          type: string
          example: end:2026-11:0199c0de-0000-7000-8000-000000000001
        month:
          description: Month of the change (YYYY-MM).
          type: string
          example: 2026-11
        kind:
          description: >-
            `end` (contract end), `price` (price change, summed per month and
            product), `discount_end`, `ramp` (planned contract change),
            `trial_end`, `start` (planned start), `other`.
          type: string
          enum:
            - end
            - price
            - discount_end
            - ramp
            - trial_end
            - start
            - other
        customer:
          description: Customer of the account; null for summed price changes.
          nullable: true
          allOf:
            - $ref: '#/components/schemas/RefView'
        accounts:
          description: Affected accounts.
          type: integer
          example: 1
        product:
          description: Product of a price change; null otherwise.
          type: string
          nullable: true
        amount:
          description: Effect on MRR, signed.
          type: string
          example: '-99.00'
        cancellationReason:
          description: >-
            Cancellation reason code of a contract end; null otherwise or
            without a reason.
          type: string
          nullable: true
      type: object
    MetricDefinitionChangeView:
      description: One changed definition of a catalogue version.
      properties:
        id:
          description: Id of the definition.
          type: string
          example: dso_3m
        change:
          description: What changed (German).
          type: string
      type: object
    BuildFailureView:
      description: >-
        Why the latest calculation was cancelled: the consistency checks it
        broke. The rows are listed by the details metric `build_failure`.
      properties:
        invariants:
          description: >-
            Codes of the broken checks (sorted), e.g. `CASH_WITHIN_DOCUMENT`;
            `IDENTITY` for the MRR identity.
          type: array
          items:
            type: string
          example:
            - CASH_WITHIN_DOCUMENT
        rowCount:
          description: >-
            Number of rows that broke a check (complete, also above the listed
            rows).
          type: integer
          example: 5
        invoiceRowCount:
          description: >-
            Number of the listed rows that name an invoice. Equal to `rowCount`
            when every row is an invoice.
          type: integer
          example: 5
      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
  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.

````