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

# Request multi-source reconciliation

> Accept a JSON request for account reconciliation across sources.



## 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.37
  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: >-
        Reconciles one custodian wallet. The server resolves its custodian tape
        and its paired ledger account. The chain tape is included once
        observations exist; otherwise Custody is source_missing. A line exists
        for each asset the custodian or the ledger names, plus the native asset;
        a token only the chain tape holds gets none. Each asset carries Custody
        (chain vs custodian), Books (ledger vs custodian), and the worse of the
        two as the line status and cause. An asset the custodian marked
        unverified is compared like any other; the line carries
        unverified_by_custodian: true and a custodian_unverified block.
        Movements match on hash, asset and kind, then provider reference. A
        ledger movement with no hash is listed as unmatchable. end_time is
        optional (defaults to now).
      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 (a non-UUID account id, an account that is not one
            custodian wallet on EVM or Solana, start_time not before the
            effective end, or an unsupported reporting_currency).
components:
  schemas:
    MultiSourceReconciliationRequestDto:
      type: object
      properties:
        account_id:
          type: string
          format: uuid
          description: Custodian wallet account to reconcile.
          example: a1b2c3d4-e5f6-7890-abcd-ef1234567890
        start_time:
          format: date-time
          type: string
          example: '2026-09-01T00:00:00Z'
          description: Period start (ISO 8601). Must be before the effective end.
        end_time:
          format: date-time
          type: string
          example: '2026-09-30T00:00:00Z'
          description: >-
            Period end (ISO 8601). Omit for the live period — the server fills
            and echoes the instant used (now).
        books_end_time:
          format: date-time
          type: string
          example: '2026-09-16T00:00:00Z'
          description: >-
            Books pair window end (ISO 8601). When it is strictly inside
            (start_time, end_time), Books is compared through this instant and
            the custodian close is computed. Omit to compare Books through
            end_time.
        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. 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_id
        - start_time
    MultiSourceReconciliationResponseDto:
      type: object
      properties:
        requested_period:
          $ref: '#/components/schemas/ReconciliationPeriodDto'
        reporting_currency:
          type: string
          example: USD
        holding:
          $ref: '#/components/schemas/FullAgreementHoldingDto'
        accounts:
          type: array
          items:
            $ref: '#/components/schemas/MultiSourceAccountDto'
        assets:
          type: array
          items:
            $ref: '#/components/schemas/FullAgreementAssetLineDto'
        unmatched_assets:
          description: Requested display symbols that matched no line.
          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: Chain tape account. Null until the chain tape exists.
        custodian_account_id:
          type: string
          nullable: true
        ledger_account_id:
          type: string
          nullable: true
          description: Paired ledger account. Null when the wallet has no pairing.
      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
          enum:
            - chain
            - custodian
            - ledger
          example: custodian
        status:
          type: string
          enum:
            - ok
            - no_observation
            - unreconcilable
        effective_period:
          nullable: true
          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
        declared_gaps:
          type: array
          items:
            $ref: '#/components/schemas/DeclaredGapDto'
      required:
        - account_id
        - label
        - status
        - declared_gaps
    FullAgreementAssetLineDto:
      type: object
      properties:
        asset:
          $ref: '#/components/schemas/FullAgreementAssetDto'
        custody:
          $ref: '#/components/schemas/FullAgreementVerdictDto'
        books:
          $ref: '#/components/schemas/FullAgreementVerdictDto'
        status:
          type: string
          enum:
            - agreed
            - disagreed
            - source_missing
            - not_evaluated
        cause:
          type: string
          enum:
            - missing_on_chain
            - missing_on_custodian
            - missing_on_ledger
            - quantity_mismatch
            - source_missing
            - range_break
            - custodian_unverified_asset
            - none
          description: >-
            `custodian_unverified_asset` is legacy: it is never written and
            appears only on lines and cases stored before ADR-0072, which
            compares an asset the custodian marked unverified like any other.
        per_tape:
          type: array
          items:
            $ref: '#/components/schemas/FullAgreementTapeLineDto'
        unmatched_movements:
          type: array
          items:
            $ref: '#/components/schemas/FullAgreementUnmatchedMovementDto'
        unmatchable_movements:
          type: array
          items:
            $ref: '#/components/schemas/FullAgreementUnmatchableMovementDto'
        symbol_only:
          type: boolean
          description: >-
            True when the ledger contributed and none of its observations named
            a token address.
        books_custodian_close_quantity:
          type: string
          nullable: true
          description: >-
            Custodian close the Books pair compared when it was computed at
            books as of. Null when that close could not be computed (no
            custodian opening, or a movement with no sign), so Books had no
            custodian observation. Absent when Books used a captured close.
        unverified_by_custodian:
          type: boolean
          description: >-
            True when the custodian marked this asset unverified (Dfns
            `verified: false`) in a balance at either boundary, in the capture a
            walked boundary was built from, or in a transaction in the period.
            Information only: the line is compared like any other, so it can be
            agreed, disagreed or source_missing. False when the custodian gave
            no such verdict.
        custodian_unverified:
          description: >-
            Present when `unverified_by_custodian` is true: the custodian that
            marked the asset unverified and the token it named.
          allOf:
            - $ref: '#/components/schemas/FullAgreementCustodianUnverifiedDto'
        declared_gap:
          description: >-
            Present only when `cause` is `source_missing` and every pair that is
            `source_missing` lacks a figure because a tape declared a gap, not
            because a tape or the books are absent.
          allOf:
            - $ref: '#/components/schemas/FullAgreementDeclaredGapDto'
      required:
        - asset
        - custody
        - books
        - status
        - cause
        - per_tape
        - unmatched_movements
        - unmatchable_movements
        - symbol_only
        - unverified_by_custodian
    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
            - custodian_walkback_negative
          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
    FullAgreementAssetDto:
      type: object
      properties:
        network:
          type: string
          example: ethereum
        token_address:
          type: string
          nullable: true
          example: native
          description: >-
            Token address, or `native` for the network native asset. Null when
            the tape only named a symbol. Symbol is display only.
        symbol:
          type: string
          example: USDC
      required:
        - network
        - symbol
    FullAgreementVerdictDto:
      type: object
      properties:
        status:
          type: string
          enum:
            - agreed
            - disagreed
            - source_missing
            - not_evaluated
        cause:
          type: string
          enum:
            - missing_on_chain
            - missing_on_custodian
            - missing_on_ledger
            - quantity_mismatch
            - source_missing
            - range_break
            - custodian_unverified_asset
            - none
          description: >-
            `custodian_unverified_asset` is legacy: it is never written and
            appears only on lines and cases stored before ADR-0072, which
            compares an asset the custodian marked unverified like any other.
      required:
        - status
        - cause
    FullAgreementTapeLineDto:
      type: object
      properties:
        tape:
          type: string
          enum:
            - chain
            - custodian
            - ledger
        account_id:
          type: string
          nullable: true
        status:
          type: string
          enum:
            - ok
            - no_observation
            - unreconcilable
        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
        opening_quantity:
          type: string
          nullable: true
        inflows:
          type: string
          nullable: true
        outflows:
          type: string
          nullable: true
        fees:
          type: string
          nullable: true
        opening_block:
          type: string
          nullable: true
          description: Chain boundary block or slot. Absent on other tapes.
        closing_block:
          type: string
          nullable: true
        movements_quantity:
          type: string
          nullable: true
        computed_closing_quantity:
          type: string
          nullable: true
        actual_closing_quantity:
          type: string
          nullable: true
        difference:
          type: string
          nullable: true
        tie_out_status:
          type: string
          nullable: true
          enum:
            - tied
            - explained
            - break
            - not_evaluated
        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
            - custodian_walkback_negative
        opening_evidence:
          $ref: '#/components/schemas/CustodianBoundaryEvidenceDto'
        closing_evidence:
          $ref: '#/components/schemas/CustodianBoundaryEvidenceDto'
      required:
        - tape
        - status
    FullAgreementUnmatchedMovementDto:
      type: object
      properties:
        tape:
          type: string
          enum:
            - chain
            - custodian
            - ledger
        symbol:
          type: string
          example: USDC
        quantity:
          type: string
          example: '25'
        tx_hash:
          type: string
          nullable: true
        kind:
          type: string
          enum:
            - transfer
            - trade
            - network_fee
        source_ref:
          type: string
          nullable: true
        missing_on:
          type: array
          items:
            type: string
            enum:
              - chain
              - custodian
              - ledger
      required:
        - tape
        - symbol
        - quantity
        - kind
        - missing_on
    FullAgreementUnmatchableMovementDto:
      type: object
      properties:
        tape:
          type: string
          enum:
            - chain
            - custodian
            - ledger
        symbol:
          type: string
        quantity:
          type: string
        tx_hash:
          type: string
          nullable: true
          example: null
          description: 'Always null: a movement without a hash cannot be matched.'
        kind:
          type: string
          enum:
            - transfer
            - trade
            - network_fee
        source_ref:
          type: string
          nullable: true
        reason:
          type: string
          example: no hash, cannot match
      required:
        - tape
        - symbol
        - quantity
        - tx_hash
        - kind
        - reason
    FullAgreementCustodianUnverifiedDto:
      type: object
      properties:
        provider:
          type: string
          nullable: true
          example: dfns
          description: The custodian that marked the asset unverified.
        token_address:
          type: string
          nullable: true
          example: SLNDpmoWTVADgEdndyvWzroNL7zSi1dF9PC3xHGtPwp
          description: Contract or mint the custodian named; null when it named none.
        chain_close:
          type: string
          nullable: true
          description: Chain tape close for this asset; null without a chain close.
        ledger_close:
          type: string
          nullable: true
          description: Ledger close for this asset; null without a ledger line.
      required:
        - provider
        - token_address
        - chain_close
        - ledger_close
    FullAgreementDeclaredGapDto:
      type: object
      properties:
        tape:
          type: string
          enum:
            - chain
            - custodian
            - ledger
          example: custodian
        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
            - custodian_walkback_negative
          example: custodian_walkback_negative
      required:
        - tape
        - reason
    CustodianBoundaryEvidenceDto:
      type: object
      properties:
        obtained_by:
          type: string
          example: enrolment_walkback
        custodian_read_at:
          type: string
          example: '2026-10-05T15:00:00.000Z'
        transaction_count:
          type: number
          example: 3
        evidence:
          type: string
          example: walked back through 3 transactions
        statuses:
          example:
            - Confirmed
          type: array
          items:
            type: string
      required:
        - obtained_by
        - custodian_read_at
        - transaction_count
        - evidence
        - statuses
  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.