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

# Analyze the flow impact of error flavours

> Compares completion for engaged real-user flows affected by the selected error flavours with
all engaged real-user flows of the same types and date range. The baseline includes affected flows.
Engagement requires a subflow, nested flow or resolved decision, matching the time-series
`engagement=engaged` filter. Results show correlation, not causation; flows may carry other errors.

Each group includes up to `flowLimit` flows, newest first (default 5,000; maximum 50,000).
When capped, `sampled: true` means all reported metrics use that sample. `analyzedFlowLimit`
reports the applied cap; `flowListID` identifies the exact analyzed flows.

The baseline `completionRate` weights rates by the affected group's `osName`/`browserName` mix.
`rawCompletionRate` reports the unweighted baseline rate.

Outcomes `skipped`, `invisible` and `visible-auto-skip` count as `other` and are excluded from
completion rates. Occurrences without flows are reported as orphans and excluded from rates.
`baseline` is absent when no comparable engaged flows exist.

Use naive UTC datetimes (`YYYY-MM-DDTHH:mm:ss`) for the half-open interval [fromDate, toDate),
with a maximum range of 30 days.

Required API key permission: `observe:errorFlavours:read`.



## OpenAPI

````yaml /api-reference/openapi/observe.yaml post /observe/errorFlavours/impact
openapi: 3.1.1
info:
  version: 1.0.0
  title: Corbado API
  description: >
    # Introduction

    This documentation gives an overview of all Corbado API calls to implement
    authentication observe.
  contact:
    name: Corbado team
    email: support@corbado.com
    url: https://www.corbado.com
servers:
  - url: https://api.cloud.corbado.io/v1
security:
  - bearerAuth: []
tags:
  - name: ObserveFlow
    description: Flow search and related APIs
    x-group: Journeys and users
  - name: ObserveSubFlow
    description: Subflow search and related APIs
    x-group: Journeys and users
  - name: ObserveUser
    description: User search and related APIs
    x-group: Journeys and users
  - name: ObserveClientEnv
    description: Client environment search APIs
    x-group: Journeys and users
  - name: ObserveTimeSeries
    description: Time series query APIs
    x-group: Metrics and funnels
  - name: ObserveFunnel
    description: Historical funnel metrics, dictionaries and coverage.
    x-group: Metrics and funnels
  - name: ObserveEvent
    description: Event ingestion and event feed APIs
    x-group: Events
  - name: ObserveError
    description: Named authentication errors and recommendations.
    x-group: Error management
  - name: ObserveErrorFlavour
    description: Error variants and their impact on authentication outcomes.
    x-group: Error management
  - name: ObserveAlert
    description: Authentication alert rules, instances and history.
    x-group: Alert management
  - name: ObserveAnnotation
    description: Annotation APIs (dated notes for analytics context)
    x-group: Annotations
  - name: ObserveTableExport
    description: Table export file listing and download APIs
    x-group: Data exports
  - name: ObserveTimeSeriesExport
    description: Time-series export generation and downloads.
    x-group: Data exports
  - name: ObserveDataExport
    description: Data export APIs
    x-group: User data
  - name: ObserveDataDeletionJob
    description: Data deletion job APIs
    x-group: User data
  - name: ObserveFlowTypeDefinition
    description: Flow type definitions used in authentication journeys.
    x-group: Catalogs and labels
  - name: ObserveCatalog
    description: Catalog APIs
    x-group: Catalogs and labels
  - name: OpenAPI
    description: Downloadable API specification
  - name: ProjectOperationExecution
    description: Project-scoped operation history and pipeline health
  - name: ObserveClassification
    description: Flow and subflow classification APIs
  - name: ObserveIntegrationStats
    description: Integration stats APIs
  - name: ObserveTimeSeriesPrecalculation
    description: Time series precalculation APIs
  - name: ObserveIDList
    x-group: Saved ID lists
    description: Stored ID-list selection APIs
  - name: ObserveDataContext
    description: Schema-loose data context APIs for agent and debugging tooling
  - name: ObserveData
    description: Observe data administration APIs
  - name: ObserveTrackingStats
    description: Tracking ingestion stats APIs
  - name: ObserveExperiment
    x-group: Experiments
    description: Experiment catalog and run APIs
  - name: ObserveDataPolicy
    description: >-
      Project data policy catalogue (retention selected by the SDK's
      meta.dataPolicy code)
  - name: ObserveMetadata
    x-group: Metadata
    description: Authenticator metadata APIs (FIDO MDS + passkey AAGUID)
  - name: ObservePasskey
    x-group: Passkey analysis
    description: Observed passkey search and cohort analysis.
