---
title: "QuickBooks ↔ Median parity per account, to the cent (#2642)"
method: GET
path: "/accountant/companies/{customerId}/integrations/quickbooks/parity"
tags: ["Accountants"]
---

# QuickBooks ↔ Median parity per account, to the cent (#2642)

`GET /accountant/companies/{customerId}/integrations/quickbooks/parity`

## Request

- Base URL: `https://api.medianfi.com/api/v1`
- URL: `https://api.medianfi.com/api/v1/accountant/companies/{customerId}/integrations/quickbooks/parity`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Without `asOf`, returns the latest stored check (null when none has run). With `asOf`, reads QuickBooks' TrialBalance as of that date and ProfitAndLoss from the posting cutoff through it, compares each mapped account with Median's GL at a 0-cent tolerance, stores the result and returns it. Before the cutoff the status is `not_applicable` and QuickBooks is not called. Read-only toward QuickBooks and the GL; a daily check also runs after each completed QuickBooks read. The result is information and never blocks posting or approval.

## Query parameters

- `asOf` string, date

## Response `200`

Parity result (or null when no check exists and asOf was omitted)

- object
  - `success` true, required
  - `data` QuickBooksParityResult, required
    - `status` 'matches' | 'differs' | 'not_applicable', required: `not_applicable` when asOfDate is before the posting cutoff (nothing is read or stored).
    - `asOfDate` string, date, required
    - `cutoffDate` string, date, required
    - `toleranceCents` 0, required
    - `counts` object, required
      - `compared` integer, required
      - `differing` integer, required
      - `unmappedWithBalance` integer, required
      - `medianOnlyBalance` integer, required
    - `balanceSheet` QuickBooksParityLine[], required: QuickBooks TrialBalance as of asOfDate against Median's ending balances.
      - `section` 'balance_sheet' | 'profit_and_loss', required
      - `kind` 'mapped' | 'retained_earnings' | 'unmapped_with_balance' | 'median_only_balance', required: `retained_earnings` compares Retained Earnings plus every income/expense account on each side (QuickBooks keeps the fiscal year on the P&L rows; Median's opening rolled pre-cutoff P&L into Retained Earnings). `unmapped_with_balance`: a QuickBooks account with a balance and no Median mapping. `median_only_balance`: a Median account with a balance and no QuickBooks counterpart.
      - `glAccountId` string, uuid, nullable, required
      - `glAccountCode` string, nullable, required
      - `glAccountName` string, nullable, required
      - `normalBalance` 'debit' | 'credit', required: Display hint only; amounts are debit minus credit
      - `qboAccounts` object[], required: QuickBooks accounts compared in aggregate on this line (several may map to one Median account).
        - `qboAccountId` string, nullable, required
        - `name` string, required
        - `netCents` integer, required: Debit minus credit in integer cents
      - `qboNetCents` integer, required: Debit minus credit in integer cents
      - `medianNetCents` integer, required: Debit minus credit in integer cents
      - `differenceCents` integer, required: medianNetCents minus qboNetCents
      - `matches` boolean, required
    - `profitAndLoss` QuickBooksParityLine[], required: QuickBooks ProfitAndLoss for cutoffDate..asOfDate against Median's period activity.
      - `section` 'balance_sheet' | 'profit_and_loss', required
      - `kind` 'mapped' | 'retained_earnings' | 'unmapped_with_balance' | 'median_only_balance', required: `retained_earnings` compares Retained Earnings plus every income/expense account on each side (QuickBooks keeps the fiscal year on the P&L rows; Median's opening rolled pre-cutoff P&L into Retained Earnings). `unmapped_with_balance`: a QuickBooks account with a balance and no Median mapping. `median_only_balance`: a Median account with a balance and no QuickBooks counterpart.
      - `glAccountId` string, uuid, nullable, required
      - `glAccountCode` string, nullable, required
      - `glAccountName` string, nullable, required
      - `normalBalance` 'debit' | 'credit', required: Display hint only; amounts are debit minus credit
      - `qboAccounts` object[], required: QuickBooks accounts compared in aggregate on this line (several may map to one Median account).
        - `qboAccountId` string, nullable, required
        - `name` string, required
        - `netCents` integer, required: Debit minus credit in integer cents
      - `qboNetCents` integer, required: Debit minus credit in integer cents
      - `medianNetCents` integer, required: Debit minus credit in integer cents
      - `differenceCents` integer, required: medianNetCents minus qboNetCents
      - `matches` boolean, required
    - `clearingAccounts` object[], required: Median-internal clearing accounts (1050, 1080, 4999), listed beside the lines.
      - `glAccountId` string, uuid, required
      - `code` string, required
      - `name` string, required
      - `endingNetCents` integer, required
      - `periodNetCents` integer, required
    - `outstanding` object: #2642: QuickBooks objects dated on/after the cutoff that automatic posting could not post (blocked, failed, or changed and awaiting review), by code. Absent on checks stored before automatic posting.
      - `count` integer, required
      - `byCode` object, required
    - `checkId` string, uuid, nullable, required
    - `trigger` 'daily' | 'on_demand' | 'null', nullable, required
    - `checkedAt` string, date-time, nullable, required

## Other responses

- `401`: Authentication required
- `403`: Insufficient permissions or not a company member
- `422`: Validation error, QuickBooks not connected, no cutoff, no completed QuickBooks read, or a report period/basis/currency mismatch
- `503`: QuickBooks is unavailable or returned an unexpected report

---

[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)
