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

# Multi-source reconciliation

> Compares a custodian account with an on-chain account over one period. Addresses do not have to match. An optional connection with type custom is a stand-in ledger. Runs each account’s roll-forward and returns them side-by-side per asset. Each asset block carries an agreement_status, a closed likely_cause tag, and any unmatched_movements (tx_hash then source_ref; SELF legs included). Unlike roll-forward this is a POST with a JSON body, and end_time is optional (defaults to and echoes server now). USD figures are display-only snapshots taken independently per tape, and agreement is on quantities.



## OpenAPI

````yaml /api-reference/platform-api.json post /v2/reconciliation/multi-source
openapi: 3.0.0
info:
  title: Range Platform API
  description: >-
    The Range Platform API for workspace management, counterparties, and
    operational tooling.
  version: 1.7.29
  contact: {}
servers:
  - url: https://api.range.org
    description: Range API Server
security:
  - Authorization: []
  - Authorization: []
tags:
  - name: Address Information
    description: Get information about a crypto address.
  - name: Transfer Enrichments
    description: Attach workspace-scoped notes and categories to transfers.
  - name: Counterparties
    description: Manage external entities, their addresses, bank accounts, and documents.
  - name: Parties
    description: >-
      The workspace entity register: the firm itself, its clients, and its
      counterparties.
paths:
  /v2/reconciliation/multi-source:
    post:
      tags:
        - Reconciliation
      summary: Multi-source reconciliation
      description: >-
        Compares a custodian account with an on-chain account over one period.
        Addresses do not have to match. An optional connection with type custom
        is a stand-in ledger. Runs each account’s roll-forward and returns them
        side-by-side per asset. Each asset block carries an agreement_status, a
        closed likely_cause tag, and any unmatched_movements (tx_hash then
        source_ref; SELF legs included). Unlike roll-forward this is a POST with
        a JSON body, and end_time is optional (defaults to and echoes server
        now). USD figures are display-only snapshots taken independently per
        tape, and agreement is on quantities.
      operationId: getMultiSourceReconciliation
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MultiSourceReconciliationRequestDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MultiSourceReconciliationResponseDto'
        '400':
          description: >-
            Invalid body (e.g. fewer than 2 or more than 4 account ids, a
            non-UUID account id, start_time not before the effective end_time,
            an unsupported reporting_currency, or a set that is not a custodian
            account plus an on-chain account).