paths:
  /observe/errorFlavours/impact:
    post:
      tags:
        - ObserveErrorFlavour
      summary: Analyze the flow impact of error flavours
      description: >-
        Compares completion for engaged real-user flows affected by the selected
        error flavours with

        all engaged real-user flows of the same types and date range. The
        baseline includes affected flows.

        Engagement requires a subflow, nested flow or resolved decision,
        matching the time-series

        `engagement=engaged` filter. Results show correlation, not causation;
        flows may carry other errors.


        Each group includes up to `flowLimit` flows, newest first (default
        5,000; maximum 50,000).

        When capped, `sampled: true` means all reported metrics use that sample.
        `analyzedFlowLimit`

        reports the applied cap; `flowListID` identifies the exact analyzed
        flows.


        The baseline `completionRate` weights rates by the affected group's
        `osName`/`browserName` mix.

        `rawCompletionRate` reports the unweighted baseline rate.


        Outcomes `skipped`, `invisible` and `visible-auto-skip` count as `other`
        and are excluded from

        completion rates. Occurrences without flows are reported as orphans and
        excluded from rates.

        `baseline` is absent when no comparable engaged flows exist.


        Use naive UTC datetimes (`YYYY-MM-DDTHH:mm:ss`) for the half-open
        interval [fromDate, toDate),

        with a maximum range of 30 days.


        Required API key permission: `observe:errorFlavours:read`.
      operationId: ObserveErrorFlavourImpact
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/observeErrorFlavourImpactReq'
      responses:
        '200':
          description: Impact analysis for the given flavours and range.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/observeErrorFlavourImpactRsp'
        default:
          $ref: '#/components/responses/error'
      security:
        - bearerAuth:
            - observe:errorFlavours:read
