---
title: "Read reports"
method: GET
path: "/accountant/reports"
tags: ["Accountant Portal"]
---

# Read reports

`GET /accountant/reports`

## Request

- Base URL: `https://api.medianfi.com/api/v1`
- URL: `https://api.medianfi.com/api/v1/accountant/reports`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Generated minimal contract (#1940): parameters, auth, and status codes are authoritative; see the route handler for the exact body/response shape. Enrichment tracked by the x-median-spec-stage marker.

## Query parameters

- `basis` 'accrual' | 'cash'

## Response `200`

Success envelope; see the route handler for the payload shape

- object
  - `data` AccountantReportsBundle: Statements and aging of one customer. With `type`, only the requested section is present beside `type` and `customerId`. Without a customer the payload lists `availableReports` instead. The four statements share the request's `basis`; A/R and A/P aging have no basis.
    - `profitAndLoss` union: One statement of the accountant reports bundle: the statement itself, or the marker left in its place when it could not be produced. A rejected statement is never null and is never replaced by figures on another basis.
      - object: The configured accounting preference is reported separately from the basis the statement was actually calculated on, and never changes the calculation. `reportBasis` is `accrual` unless the request asked for `basis=cash` and the cash-basis view could be produced (#2911). Only the accountant report routes accept `basis`, so customer report routes always return `accrual` and never carry `cashBasis`. `configuredBasisSource` is `statement_basis` when an accountant has recorded an approved statement basis effective on the report date (J-355); that row is metadata only and never changes figures or `reportBasis`. The row is resolved on the request's `endDate` / `asOfDate` (the month end for a legacy `month`); when the request names no date, it is resolved on today's date (UTC), the current basis, even though the payload then describes the latest posted period.
        - `configuredBasis` 'cash' | 'accrual' | 'unknown', required
        - `configuredBasisSource` 'statement_basis' | 'tax_settings' | 'company' | 'missing' | 'unavailable', required
        - `reportBasis` 'accrual' | 'cash', required
        - `fiscalYearEnd` string, nullable: companies.fiscal_year_end (MM-DD); null when not confirmed (#2019).
        - `fiscalYearReview` union: True when companies.fiscal_year_end is set and is not 12-31, or tax_settings.fiscal_year_end (month) is set and is not 12. Non-calendar fiscal years are not supported yet, so the statement is still calendar-year and must be reviewed. It is "unknown" when the company or tax-settings fiscal year end could not be read, never a silent false (#2019).
          - boolean
          - 'unknown'
        - `fiscalYearReviewReason` string, nullable: Why fiscalYearReview is raised, naming the field that raised it; null when not raised (#2019).
        - `cashBasis` CashBasisSummary: The `cashBasis` block of a statement whose `reportBasis` is `cash`. Present only then; an accrual statement has no such key. Money is integer ledger cents. Cash net income over the scope equals `accrualNetIncomeCents - timingMovementCents`, so the difference from accrual can be re-derived by hand. The view is not a GAAP statement; `basisNotice` says so and clients print it with the statement.
          - `policyId` 'cash-basis-v1', required
          - `policyVersion` integer, required: Revision of the rules under this policy id.
          - `reviewedBy` string, required: Reviewer of the policy the statement was calculated under.
          - `throughDate` string, date, required: The cash view was built from inception through this date.
          - `scope` CashBasisScope, required: What a cash-basis statement or refusal answers for. `range` (P&L, cash flow, income-statement drill-down) is blocked by a refusal dated inside `startDate`..`endDate`; `as_of` (balance sheet, trial balance, balance-sheet drill-down) by any refusal dated on or before `endDate`.
            - `kind` 'range' | 'as_of', required
            - `entityId` string, nullable, required: Null when the request named no entity.
            - `startDate` string, date, nullable, required: Null on `as_of`, and when the request carried no explicit start.
            - `endDate` string, date, nullable, required: Range end or as-of date. Null only when the request carried no explicit date.
          - `droppedEntryCount` integer, required: Entries left out of the cash view because they only move amounts between income or expense and a receivable, payable, deferred-revenue or accrued account. Whole view, inception through `throughDate`.
          - `retargetedLineCount` integer, required: Receivable or payable settlement lines moved onto the income or expense accounts of the invoice or bill they settle. Whole view, inception through `throughDate`.
          - `retargetedCents` integer, required: Sum of the retargeted settlement lines. Whole view, inception through `throughDate`.
          - `accrualNetIncomeCents` integer, required: Accrual net income over the scope (revenue minus expense, closing entries excluded).
          - `timingMovementCents` integer, required: Change over the scope in the debit-positive balance of the receivable, payable, deferred-revenue and accrued accounts, on the accrual ledger.
          - `evidence` object, required: Completeness figures over the scope. They have no basis effect.
            - `uncategorizedIncomeCents` integer, required
            - `uncategorizedExpenseCents` integer, required
            - `suspenseBalanceCents` integer, required: Balance of suspense and ask-my-client accounts at the scope's end, debit positive.
          - `reviewItemCount` integer, required: Review items dated inside the scope, including those beyond the cap on `reviewItems`.
          - `reviewItems` object[], required: Kept income or expense lines with no cash, card or clearing line behind them, earliest first. They are identical on both bases and listed for review. No memo or description text.
            - `kind` 'pnl_against_equity_or_suspense', required
            - `entryId` string, required
            - `entryDate` string, date, required
            - `accountCode` string, required: Code of the income or expense account.
            - `amountCents` integer, required: Ledger cents of that line.
          - `basisNotice` 'Cash basis. Not a GAAP statement: revenue is recognized when cash is received, not when performance obligations are satisfied (ASC 606).', required: Fixed wording that the view is not a GAAP statement. Clients print it with the statement instead of composing their own.
      - AccountantReportStatementUnavailable: Left in a statement's place in the accountant reports bundle when that statement could not be produced. The other statements of the bundle are unaffected.
        - `unavailable` true, required
        - `reason` string, required: Client-facing message. A literal for unexpected failures.
        - `code` string, required: Error code of the rejection. `CASH_BASIS_UNAVAILABLE` when the statement was asked on the cash basis and cannot be produced; `INTERNAL_ERROR` for an unexpected failure.
        - `traceId` union, required: Server log correlation id of the request.
          - string
          - integer
        - `details` CashBasisUnavailableExtensions: Why a cash-basis statement cannot be produced. Carries no memo or description text.
          - `cashBasis` object, required
            - `reasons` object[], required
              - …
            - `policyId` 'cash-basis-v1', required
            - `scope` CashBasisScope, required: What a cash-basis statement or refusal answers for. `range` (P&L, cash flow, income-statement drill-down) is blocked by a refusal dated inside `startDate`..`endDate`; `as_of` (balance sheet, trial balance, balance-sheet drill-down) by any refusal dated on or before `endDate`.
              - …
    - `balanceSheet` union: One statement of the accountant reports bundle: the statement itself, or the marker left in its place when it could not be produced. A rejected statement is never null and is never replaced by figures on another basis.
      - object: The configured accounting preference is reported separately from the basis the statement was actually calculated on, and never changes the calculation. `reportBasis` is `accrual` unless the request asked for `basis=cash` and the cash-basis view could be produced (#2911). Only the accountant report routes accept `basis`, so customer report routes always return `accrual` and never carry `cashBasis`. `configuredBasisSource` is `statement_basis` when an accountant has recorded an approved statement basis effective on the report date (J-355); that row is metadata only and never changes figures or `reportBasis`. The row is resolved on the request's `endDate` / `asOfDate` (the month end for a legacy `month`); when the request names no date, it is resolved on today's date (UTC), the current basis, even though the payload then describes the latest posted period.
        - `configuredBasis` 'cash' | 'accrual' | 'unknown', required
        - `configuredBasisSource` 'statement_basis' | 'tax_settings' | 'company' | 'missing' | 'unavailable', required
        - `reportBasis` 'accrual' | 'cash', required
        - `fiscalYearEnd` string, nullable: companies.fiscal_year_end (MM-DD); null when not confirmed (#2019).
        - `fiscalYearReview` union: True when companies.fiscal_year_end is set and is not 12-31, or tax_settings.fiscal_year_end (month) is set and is not 12. Non-calendar fiscal years are not supported yet, so the statement is still calendar-year and must be reviewed. It is "unknown" when the company or tax-settings fiscal year end could not be read, never a silent false (#2019).
          - boolean
          - 'unknown'
        - `fiscalYearReviewReason` string, nullable: Why fiscalYearReview is raised, naming the field that raised it; null when not raised (#2019).
        - `cashBasis` CashBasisSummary: The `cashBasis` block of a statement whose `reportBasis` is `cash`. Present only then; an accrual statement has no such key. Money is integer ledger cents. Cash net income over the scope equals `accrualNetIncomeCents - timingMovementCents`, so the difference from accrual can be re-derived by hand. The view is not a GAAP statement; `basisNotice` says so and clients print it with the statement.
          - `policyId` 'cash-basis-v1', required
          - `policyVersion` integer, required: Revision of the rules under this policy id.
          - `reviewedBy` string, required: Reviewer of the policy the statement was calculated under.
          - `throughDate` string, date, required: The cash view was built from inception through this date.
          - `scope` CashBasisScope, required: What a cash-basis statement or refusal answers for. `range` (P&L, cash flow, income-statement drill-down) is blocked by a refusal dated inside `startDate`..`endDate`; `as_of` (balance sheet, trial balance, balance-sheet drill-down) by any refusal dated on or before `endDate`.
            - `kind` 'range' | 'as_of', required
            - `entityId` string, nullable, required: Null when the request named no entity.
            - `startDate` string, date, nullable, required: Null on `as_of`, and when the request carried no explicit start.
            - `endDate` string, date, nullable, required: Range end or as-of date. Null only when the request carried no explicit date.
          - `droppedEntryCount` integer, required: Entries left out of the cash view because they only move amounts between income or expense and a receivable, payable, deferred-revenue or accrued account. Whole view, inception through `throughDate`.
          - `retargetedLineCount` integer, required: Receivable or payable settlement lines moved onto the income or expense accounts of the invoice or bill they settle. Whole view, inception through `throughDate`.
          - `retargetedCents` integer, required: Sum of the retargeted settlement lines. Whole view, inception through `throughDate`.
          - `accrualNetIncomeCents` integer, required: Accrual net income over the scope (revenue minus expense, closing entries excluded).
          - `timingMovementCents` integer, required: Change over the scope in the debit-positive balance of the receivable, payable, deferred-revenue and accrued accounts, on the accrual ledger.
          - `evidence` object, required: Completeness figures over the scope. They have no basis effect.
            - `uncategorizedIncomeCents` integer, required
            - `uncategorizedExpenseCents` integer, required
            - `suspenseBalanceCents` integer, required: Balance of suspense and ask-my-client accounts at the scope's end, debit positive.
          - `reviewItemCount` integer, required: Review items dated inside the scope, including those beyond the cap on `reviewItems`.
          - `reviewItems` object[], required: Kept income or expense lines with no cash, card or clearing line behind them, earliest first. They are identical on both bases and listed for review. No memo or description text.
            - `kind` 'pnl_against_equity_or_suspense', required
            - `entryId` string, required
            - `entryDate` string, date, required
            - `accountCode` string, required: Code of the income or expense account.
            - `amountCents` integer, required: Ledger cents of that line.
          - `basisNotice` 'Cash basis. Not a GAAP statement: revenue is recognized when cash is received, not when performance obligations are satisfied (ASC 606).', required: Fixed wording that the view is not a GAAP statement. Clients print it with the statement instead of composing their own.
      - AccountantReportStatementUnavailable: Left in a statement's place in the accountant reports bundle when that statement could not be produced. The other statements of the bundle are unaffected.
        - `unavailable` true, required
        - `reason` string, required: Client-facing message. A literal for unexpected failures.
        - `code` string, required: Error code of the rejection. `CASH_BASIS_UNAVAILABLE` when the statement was asked on the cash basis and cannot be produced; `INTERNAL_ERROR` for an unexpected failure.
        - `traceId` union, required: Server log correlation id of the request.
          - string
          - integer
        - `details` CashBasisUnavailableExtensions: Why a cash-basis statement cannot be produced. Carries no memo or description text.
          - `cashBasis` object, required
            - `reasons` object[], required
              - …
            - `policyId` 'cash-basis-v1', required
            - `scope` CashBasisScope, required: What a cash-basis statement or refusal answers for. `range` (P&L, cash flow, income-statement drill-down) is blocked by a refusal dated inside `startDate`..`endDate`; `as_of` (balance sheet, trial balance, balance-sheet drill-down) by any refusal dated on or before `endDate`.
              - …
    - `cashFlow` union: One statement of the accountant reports bundle: the statement itself, or the marker left in its place when it could not be produced. A rejected statement is never null and is never replaced by figures on another basis.
      - object: The configured accounting preference is reported separately from the basis the statement was actually calculated on, and never changes the calculation. `reportBasis` is `accrual` unless the request asked for `basis=cash` and the cash-basis view could be produced (#2911). Only the accountant report routes accept `basis`, so customer report routes always return `accrual` and never carry `cashBasis`. `configuredBasisSource` is `statement_basis` when an accountant has recorded an approved statement basis effective on the report date (J-355); that row is metadata only and never changes figures or `reportBasis`. The row is resolved on the request's `endDate` / `asOfDate` (the month end for a legacy `month`); when the request names no date, it is resolved on today's date (UTC), the current basis, even though the payload then describes the latest posted period.
        - `configuredBasis` 'cash' | 'accrual' | 'unknown', required
        - `configuredBasisSource` 'statement_basis' | 'tax_settings' | 'company' | 'missing' | 'unavailable', required
        - `reportBasis` 'accrual' | 'cash', required
        - `fiscalYearEnd` string, nullable: companies.fiscal_year_end (MM-DD); null when not confirmed (#2019).
        - `fiscalYearReview` union: True when companies.fiscal_year_end is set and is not 12-31, or tax_settings.fiscal_year_end (month) is set and is not 12. Non-calendar fiscal years are not supported yet, so the statement is still calendar-year and must be reviewed. It is "unknown" when the company or tax-settings fiscal year end could not be read, never a silent false (#2019).
          - boolean
          - 'unknown'
        - `fiscalYearReviewReason` string, nullable: Why fiscalYearReview is raised, naming the field that raised it; null when not raised (#2019).
        - `cashBasis` CashBasisSummary: The `cashBasis` block of a statement whose `reportBasis` is `cash`. Present only then; an accrual statement has no such key. Money is integer ledger cents. Cash net income over the scope equals `accrualNetIncomeCents - timingMovementCents`, so the difference from accrual can be re-derived by hand. The view is not a GAAP statement; `basisNotice` says so and clients print it with the statement.
          - `policyId` 'cash-basis-v1', required
          - `policyVersion` integer, required: Revision of the rules under this policy id.
          - `reviewedBy` string, required: Reviewer of the policy the statement was calculated under.
          - `throughDate` string, date, required: The cash view was built from inception through this date.
          - `scope` CashBasisScope, required: What a cash-basis statement or refusal answers for. `range` (P&L, cash flow, income-statement drill-down) is blocked by a refusal dated inside `startDate`..`endDate`; `as_of` (balance sheet, trial balance, balance-sheet drill-down) by any refusal dated on or before `endDate`.
            - `kind` 'range' | 'as_of', required
            - `entityId` string, nullable, required: Null when the request named no entity.
            - `startDate` string, date, nullable, required: Null on `as_of`, and when the request carried no explicit start.
            - `endDate` string, date, nullable, required: Range end or as-of date. Null only when the request carried no explicit date.
          - `droppedEntryCount` integer, required: Entries left out of the cash view because they only move amounts between income or expense and a receivable, payable, deferred-revenue or accrued account. Whole view, inception through `throughDate`.
          - `retargetedLineCount` integer, required: Receivable or payable settlement lines moved onto the income or expense accounts of the invoice or bill they settle. Whole view, inception through `throughDate`.
          - `retargetedCents` integer, required: Sum of the retargeted settlement lines. Whole view, inception through `throughDate`.
          - `accrualNetIncomeCents` integer, required: Accrual net income over the scope (revenue minus expense, closing entries excluded).
          - `timingMovementCents` integer, required: Change over the scope in the debit-positive balance of the receivable, payable, deferred-revenue and accrued accounts, on the accrual ledger.
          - `evidence` object, required: Completeness figures over the scope. They have no basis effect.
            - `uncategorizedIncomeCents` integer, required
            - `uncategorizedExpenseCents` integer, required
            - `suspenseBalanceCents` integer, required: Balance of suspense and ask-my-client accounts at the scope's end, debit positive.
          - `reviewItemCount` integer, required: Review items dated inside the scope, including those beyond the cap on `reviewItems`.
          - `reviewItems` object[], required: Kept income or expense lines with no cash, card or clearing line behind them, earliest first. They are identical on both bases and listed for review. No memo or description text.
            - `kind` 'pnl_against_equity_or_suspense', required
            - `entryId` string, required
            - `entryDate` string, date, required
            - `accountCode` string, required: Code of the income or expense account.
            - `amountCents` integer, required: Ledger cents of that line.
          - `basisNotice` 'Cash basis. Not a GAAP statement: revenue is recognized when cash is received, not when performance obligations are satisfied (ASC 606).', required: Fixed wording that the view is not a GAAP statement. Clients print it with the statement instead of composing their own.
      - AccountantReportStatementUnavailable: Left in a statement's place in the accountant reports bundle when that statement could not be produced. The other statements of the bundle are unaffected.
        - `unavailable` true, required
        - `reason` string, required: Client-facing message. A literal for unexpected failures.
        - `code` string, required: Error code of the rejection. `CASH_BASIS_UNAVAILABLE` when the statement was asked on the cash basis and cannot be produced; `INTERNAL_ERROR` for an unexpected failure.
        - `traceId` union, required: Server log correlation id of the request.
          - string
          - integer
        - `details` CashBasisUnavailableExtensions: Why a cash-basis statement cannot be produced. Carries no memo or description text.
          - `cashBasis` object, required
            - `reasons` object[], required
              - …
            - `policyId` 'cash-basis-v1', required
            - `scope` CashBasisScope, required: What a cash-basis statement or refusal answers for. `range` (P&L, cash flow, income-statement drill-down) is blocked by a refusal dated inside `startDate`..`endDate`; `as_of` (balance sheet, trial balance, balance-sheet drill-down) by any refusal dated on or before `endDate`.
              - …
    - `trialBalance` union: One statement of the accountant reports bundle: the statement itself, or the marker left in its place when it could not be produced. A rejected statement is never null and is never replaced by figures on another basis.
      - object: The configured accounting preference is reported separately from the basis the statement was actually calculated on, and never changes the calculation. `reportBasis` is `accrual` unless the request asked for `basis=cash` and the cash-basis view could be produced (#2911). Only the accountant report routes accept `basis`, so customer report routes always return `accrual` and never carry `cashBasis`. `configuredBasisSource` is `statement_basis` when an accountant has recorded an approved statement basis effective on the report date (J-355); that row is metadata only and never changes figures or `reportBasis`. The row is resolved on the request's `endDate` / `asOfDate` (the month end for a legacy `month`); when the request names no date, it is resolved on today's date (UTC), the current basis, even though the payload then describes the latest posted period.
        - `configuredBasis` 'cash' | 'accrual' | 'unknown', required
        - `configuredBasisSource` 'statement_basis' | 'tax_settings' | 'company' | 'missing' | 'unavailable', required
        - `reportBasis` 'accrual' | 'cash', required
        - `fiscalYearEnd` string, nullable: companies.fiscal_year_end (MM-DD); null when not confirmed (#2019).
        - `fiscalYearReview` union: True when companies.fiscal_year_end is set and is not 12-31, or tax_settings.fiscal_year_end (month) is set and is not 12. Non-calendar fiscal years are not supported yet, so the statement is still calendar-year and must be reviewed. It is "unknown" when the company or tax-settings fiscal year end could not be read, never a silent false (#2019).
          - boolean
          - 'unknown'
        - `fiscalYearReviewReason` string, nullable: Why fiscalYearReview is raised, naming the field that raised it; null when not raised (#2019).
        - `cashBasis` CashBasisSummary: The `cashBasis` block of a statement whose `reportBasis` is `cash`. Present only then; an accrual statement has no such key. Money is integer ledger cents. Cash net income over the scope equals `accrualNetIncomeCents - timingMovementCents`, so the difference from accrual can be re-derived by hand. The view is not a GAAP statement; `basisNotice` says so and clients print it with the statement.
          - `policyId` 'cash-basis-v1', required
          - `policyVersion` integer, required: Revision of the rules under this policy id.
          - `reviewedBy` string, required: Reviewer of the policy the statement was calculated under.
          - `throughDate` string, date, required: The cash view was built from inception through this date.
          - `scope` CashBasisScope, required: What a cash-basis statement or refusal answers for. `range` (P&L, cash flow, income-statement drill-down) is blocked by a refusal dated inside `startDate`..`endDate`; `as_of` (balance sheet, trial balance, balance-sheet drill-down) by any refusal dated on or before `endDate`.
            - `kind` 'range' | 'as_of', required
            - `entityId` string, nullable, required: Null when the request named no entity.
            - `startDate` string, date, nullable, required: Null on `as_of`, and when the request carried no explicit start.
            - `endDate` string, date, nullable, required: Range end or as-of date. Null only when the request carried no explicit date.
          - `droppedEntryCount` integer, required: Entries left out of the cash view because they only move amounts between income or expense and a receivable, payable, deferred-revenue or accrued account. Whole view, inception through `throughDate`.
          - `retargetedLineCount` integer, required: Receivable or payable settlement lines moved onto the income or expense accounts of the invoice or bill they settle. Whole view, inception through `throughDate`.
          - `retargetedCents` integer, required: Sum of the retargeted settlement lines. Whole view, inception through `throughDate`.
          - `accrualNetIncomeCents` integer, required: Accrual net income over the scope (revenue minus expense, closing entries excluded).
          - `timingMovementCents` integer, required: Change over the scope in the debit-positive balance of the receivable, payable, deferred-revenue and accrued accounts, on the accrual ledger.
          - `evidence` object, required: Completeness figures over the scope. They have no basis effect.
            - `uncategorizedIncomeCents` integer, required
            - `uncategorizedExpenseCents` integer, required
            - `suspenseBalanceCents` integer, required: Balance of suspense and ask-my-client accounts at the scope's end, debit positive.
          - `reviewItemCount` integer, required: Review items dated inside the scope, including those beyond the cap on `reviewItems`.
          - `reviewItems` object[], required: Kept income or expense lines with no cash, card or clearing line behind them, earliest first. They are identical on both bases and listed for review. No memo or description text.
            - `kind` 'pnl_against_equity_or_suspense', required
            - `entryId` string, required
            - `entryDate` string, date, required
            - `accountCode` string, required: Code of the income or expense account.
            - `amountCents` integer, required: Ledger cents of that line.
          - `basisNotice` 'Cash basis. Not a GAAP statement: revenue is recognized when cash is received, not when performance obligations are satisfied (ASC 606).', required: Fixed wording that the view is not a GAAP statement. Clients print it with the statement instead of composing their own.
      - AccountantReportStatementUnavailable: Left in a statement's place in the accountant reports bundle when that statement could not be produced. The other statements of the bundle are unaffected.
        - `unavailable` true, required
        - `reason` string, required: Client-facing message. A literal for unexpected failures.
        - `code` string, required: Error code of the rejection. `CASH_BASIS_UNAVAILABLE` when the statement was asked on the cash basis and cannot be produced; `INTERNAL_ERROR` for an unexpected failure.
        - `traceId` union, required: Server log correlation id of the request.
          - string
          - integer
        - `details` CashBasisUnavailableExtensions: Why a cash-basis statement cannot be produced. Carries no memo or description text.
          - `cashBasis` object, required
            - `reasons` object[], required
              - …
            - `policyId` 'cash-basis-v1', required
            - `scope` CashBasisScope, required: What a cash-basis statement or refusal answers for. `range` (P&L, cash flow, income-statement drill-down) is blocked by a refusal dated inside `startDate`..`endDate`; `as_of` (balance sheet, trial balance, balance-sheet drill-down) by any refusal dated on or before `endDate`.
              - …

## Other responses

- `401`: Authentication required
- `403`: Insufficient permissions or not a company member
- `422`: `basis` is not `accrual` or `cash`. A cash statement that cannot be produced is not a 422 on this route: it is an unavailable statement inside the 200.

---

[API](https://skmtc.dev/medianfi/apis/median-api.md) · [All operations](https://skmtc.dev/medianfi/apis/median-api/llms.txt) · [OpenAPI document](https://skmtc.dev/medianfi/apis/median-api/revisions/20090ea32b0d?raw)