components:
  schemas:
    MultiSourceReconciliationRequestDto:
      type: object
      properties:
        account_ids:
          uniqueItems: true
          description: >-
            A custodian account and an on-chain account, plus an optional custom
            connection as a stand-in ledger. Between 2 and 4 account ids
            (UUIDs). Addresses do not have to match. At most one of each tape.
          example:
            - a1b2c3d4-e5f6-7890-abcd-ef1234567890
            - b2c3d4e5-f6a7-8901-bcde-f12345678901
          type: array
          items:
            type: string
            format: uuid
        start_time:
          format: date-time
          type: string
          example: '2026-09-01T00:00:00Z'
          description: Period start A (ISO 8601). Must be before the effective end.
        end_time:
          format: date-time
          type: string
          example: '2026-09-30T00:00:00Z'
          description: >-
            Period end B (ISO 8601). Omit for the live period — the server fills
            and echoes the instant used (now).
        assets:
          description: >-
            Restrict the comparison to these display symbols
            (catalogue-normalised). A symbol that is not in the catalogue is
            rejected. Omit to compare every asset held across the accounts. At
            most 50.
          example:
            - USDC
          type: array
          items:
            type: string
        reporting_currency:
          type: string
          example: USD
          default: USD
          description: Display currency. Only 'USD' is supported today.
        show_all:
          type: boolean
          default: false
          description: >-
            Bypass the workspace token whitelist on both sides of every line,
            same meaning as on the roll-forward endpoint.
      required:
        - account_ids
        - start_time
    MultiSourceReconciliationResponseDto:
      type: object
      properties:
        requested_period:
          description: Echoes the period; end_time is the instant actually used.
          allOf:
            - $ref: '#/components/schemas/ReconciliationPeriodDto'
        reporting_currency:
          type: string
          example: USD
        holding:
          $ref: '#/components/schemas/FullAgreementHoldingDto'
        accounts:
          description: >-
            Every requested account. An id outside the workspace, a duplicate
            role, or a tape this comparison does not accept is rejected before
            this list is built, so a missing tape is a 400 rather than a shorter
            list.
          type: array
          items:
            $ref: '#/components/schemas/MultiSourceAccountDto'
        assets:
          type: array
          items:
            $ref: '#/components/schemas/MultiSourceAssetComparisonDto'
        unmatched_assets:
          description: >-
            Requested display symbols that matched no line on any tape. Empty
            when assets was omitted or every requested symbol appeared.
          example: []
          type: array
          items:
            type: string
      required:
        - requested_period
        - reporting_currency
        - holding
        - accounts
        - assets
        - unmatched_assets
    ReconciliationPeriodDto:
      type: object
      properties:
        start_time:
          type: string
          example: '2026-07-01T00:00:00.000Z'
        end_time:
          type: string
          example: '2026-08-01T00:00:00.000Z'
      required:
        - start_time
        - end_time
    FullAgreementHoldingDto:
      type: object
      properties:
        chain_account_id:
          type: string
          nullable: true
          description: The on-chain account. A different row from the custodian.
        custodian_account_id:
          type: string
          nullable: true
          description: >-
            The custodian account. Its address does not have to match the
            on-chain account.
        ledger_account_id:
          type: string
          nullable: true
          description: >-
            Optional stand-in ledger: a connection with type custom named on
            this request. Null when the run is only custodian against the
            on-chain account.
      required:
        - chain_account_id
        - custodian_account_id
        - ledger_account_id
    MultiSourceAccountDto:
      type: object
      properties:
        account_id:
          type: string
          example: a1b2c3d4-e5f6-7890-abcd-ef1234567890
        label:
          type: string
          nullable: true
          example: custodian
          description: >-
            This account's tape: chain, custodian, or ledger. Null when the
            account was not assigned a tape.
        status:
          type: string
          enum:
            - ok
            - no_observation
            - unreconcilable
          example: ok
          description: This account's own roll-forward status for the period.
        effective_period:
          nullable: true
          description: >-
            Observation window actually used for this account. It can differ
            from requested_period and from the other tapes.
          type: object
          allOf:
            - $ref: '#/components/schemas/ReconciliationPeriodDto'
        unreconcilable_reason:
          type: string
          nullable: true
          enum:
            - network_reconciliation_unsupported
            - balance_source_unreadable
            - movements_floor_unknown
            - period_precedes_reconcilable_floor
            - movements_truncated
            - period_overlaps_unsynced_range
            - period_exceeds_synced_coverage
            - no_closing_observation_in_period
            - sibling_scan_incomplete
          description: >-
            Why this account cannot be compared, when status is unreconcilable.
            Null otherwise, except sibling_scan_incomplete, which can be set
            while status is still ok.
        declared_gaps:
          description: >-
            Trade legs on this account whose counter-asset has no account in the
            connection. Copied from the roll-forward statement.
          type: array
          items:
            $ref: '#/components/schemas/DeclaredGapDto'
      required:
        - account_id
        - status
        - declared_gaps
    MultiSourceAssetComparisonDto:
      type: object
      properties:
        asset:
          type: string
          example: USDC
          description: Catalogue-normalised symbol.
        per_account:
          description: >-
            Each requested account's roll-forward for this asset, in request
            order. An account with no line for the asset is still listed, with
            null quantities.
          type: array
          items:
            $ref: '#/components/schemas/MultiSourcePerAccountLineDto'
        agreement_status:
          type: string
          enum:
            - agreed
            - disagreed
            - missing_data
            - not_evaluated
          example: agreed
          description: >-
            Whether the requested accounts agree on this asset. Orthogonal to
            each line's own tie_out_status.
        likely_cause:
          type: string
          enum:
            - missing_data
            - balances_differ
            - doesnt_add_up
            - movement_missing
            - none
          example: none
          description: >-
            Closed reason tag for the agreement verdict. Backed by the figures
            already in per_account — never free text.
        unmatched_movements:
          description: >-
            Movements present on one tape and missing on another. Match key is
            tx_hash (EVM-lowercased) then source_ref; a movement with neither
            key is unmatched on every other account. SELF legs are included.
          type: array
          items:
            $ref: '#/components/schemas/MultiSourceUnmatchedMovementDto'
      required:
        - asset
        - per_account
        - agreement_status
        - likely_cause
        - unmatched_movements
    DeclaredGapDto:
      type: object
      properties:
        reason:
          type: string
          enum:
            - trade_quote_leg_unattributed
            - trade_fee_leg_unattributed
            - network_fees_unmodelled
            - unreadable_asset_amount
            - unresolved_asset_identity
            - no_balance_observed
            - trade_base_leg_unattributed
          example: trade_quote_leg_unattributed
          description: >-
            Why this leg is declared here rather than appearing on any asset
            line — its asset has no account anywhere in this trade's connection
            (checked across every sibling account, not only the accounts
            requested this call).
        asset:
          type: string
          example: USDC
          description: Asset the leg was in.
        quantity:
          type: string
          example: '500.00'
          description: Unsigned magnitude that could not be attributed to any account.
        transaction_id:
          type: string
          example: a1b2c3d4-e5f6-7890-abcd-ef1234567890
          description: The trade transaction this leg came from.
      required:
        - reason
        - asset
        - quantity
        - transaction_id
    MultiSourcePerAccountLineDto:
      type: object
      properties:
        account_id:
          type: string
          example: a1b2c3d4-e5f6-7890-abcd-ef1234567890
        label:
          type: string
          nullable: true
          example: custom
        status:
          type: string
          enum:
            - ok
            - no_observation
            - unreconcilable
          example: ok
        unreconcilable_reason:
          type: string
          nullable: true
          enum:
            - network_reconciliation_unsupported
            - balance_source_unreadable
            - movements_floor_unknown
            - period_precedes_reconcilable_floor
            - movements_truncated
            - period_overlaps_unsynced_range
            - period_exceeds_synced_coverage
            - no_closing_observation_in_period
            - sibling_scan_incomplete
          description: >-
            Copied from the account statement so this line can be re-derived on
            its own. Set on every asset line of an account that carries the
            reason, including sibling_scan_incomplete while status is still ok.
        declared_gap_reason:
          type: string
          nullable: true
          enum:
            - trade_quote_leg_unattributed
            - trade_fee_leg_unattributed
            - network_fees_unmodelled
            - unreadable_asset_amount
            - unresolved_asset_identity
            - no_balance_observed
            - trade_base_leg_unattributed
          description: >-
            Copied from the roll-forward line. Null when the account has no line
            for the asset, or the line declared no gap. An explained network-fee
            gap still has real opening and closing quantities.
        opening_quantity:
          type: string
          nullable: true
          example: '100000'
        movements_quantity:
          type: string
          nullable: true
          example: '-2500'
        computed_closing_quantity:
          type: string
          nullable: true
          example: '97500'
        actual_closing_quantity:
          type: string
          nullable: true
          example: '97500'
        difference:
          type: string
          nullable: true
          example: '0'
        tie_out_status:
          type: string
          nullable: true
          enum:
            - tied
            - explained
            - break
            - not_evaluated
          example: tied
          description: This account's own tie-out for the asset (null if no line).
        opening_usd:
          type: string
          nullable: true
          example: '100000.00'
        closing_usd:
          type: string
          nullable: true
          example: '97500.00'
      required:
        - account_id
        - status
    MultiSourceUnmatchedMovementDto:
      type: object
      properties:
        account_id:
          type: string
          example: a1b2c3d4-e5f6-7890-abcd-ef1234567890
        asset:
          type: string
          example: USDC
        quantity:
          type: string
          example: '25'
        tx_hash:
          type: string
          nullable: true
          example: 0xabc...
        source_ref:
          type: string
          nullable: true
          example: ptx-1
        missing_on:
          example:
            - b2c3d4e5-f6a7-8901-bcde-f12345678901
          description: Requested account ids that do not carry this movement key.
          type: array
          items:
            type: string
      required:
        - account_id
        - asset
        - quantity
        - missing_on
  securitySchemes:
    Authorization:
      type: apiKey
      in: header
      name: X-API-KEY
      description: Authorization method required to allow user to access the api endpoints.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.