components:
  schemas:
    observeErrorFlavourImpactReq:
      type: object
      required:
        - flavourIDs
        - fromDate
        - toDate
      properties:
        flavourIDs:
          type: array
          minItems: 1
          maxItems: 1000
          items:
            type: string
            x-oapi-codegen-extra-tags:
              validate: required,id=erf
          description: >-
            Flavour IDs to analyze together (format `erf-<number>`), e.g. an
            error's member flavours.
          x-oapi-codegen-extra-tags:
            validate: required,min=1,max=1000,dive
        fromDate:
          type: string
          description: Range start, naive UTC datetime (inclusive).
          example: '2026-08-01T00:00:00'
          x-oapi-codegen-extra-tags:
            validate: required,datetime=2006-01-02T15:04:05
        toDate:
          type: string
          description: Range end, naive UTC datetime (exclusive).
          example: '2026-08-08T00:00:00'
          x-oapi-codegen-extra-tags:
            validate: required,datetime=2006-01-02T15:04:05
        flowLimit:
          type: integer
          minimum: 1
          maximum: 50000
          description: >-
            Maximum number of flows to analyze PER GROUP (affected and
            baseline). Both groups are read as raw flow rows, so this is what
            bounds the analysis; a group that hits the limit is marked `sampled`
            and describes the most recent `flowLimit` flows of that group.
            Defaults to 5000. High values buy completeness (fewer sampled
            groups, so per-user tallies see a user's whole history in range) at
            the cost of a slower analysis.
          example: 5000
          x-oapi-codegen-extra-tags:
            validate: omitempty,min=1,max=50000
        baselineFlowListID:
          type: string
          description: >-
            Optional stored ID list (format `idl-<number>`, from POST
            /observe/idLists or a previous analysis) to

            use verbatim as the baseline group instead of building one. The
            listed flows are read as raw rows

            (capped at `flowLimit`, most recent first) and compared against the
            affected group with the usual

            device-mix standardization; `matching` is ignored when this is set.
          x-oapi-codegen-extra-tags:
            validate: omitempty,id=idl
        matching:
          $ref: '#/components/schemas/observeErrorImpactMatching'
        errorID:
          type: string
          description: >-
            The curated error whose impact is being analyzed (format
            `err-<number>`). When set, the flavourIDs must

            be exactly the error's current member flavours, and the analysis
            result is stored on the error as its

            last-known impact (served as `lastImpact` in the errors list). Omit
            for ad-hoc flavour analyses, which

            are never stored.
          x-oapi-codegen-extra-tags:
            validate: omitempty,id=err
    observeErrorFlavourImpactRsp:
      type: object
      required:
        - affected
        - occurrenceCount
        - orphanOccurrenceCount
      properties:
        affected:
          $ref: '#/components/schemas/observeErrorImpactFlowGroup'
        baseline:
          $ref: '#/components/schemas/observeErrorImpactFlowGroup'
        completionLift:
          type: number
          format: double
          description: >-
            affected.completionRate minus baseline.completionRate (percentage
            points as a fraction, negative = affected flows complete less).
            Absent when either side has no completion rate.
        occurrenceCount:
          type: integer
          format: int64
          description: Occurrences of the given flavours on real-user flows in range.
        orphanOccurrenceCount:
          type: integer
          format: int64
          description: >-
            Occurrences in range without an attached flow (inferred / never
            attached); excluded from all rates.
        occurrencesPerFlowAvg:
          type: number
          format: double
          description: >-
            Average occurrences per affected flow (occurrenceCount /
            affected.flowCount). Absent when no flows are affected.
        affectedUserCount:
          type: integer
          format: int64
          description: >-
            Distinct users among affected flows (flows without a user reference
            contribute none). Absent when no flows are affected.
        repeatUserCount:
          type: integer
          format: int64
          description: >-
            Distinct users who hit the analyzed flavours MORE THAN ONCE in
            range, i.e. at least two occurrences — whether spread over several
            flows or fired twice within one flow. Subset of `affectedUserCount`;
            flows without a user reference contribute none. Absent when no flows
            are affected. Computed over the analyzed flows, so on a `sampled`
            affected group it is a lower bound (a user's earlier flows may fall
            outside the sample).
        repeatUserOccurrenceCount:
          type: integer
          format: int64
          description: >-
            Occurrences on the repeat users' flows — how much of
            `occurrenceCount` is concentrated on users who keep hitting this.
        repeatUserFlowCount:
          type: integer
          format: int64
          description: >-
            Affected flows belonging to the repeat users, i.e. the size of the
            cohort behind `repeatUserFlowListID`.
        repeatUserFlowListID:
          type: string
          description: >-
            Handle of a stored ID list (format `idl-<number>`) holding the
            affected flows of the repeat users, for

            opening exactly those high-impact users in user search. Empty when
            no user hit the flavours more than

            once.
        userExposure:
          type: array
          items:
            $ref: '#/components/schemas/observeErrorImpactUserBucket'
          description: >-
            The distribution behind `repeatUserCount`: the affected users
            grouped into occurrence bands (1, 2, 3-4, 5-9, 10+), ascending,
            empty bands omitted. Every band above the first is made of repeat
            users, so their user counts sum to `repeatUserCount` and all bands
            together to `affectedUserCount`. Same sampling caveat as
            `repeatUserCount` — on a `sampled` affected group users shift toward
            the lower bands.
        unattributedFlows:
          $ref: '#/components/schemas/observeErrorImpactUnattributedFlows'
        terminalIncompleteFlowCount:
          type: integer
          format: int64
          description: >-
            Incomplete affected flows whose last occurrence of the analyzed
            flavours fell within 10 seconds of the flow's end - the error was
            (close to) the last thing that happened. Absent when no flows are
            affected.
        analyzedFlowLimit:
          type: integer
          format: int64
          description: >-
            The per-group flow cap the analysis ran with (the request's
            `flowLimit`, or the default). Together with each group's `sampled`
            flag it tells a caller whether raising the limit would change the
            numbers.
        matchingReport:
          $ref: '#/components/schemas/observeErrorImpactMatchingReport'
        perFlowType:
          type: array
          maxItems: 1000
          items:
            $ref: '#/components/schemas/observeErrorImpactFlowTypeImpact'
          description: >-
            The completion comparison split per flow type of the affected group,
            biggest affected slice first. The group-level `completionLift` is a
            weighted mean over these; when the per-type lifts diverge (different
            sign, or a large spread), the blended number hides differently-hurt
            flow types and a caller should present this cut instead. Empty when
            no flows are affected.
        subflowCompletion:
          $ref: '#/components/schemas/observeErrorImpactSubflowCompletion'
    observeErrorImpactMatching:
      type: object
      description: >-
        Baseline modeling configuration. When present, the baseline is not "all
        engaged flows of the affected flow types" but a stratified sample
        matched to the affected group on the requested dimensions — controlling
        for WHERE in the flow the error happened (pathPrefix) and for the
        population mix, so the completion comparison isolates the error instead
        of the route that leads to it. The response's `matchingReport` describes
        the strata, the achieved balance, and every fallback taken.
      properties:
        dimensions:
          type: array
          description: >-
            Dimensions to match the baseline on. `pathPrefix` is the flow's
            coarse route up to (and including the code of) the erroring subflow,
            derived from long_path — it requires the project to have
            error-flavour embedding enabled (observeClassificationConfig);
            without embedded data the analysis degrades to the remaining
            dimensions and reports `prefixesUnavailable`. Defaults to
            [pathPrefix, osName, browserName].
          items:
            type: string
            enum:
              - pathPrefix
              - osName
              - browserName
              - touchpoint
              - applicationID
          x-oapi-codegen-extra-tags:
            validate: >-
              omitempty,min=1,max=5,dive,oneof=pathPrefix osName browserName
              touchpoint applicationID
        prefixMode:
          type: string
          enum:
            - code
            - raw
          description: >-
            Prefix coarsening. `code` (default) reduces every segment to its
            kind and code (s_pr-id|d_1|s_pk-lo), so routes match regardless of
            variant detail; `raw` matches the exact long_path prefix including
            variant aliases — far more strata, only useful on very high-volume
            flows.
          x-oapi-codegen-extra-tags:
            validate: omitempty,oneof=code raw
        ratio:
          type: integer
          minimum: 1
          maximum: 10
          description: >-
            Baseline sample size per stratum as a multiple of the stratum's
            affected flows. Defaults to 3.
          x-oapi-codegen-extra-tags:
            validate: omitempty,min=1,max=10
        coverage:
          type: number
          minimum: 0.5
          maximum: 1
          description: >-
            Share of affected flows the kept top prefixes must cover; the long
            tail of rarer prefixes is matched without the prefix dimension and
            reported as `uncoveredPrefixShare`. Defaults to 0.9.
          x-oapi-codegen-extra-tags:
            validate: omitempty,min=0.5,max=1
        minCellSize:
          type: integer
          minimum: 1
          maximum: 1000
          description: >-
            Minimum baseline candidates a stratum needs before it falls back to
            a coarser match (prefix dropped first, then the extra dimensions,
            down to env-only). Defaults to 20.
          x-oapi-codegen-extra-tags:
            validate: omitempty,min=1,max=1000
    observeErrorImpactFlowGroup:
      type: object
      required:
        - flowCount
        - completeCount
        - incompleteCount
        - otherCount
      properties:
        flowCount:
          type: integer
          format: int64
          description: Distinct flows in the group.
        completeCount:
          type: integer
          format: int64
          description: Flows with outcome `complete`.
        incompleteCount:
          type: integer
          format: int64
          description: Flows with outcome `incomplete`.
        otherCount:
          type: integer
          format: int64
          description: >-
            Flows with any other outcome (`skipped`, `invisible`,
            `visible-auto-skip`); excluded from completion rates.
        completionRate:
          type: number
          format: double
          description: >-
            completeCount / (completeCount + incompleteCount). For the baseline
            group this is standardized to the affected group's (osName,
            browserName) mix. Absent when no attempts-outcome flows exist.
        rawCompletionRate:
          type: number
          format: double
          description: >-
            Baseline only — unweighted completion rate of the whole population,
            for transparency next to the mix-weighted completionRate.
        envMix:
          type: array
          maxItems: 1000
          description: >-
            Per-(osName, browserName) cells of the group. Empty dimension values
            mean unknown.
          items:
            $ref: '#/components/schemas/observeErrorImpactEnvCell'
        flowTypes:
          type: array
          maxItems: 1000
          description: >-
            Which flow types the group's analyzed flows belong to, biggest
            first. On the affected group this is also what the baseline was
            drawn from. A funnel diagram renders exactly one flow type, so a
            caller offering to open these flows in the funnel needs this list to
            know which funnel(s) apply.
          items:
            $ref: '#/components/schemas/observeErrorImpactFlowTypeCell'
        sampled:
          type: boolean
          description: >-
            True when the group hit `flowLimit`, i.e. every number describing it
            was computed over the most recent `flowLimit` flows of the group
            rather than its whole population.
        completedDurationP25Ms:
          type: integer
          format: int64
          description: >-
            25th percentile flow duration in milliseconds, over COMPLETED flows
            only (an incomplete flow's duration is time-until-abandonment, a
            different quantity). Absent when the group has no completed flows.
        completedDurationP50Ms:
          type: integer
          format: int64
          description: Median flow duration in milliseconds, over completed flows only.
        completedDurationP90Ms:
          type: integer
          format: int64
          description: >-
            90th percentile flow duration in milliseconds, over completed flows
            only.
        completedFlowsMeasured:
          type: integer
          format: int64
          description: How many completed flows the duration percentiles rest on.
        flowListID:
          type: string
          description: >-
            Handle of a stored ID list (format `idl-<number>`) holding exactly
            the analyzed flows of this group, for

            opening them in user search. Empty when the group is empty.
    observeErrorImpactUserBucket:
      type: object
      required:
        - minOccurrences
        - userCount
        - flowCount
        - occurrenceCount
      properties:
        minOccurrences:
          type: integer
          format: int64
          description: Lowest occurrence count in this band (inclusive).
        maxOccurrences:
          type: integer
          format: int64
          description: >-
            Highest occurrence count in this band (inclusive). Absent on the
            open-ended top band.
        userCount:
          type: integer
          format: int64
          description: Distinct users whose occurrence count falls into this band.
        flowCount:
          type: integer
          format: int64
          description: >-
            Affected flows belonging to those users - the size of the cohort
            behind `flowListID`.
        occurrenceCount:
          type: integer
          format: int64
          description: >-
            Occurrences on this band's flows, i.e. how much of `occurrenceCount`
            sits on these users.
        attemptCount:
          type: integer
          format: int64
          description: >-
            This band's flows that completed or were abandoned - the denominator
            of `completionRate`.
        completionRate:
          type: number
          format: double
          description: >-
            Share of this band's attempts that completed. Read against the
            affected group's own rate it says whether being hit repeatedly goes
            with giving up. Absent when the band has no attempts-outcome flows.
        flowListID:
          type: string
          description: >-
            Handle of a stored ID list (format `idl-<number>`) holding this
            band's flows, for opening exactly these

            users in user search. Empty when the list could not be stored.
    observeErrorImpactUnattributedFlows:
      type: object
      required:
        - flowCount
        - occurrenceCount
      properties:
        flowCount:
          type: integer
          format: int64
          description: Affected flows without a user reference.
        occurrenceCount:
          type: integer
          format: int64
          description: Occurrences on those flows.
        attemptCount:
          type: integer
          format: int64
          description: >-
            Those flows that completed or were abandoned - the denominator of
            `completionRate`.
        completionRate:
          type: number
          format: double
          description: >-
            Share of those attempts that completed. Absent when none has an
            attempts outcome.
        flowListID:
          type: string
          description: >-
            Handle of a stored ID list (format `idl-<number>`) holding these
            flows, for opening them in user search.

            Empty when the list could not be stored.
    observeErrorImpactMatchingReport:
      type: object
      description: >-
        How the baseline group was modeled and how well it mirrors the affected
        group. Present when the request asked for `matching` or supplied
        `baselineFlowListID`; absent on a plain (unmatched) analysis.
      required:
        - mode
        - dimensions
        - prefixesUnavailable
        - matchRate
        - uncoveredPrefixShare
        - collapsedStrataCount
      properties:
        mode:
          type: string
          enum:
            - matched
            - env-only
            - provided-list
          description: >-
            `matched` = stratified matching ran as requested; `env-only` = the
            pathPrefix dimension was requested but no affected flow carried
            embedded error flavours in its long_path, so matching fell back to
            the remaining dimensions; `provided-list` = the caller supplied
            `baselineFlowListID` and no modeling ran.
        dimensions:
          type: array
          items:
            type: string
          description: The dimensions matching actually ran on (after any degradation).
        prefixesUnavailable:
          type: boolean
          description: >-
            True when pathPrefix was requested but could not be derived for any
            affected flow (the project has no embedded error flavours in
            long_path for the analyzed range).
        matchRate:
          type: number
          format: double
          description: >-
            Share of affected flows whose stratum found at least one baseline
            candidate (at any collapse level).
        uncoveredPrefixShare:
          type: number
          format: double
          description: >-
            Share of affected flows whose prefix fell outside the kept top
            prefixes (see the request's `coverage`); they are matched without
            the prefix dimension.
        collapsedStrataCount:
          type: integer
          description: >-
            Number of strata that fell back to a coarser match because they had
            fewer than `minCellSize` baseline candidates.
        strata:
          type: array
          items:
            $ref: '#/components/schemas/observeErrorImpactMatchingStratum'
          description: >-
            The largest strata by affected flows (capped at 50), for inspecting
            what the baseline was matched on.
        balance:
          type: array
          items:
            $ref: '#/components/schemas/observeErrorImpactBalanceCell'
          description: >-
            Per-dimension balance between the affected group and the baseline:
            total-variation distance (0 = identical distributions, 1 = disjoint)
            before matching (against all candidates) and after (against the
            sampled baseline). After-values near 0 mean the baseline mirrors the
            affected group on that dimension.
    observeErrorImpactFlowTypeImpact:
      type: object
      description: >-
        One flow type's slice of the impact comparison: the affected flows of
        this type against the baseline flows of the SAME type (flow type is a
        hard block variable of the baseline — see
        `matchingReport.strata[].flowType`), with the baseline rate standardized
        to this type's own affected OS/browser mix.
      required:
        - flowType
        - affectedFlowCount
        - affectedAttemptCount
        - baselineFlowCount
        - baselineAttemptCount
      properties:
        flowType:
          type: string
          description: >-
            Flow type name (`login`, `signup`, ...); empty for flows that carry
            no type.
        affectedFlowCount:
          type: integer
          format: int64
          description: Affected flows of this type.
        affectedAttemptCount:
          type: integer
          format: int64
          description: >-
            Affected flows of this type that completed or were abandoned — the
            denominator of `affectedCompletionRate`, and what says whether the
            row rests on anything.
        affectedCompletionRate:
          type: number
          format: double
          description: >-
            Completion rate of the affected flows of this type. Absent when none
            has an attempts outcome.
        affectedCompletedDurationP50Ms:
          type: integer
          format: int64
          description: >-
            Median duration of COMPLETED affected flows of this type, in
            milliseconds. Absent when none completed.
        affectedCompletedFlowsMeasured:
          type: integer
          format: int64
          description: How many completed affected flows that median rests on.
        baselineFlowCount:
          type: integer
          format: int64
          description: Baseline flows of this type.
        baselineAttemptCount:
          type: integer
          format: int64
          description: Baseline flows of this type with an attempts outcome.
        baselineCompletionRate:
          type: number
          format: double
          description: >-
            Baseline completion rate within this type, standardized to the
            type's affected OS/browser mix. Absent when no env cell is
            comparable.
        baselineCompletedDurationP50Ms:
          type: integer
          format: int64
          description: >-
            Median duration of completed baseline flows of this type, in
            milliseconds.
        baselineCompletedFlowsMeasured:
          type: integer
          format: int64
          description: How many completed baseline flows that median rests on.
        completionLift:
          type: number
          format: double
          description: >-
            affectedCompletionRate minus baselineCompletionRate within this
            type. Absent when either side has no rate.
    observeErrorImpactSubflowCompletion:
      type: object
      description: >-
        How the ERRORING SUBFLOW itself ended on both sides — did this step
        succeed, as opposed to `completionLift`'s did the whole flow succeed
        (possibly via a fallback). The affected side measures the segment the
        analyzed flavours fired on (falling back to the flow's first segment of
        the subflow's code when embedding does not locate it); the baseline side
        the first segment of the same code, so flows that never attempted the
        subflow are excluded. Flow-type-agnostic by construction: a
        passkey-login attempt is the same unit in a login and in a signup flow,
        so this comparison stays clean when the affected group mixes flow types.
        Absent when the analyzed flavours span several subflow types or none
        resolves to a known code.
      required:
        - subflowCode
        - definitional
        - affectedMeasuredCount
        - affectedCompleteCount
        - baselineMeasuredCount
        - baselineCompleteCount
      properties:
        subflowCode:
          type: string
          description: >-
            Long-path code of the subflow the analyzed flavours belong to (e.g.
            `pk-lo`).
        definitional:
          type: boolean
          description: >-
            True when the analyzed flavours are embedded ONLY in non-completing
            outcome variants — the comparison is then circular (the error's
            presence defines the segment as failed) and must not be presented as
            a measured impact.
        affectedMeasuredCount:
          type: integer
          format: int64
          description: >-
            Affected flows with a classifiable segment of the subflow; the
            denominator of `affectedCompletionRate`.
        affectedCompleteCount:
          type: integer
          format: int64
        affectedCompletionRate:
          type: number
          format: double
          description: >-
            Share of the affected side's measured subflow attempts that
            completed. Absent when nothing was measured.
        baselineMeasuredCount:
          type: integer
          format: int64
          description: Baseline flows with a classifiable segment of the subflow.
        baselineCompleteCount:
          type: integer
          format: int64
        baselineCompletionRate:
          type: number
          format: double
          description: >-
            Share of the baseline side's measured subflow attempts that
            completed.
        completionLift:
          type: number
          format: double
          description: >-
            affectedCompletionRate minus baselineCompletionRate. Absent when
            either side measured nothing.
    errorRspV2:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          required:
            - message
          properties:
            message:
              description: Error message
              type: string
              example: Validation failed
            details:
              description: Validation error details per field
              type: array
              items:
                type: object
                required:
                  - field
                  - message
                properties:
                  field:
                    description: Field name that failed validation
                    type: string
                    example: projectID
                  message:
                    description: Validation error message
                    type: string
                    example: required
    observeErrorImpactEnvCell:
      type: object
      required:
        - osName
        - browserName
        - flowCount
      properties:
        completedDurationP50Ms:
          type: integer
          format: int64
          description: >-
            Median flow duration in milliseconds within this environment, over
            completed flows only. Absent when the cell has no completed flows.
        completedFlowsMeasured:
          type: integer
          format: int64
          description: How many completed flows this cell's median rests on.
        osName:
          type: string
          description: OS name; empty when unknown.
        browserName:
          type: string
          description: Browser (web) or app name (app); empty when unknown.
        flowCount:
          type: integer
          format: int64
          description: Distinct flows in this cell.
        completionRate:
          type: number
          format: double
          description: >-
            Completion rate within this cell. Absent when the cell has no
            attempts-outcome flows.
    observeErrorImpactFlowTypeCell:
      type: object
      required:
        - flowType
        - flowCount
      properties:
        flowType:
          type: string
          description: >-
            Flow type name (`login`, `enrollment`, `recovery`, `signup` or a
            project's custom type); empty when the flow carries none.
        flowCount:
          type: integer
          format: int64
          description: Analyzed flows of this type in the group.
    observeErrorImpactMatchingStratum:
      type: object
      required:
        - affectedFlowCount
        - baselineFlowCount
        - collapseLevel
      properties:
        flowType:
          type: string
          description: >-
            The stratum's flow type. Flow type is a hard block variable — part
            of every stratum key at every collapse level, never dropped — so
            baseline flows of one flow type never serve affected flows of
            another. Empty for flows carrying no type.
        pathPrefix:
          type: string
          description: >-
            Coarse route before the erroring subflow (segment codes joined by
            |). Empty = the error sat on the first segment, or the prefix
            dimension was not part of this stratum.
        errorSubflow:
          type: string
          description: >-
            Subflow code the error sits on (e.g. pk-lo). Empty when the position
            could not be derived.
        osName:
          type: string
        browserName:
          type: string
        touchpoint:
          type: string
        applicationID:
          type: string
        affectedFlowCount:
          type: integer
          format: int64
        baselineFlowCount:
          type: integer
          format: int64
          description: >-
            Baseline flows sampled for this stratum (target is `ratio` x
            affectedFlowCount; less when candidates ran out).
        collapseLevel:
          type: integer
          description: >-
            0 = matched on the full requested key; 1 = prefix dropped; 2 = extra
            dimensions dropped (env + position only); 3 = position only.
    observeErrorImpactBalanceCell:
      type: object
      required:
        - dimension
        - imbalanceBefore
        - imbalanceAfter
      properties:
        dimension:
          type: string
        imbalanceBefore:
          type: number
          format: double
        imbalanceAfter:
          type: number
          format: double
  responses:
    error:
      description: Error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/errorRspV2'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Use an Observe API key from the management console. The key selects the
        project and must grant the permission listed on the operation. Keep this
        key on your server.

````