> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://developer.wealthatlas.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developer.wealthatlas.com/_mcp/server.

# Profile Schema

Every profile returned by the WealthAtlas API contains rich biographical, financial, and philanthropic data assembled from multiple public sources. This page explains the key concepts you'll encounter when working with person data.

## How Profiles Are Built

WealthAtlas aggregates data from public records — nonprofit tax filings (IRS 990s), political donation records, corporate filings, news articles, and other web sources. Our identity resolution system matches records across these sources to build a unified profile for each individual.

Because these records come from independent sources that don't share unique identifiers, WealthAtlas uses statistical matching to link them. This is why certain fields include a **probability** score.

## Person Model Reference

The full profile (`APIPerson`) contains the following fields:

### Identity & Demographics

| Field               | Type            | Description                                                                                                       |
| ------------------- | --------------- | ----------------------------------------------------------------------------------------------------------------- |
| `id`                | string          | WealthAtlas unique identifier                                                                                     |
| `name`              | PersonName      | Full name (title, first, middle, last, suffix)                                                                    |
| `sex`               | string \| null  | Sex of the person ("Male", "Female")                                                                              |
| `age`               | integer \| null | Age in years                                                                                                      |
| `religion`          | string \| null  | Religious affiliation                                                                                             |
| `is_deceased`       | boolean \| null | Whether the person is deceased (null = unknown)                                                                   |
| `mailing_address`   | Address \| null | Mailing address (street, city, state, zip)                                                                        |
| `city`              | string \| null  | City of the person                                                                                                |
| `state`             | string \| null  | State of the person                                                                                               |
| `primary_photo_url` | string \| null  | Signed URL to the person's primary photo, valid for at least an hour; fetch the image rather than storing the URL |
| `donoratlas_url`    | string          | Link to the person's profile on WealthAtlas                                                                       |
| `date_last_updated` | date            | When this profile was last refreshed                                                                              |

### Biographical

| Field         | Type                 | Description                                       |
| ------------- | -------------------- | ------------------------------------------------- |
| `bio`         | string\[]            | Biographical bullet points about the person       |
| `top_issues`  | DescribedIssueTag\[] | Philanthropic interest areas with explanations    |
| `source_urls` | string\[]            | All public source URLs used to build this profile |

### Financial

| Field                   | Type                   | Description                                                      |
| ----------------------- | ---------------------- | ---------------------------------------------------------------- |
| `net_worth_min`         | integer \| null        | Minimum estimated net worth in dollars                           |
| `net_worth_max`         | integer \| null        | Maximum estimated net worth in dollars                           |
| `net_worth_estimate`    | integer \| null        | Best-guess point estimate within the min/max bounds              |
| `liquidity_min`         | integer \| null        | Minimum estimated liquid assets in dollars                       |
| `liquidity_max`         | integer \| null        | Maximum estimated liquid assets in dollars                       |
| `liquidity_explanation` | string \| null         | Short explanation of the liquidity estimate                      |
| `salary`                | Salary \| null         | Estimated annual employment compensation, with a per-year series |
| `income_sources`        | IncomeSource\[]        | Identified income sources (salary, fund carry, inheritance, ...) |
| `assets`                | Asset\[]               | Identified non-cash assets (equity, real estate, ...)            |
| `political_stats`       | PoliticalStats \| null | Political donation statistics and capacity                       |
| `nonprofit_stats`       | NonprofitStats \| null | Nonprofit donation statistics and capacity                       |

### Affiliations

