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

# Account Facts

> Object reference for the account_facts field — crystallized title review judgements returned on complete title entries

## Overview

`account_facts` is a top-level field on title entries (`DynamoDBEntry`) that packages four yes/no judgements an integration partner needs at a glance. Each fact includes a plain-language `summary` and `references` back into the underlying data.

Facts are derived from the **vehicle reconciliation engine** — the same projection that powers title review — not from raw `account_data` alone. They are computed **live on read** when you call `GET /title/{id}` (or the reconcile endpoint for opted-in orgs) and are only present when `job_status` is `complete`.

<Warning>
  **Preview / not GA.** `account_facts` is currently returned only for eligible preview organizations. Other organizations receive no behavior change. Treat this surface as subject to change until generally available.
</Warning>

<Note>
  `account_discrepancies` and `account_matches` are deprecated in favor of `account_facts`. Prefer reading `account_facts` for title review automation.
</Note>

***

## When it appears

| Condition                               | Result                                     |
| --------------------------------------- | ------------------------------------------ |
| Organization is opted in to the preview | `account_facts` may be included            |
| `job_status` is not `complete`          | Field is omitted                           |
| Reconciliation or fact derivation fails | Field is omitted (response still succeeds) |

Borrower-related facts compare against the **originally submitted** obligor borrowers from the `POST /title` request (stored in the "Initial API Call Data" attachment), not the live `account_data.loan.borrower[]` array, which enrichment may overwrite with materialized title owners.

***

## Object shape

```typescript theme={null}
interface AccountFacts {
  computed_at: string;   // ISO 8601 — when facts were derived
  source: "reconcile";   // Provenance of the judgements

  borrower_on_title: AccountFact;
  borrower_signature_only_needed_for_title: AccountFact;
  has_problematic_brands: AccountFact;
  are_there_active_liens: AccountFact;
}

interface AccountFact {
  value: boolean;
  summary: string;
  references: AccountFactReference[];
}

interface AccountFactReference {
  field_path: string;    // JSON pointer, e.g. "/vehicle/title/owners"
  value: unknown;
  from?: {
    kind: "submitted_borrower" | "reconciled_title";
    ref_id?: string;
  };
}
```

***

## The four facts

### `borrower_on_title`

**Question:** Do all submitted obligor borrowers appear on the title?

* **`true`** — Every submitted borrower fuzzy-matches at least one reconciled title owner.
* **`false`** — At least one submitted borrower does not match any owner, **or** there were no submitted borrowers / no reconciled owners to compare.

Name matching tolerates case, punctuation, `Last, First` order, middle initials, and common nickname prefixes. Non-obligor borrowers (`is_nonobligor: true`) are excluded from the submitted set.

When `false` because of a mismatch, `references` cite the **unmatched** borrower(s) plus the owner list. When `true`, references cite the matched borrower(s) plus owners.

### `borrower_signature_only_needed_for_title`

**Question:** Can the borrower sign alone (without other owners)?

* **`true`** when either:
  * The title is an **OR** title (`vehicle.title.is_or === true`), or
  * Every reconciled title owner is a submitted borrower (wholly borrower-owned).
* **`false`** when the title is AND/joint and not wholly borrower-owned, **or** when no reconciled owners are available to evaluate.

OR titles always yield `true` regardless of borrower ownership.

### `has_problematic_brands`

**Question:** Does the title carry a title-impairing brand?

* **`true`** — At least one problematic brand is present on `vehicle.title.brands` (or legacy `vehicle.title.brand`).
* **`false`** — No problematic brands found, or no brand data available.

**Problematic brands** include salvage-family, flood/fire, lemon/buyback, junk, and export-only brands such as `SALVAGE`, `REBUILT`, `FLOOD`, `JUNK`, `LEMON`, `EXPORT_ONLY`, and related variants.

**Excluded** (not title-blocking on their own): odometer brands (`ACTUAL_MILEAGE`, `EXEMPT_ODOMETER`, etc.) and administrative brands (`MEMORANDUM_COPY`, etc.).

### `are_there_active_liens`

**Question:** Are there unreleased liens on the title?

* **`true`** — At least one lien in `active_liens` lacks `lien_release_signed: true`, **or** `has_liens` is true with no lien detail.
* **`false`** — All liens are released, no liens exist, or no lien data is available.

When active liens exist, `references` point to each unreleased lienholder name.

***

## Interpreting `value: false`

For all four facts, **`false` is overloaded**. It can mean either:

1. A genuine **negative** answer (e.g. borrower is not on title), or
2. **Insufficient data** to decide (e.g. enrichment still running, no submitted borrowers, no reconciled owners).

There is no separate tri-state field today. Read the `summary` string to disambiguate — it explicitly states when inputs were missing (e.g. "No submitted borrower names were available…").

<Note>
  A future explicit `determinable` or tri-state field is tracked as a partner-facing contract change. Until then, parse `summary` or wait until `job_status` is `complete` and enrichment has populated owners/brands/liens.
</Note>

***

## Example response

```json theme={null}
{
  "entryId": "550e8400-e29b-41d4-a716-446655440000",
  "job_status": "complete",
  "account_data": { "...": "..." },
  "account_facts": {
    "computed_at": "2026-06-18T18:42:11.123Z",
    "source": "reconcile",
    "borrower_on_title": {
      "value": false,
      "summary": "Borrower(s) THOMAS AAA do not match any title owner (SUSAN RODRIGUEZ, KAREN ROSE ANDERSON).",
      "references": [
        {
          "field_path": "/loan/borrower/0/name",
          "value": "THOMAS AAA",
          "from": { "kind": "submitted_borrower", "ref_id": "loan.borrower[0]" }
        },
        {
          "field_path": "/vehicle/title/owners",
          "value": ["SUSAN RODRIGUEZ", "KAREN ROSE ANDERSON"],
          "from": { "kind": "reconciled_title" }
        }
      ]
    },
    "borrower_signature_only_needed_for_title": {
      "value": false,
      "summary": "Title is an AND/joint title not wholly owned by the borrower; additional owner signatures are likely required.",
      "references": [
        {
          "field_path": "/vehicle/title/is_or",
          "value": false,
          "from": { "kind": "reconciled_title" }
        },
        {
          "field_path": "/vehicle/title/owners",
          "value": ["SUSAN RODRIGUEZ", "KAREN ROSE ANDERSON"],
          "from": { "kind": "reconciled_title" }
        }
      ]
    },
    "has_problematic_brands": {
      "value": false,
      "summary": "No problematic title brands (e.g. salvage, flood, junk) were found.",
      "references": [
        {
          "field_path": "/vehicle/title/brands",
          "value": null,
          "from": { "kind": "reconciled_title" }
        }
      ]
    },
    "are_there_active_liens": {
      "value": true,
      "summary": "Title has 1 active (unreleased) lien(s): First National Bank.",
      "references": [
        {
          "field_path": "/vehicle/title/active_liens/0/lienholder/name",
          "value": "First National Bank",
          "from": { "kind": "reconciled_title", "ref_id": "lien_date:01/20/2023" }
        }
      ]
    }
  }
}
```

***

## Related endpoints

<CardGroup cols={2}>
  <Card title="Get Title Entry" icon="file-lines" href="/api-reference/v1/get_title">
    `GET /title/{id}` — primary surface where `account_facts` is returned for preview orgs
  </Card>

  <Card title="Core Ontology" icon="diagram-project" href="/guides/core-ontology">
    Background on `AccountData`, `Vehicle`, and reconciliation inputs
  </Card>
</CardGroup>