| Field                 | Type                 | Description                                                                  |
| --------------------- | -------------------- | ---------------------------------------------------------------------------- |
| `education`           | Education\[]         | Schools and universities attended                                            |
| `work`                | Work\[]              | Employment history                                                           |
| `board_affiliations`  | BoardAffiliation\[]  | Nonprofit board memberships (with [probability scores](#probability-scores)) |
| `donations`           | Donation\[]          | Nonprofit donations (with [probability scores](#probability-scores))         |
| `private_foundations` | PrivateFoundation\[] | Private foundation relationships                                             |

## Probability Scores

Several fields on the profile include a `probability` value between 0 and 1. This represents **WealthAtlas's confidence that the record belongs to this specific person**, not the probability that the event occurred.

For example, a `board_affiliation` with `probability: 0.92` means WealthAtlas is 92% confident that this board membership record belongs to the person shown in the profile — and 8% that it belongs to a different person with a similar name. The record itself is from an authoritative source (typically an IRS 990 filing).

### Fields with probability scores

| Field                              | Description                                                                   |
| ---------------------------------- | ----------------------------------------------------------------------------- |
| `board_affiliations[].probability` | Confidence that this nonprofit board membership record belongs to this person |
| `donations[].probability`          | Confidence that this nonprofit donation record belongs to this person         |

### How to use probability scores

* **≥ 0.90** — High confidence. Safe to present to end users without qualification.
* **0.70 – 0.89** — Moderate confidence. Consider noting that the association is likely but not certain.
* **\< 0.70** — Lower confidence. The record may belong to a different person with a similar name. Use with caution.

You can filter results by probability in your application to control data quality. For most use cases, a threshold of 0.70 or higher is recommended.

## Data Sources

Many sub-models (Education, Work, BoardAffiliation, Donation, PrivateFoundation) include a `source_urls` array containing URLs where the information was found. These are the original public sources WealthAtlas used to build the record — typically nonprofit websites, government databases, news articles, or corporate filings.

The top-level `source_urls` field on the profile lists all source URLs aggregated across the entire profile.

## Financial Fields

### Net Worth

`net_worth_min` and `net_worth_max` are the estimated bounds of the person's net worth in dollars. These are derived from real estate records, political giving patterns, nonprofit giving patterns, and other public financial indicators. They are estimates, not exact figures.

When the underlying model produces one, `net_worth_estimate` is a best-guess point within those bounds — useful when you need a single number rather than a range. It is null for persons where only the range is available.

### Liquidity

`liquidity_min` and `liquidity_max` estimate the person's liquid assets — wealth accessible within roughly twelve months, as opposed to wealth locked up in homes, private companies, or retirement accounts. `liquidity_explanation`, when present, is a short sentence describing how the band was derived. All three are null when no liquidity estimate exists.

Search can be slightly broader here than the profile: the search index always carries the best available liquidity estimate, so a person may occasionally match a liquidity search filter (and return a liquidity range in search results) while these profile fields are null.

The net worth estimate includes explanations of the contributing factors via `nonprofit_stats.capacity.explanations`. Each explanation has a `title` (e.g., "Real Estate Holdings") and a `reason` describing how that factor contributes to the estimate.

### Salary

`salary` summarizes the person's estimated annual employment compensation:

* `min` / `max` — the current (or most recent) estimated annual compensation range in dollars.
* `by_year` — the same range for each calendar year of the person's priced career, keyed by year (e.g. `{"2019": [90000, 130000], "2025": [180000, 260000]}`). The series is designed to be graphed as an earnings trajectory. Years in which no salaried role was active — gaps between jobs — are omitted from the dictionary rather than reported as zero.

When the person holds several salaried roles at once (for example an executive role and a paid board seat), each year's range sums the roles active that year. `salary` is null when no salary estimate exists.

These are model estimates derived from roles, employers, and public compensation disclosures — not payroll figures.

### Income Sources

`income_sources` lists every income source identified for the person. Each entry has:

* `type` — one of `salary`, `profit_share`, `fund_salary`, `fund_carry`, `fund_mgmt_fee`, `performance_earnings`, `inheritance`, `realized_proceeds`, or `other`.
* `name` and `role` — the entity the income comes from and the person's role there, when applicable.
* `frequency` — `annual` for an ongoing flow (amounts are a yearly rate) or `one_time` for a single event (amounts are the total from the event).
* `year_range` — the `[start, end]` years the income covers; both ends equal the event year for one-time income.
* `amount_min` / `amount_max` — the estimated dollar range.
* `description` — a short natural-language summary, when available.

Salary income appears both here (as individual entries) and aggregated in the `salary` block, so `income_sources` alone is a complete census of known income.

### Assets

`assets` lists the person's identified non-cash holdings. Each entry has a `type` (`public_equity`, `private_equity`, `real_estate`, `investment_vehicle`, or `other`), a `name` for the company or holding (when available), a `value_min` / `value_max` estimated dollar range, and an optional `description`.

### Wealth fields, together

How the pieces above look on one person — a fund manager with a researched profile:

```json
{
  "net_worth_min": 30000000,
  "net_worth_max": 70000000,
  "net_worth_estimate": 45000000,
  "liquidity_min": 4500000,
  "liquidity_max": 9500000,
  "liquidity_explanation": "Most wealth is locked in fund positions; liquid reserves cover roughly a year of major commitments.",
  "salary": {
    "min": 450000,
    "max": 790000,
    "by_year": {
      "2018": [150000, 250000],
      "2019": [181250, 306250],
      "2025": [418750, 733750],
      "2026": [450000, 790000]
    }
  },
  "income_sources": [
    {
      "type": "salary",
      "name": "Acme Capital",
      "role": "Managing Partner",
      "frequency": "annual",
      "year_range": [2018, 2026],
      "amount_min": 400000,
      "amount_max": 700000,
      "description": "Earns an estimated $400K-$700K in salary at Acme Capital."
    },
    {
      "type": "fund_carry",
      "name": "Acme Capital",
      "role": "Managing Partner",
      "frequency": "annual",
      "year_range": [2020, 2026],
      "amount_min": 675000,
      "amount_max": 1125000,
      "description": "Carried interest from Acme Capital's funds."
    },
    {
      "type": "realized_proceeds",
      "name": "Acme IPO",
      "role": null,
      "frequency": "one_time",
      "year_range": [2021, 2021],
      "amount_min": 2000000,
      "amount_max": 5000000,
      "description": "Realized an estimated $2M-$5M selling shares in the IPO."
    }
  ],
  "assets": [
    {
      "type": "public_equity",
      "name": "Acme Corp",
      "value_min": 3000000,
      "value_max": 8000000,
      "description": "Holds an estimated $3M-$8M of Acme stock."
    },
    {
      "type": "real_estate",
      "name": null,
      "value_min": 2500000,
      "value_max": 3500000,
      "description": "Primary residence."
    }
  ]
}
```

Note the shapes worth writing client code against: `by_year` keys are strings (JSON object keys always are), one-time income repeats its event year at both ends of `year_range`, and `name` can be null on both income sources and assets.

### Giving Capacity

`political_stats.capacity` is the predicted political giving capacity for the current 2-year cycle.

`nonprofit_stats.capacity` is a `NonprofitGivingCapacity` object containing:

* `predicted_annual_giving` — the predicted annual nonprofit giving capacity in dollars
* `explanations` — a list of factors that contributed to the estimate, each with a `title` and `reason`

Both are **forward-looking predictions** based on historical patterns, not historical totals.

### Donation Amounts

`donations[].amount_range` is a `[min, max]` array representing the estimated total amount donated to a specific nonprofit. Because nonprofit donation records are most often reported in bands (e.g., "$250–$499") rather than exact amounts, the API returns a range.

`nonprofit_stats.total_amt_range` follows the same pattern for the aggregate total across all nonprofits.

## Top Issues

`top_issues` is a list of philanthropic interest areas (e.g., "education", "environment", "healthcare") that WealthAtlas has inferred from the person's giving history, board affiliations, and biographical information. Each issue includes a description explaining why it was assigned.

## Deceased Status

`is_deceased` indicates whether WealthAtlas has found evidence that the person is deceased. A value of `null` means the status is unknown — it does **not** necessarily mean the person is alive.

## Profile Freshness

`date_last_updated` indicates when WealthAtlas last refreshed the person's profile. Profiles are updated periodically as new public records become available. You can use this field to assess data recency.