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

# Verify a person

> Run KYC identity verification with name, DOB, SSN, and address checks, synthetic identity detection, velocity signals, and sanctions screening.

export const iconProps = (variant = "default") => {
  const iconVariants = {
    default: "palm-icon-default",
    horizontal: "palm-icon-horizontal",
    stack: "palm-icon-stack",
    navigation: "palm-icon-navigation",
    darkHorizontal: "palm-icon-dark-horizontal",
    dark_stack: "palm-icon-dark-stack",
    getStarted: "palm-icon-get-started"
  };
  return iconVariants[variant] ?? iconVariants.default;
};

export const PalmCard = ({title, description, icon, variant = "default", href, items}) => {
  if (variant === "getStarted") {
    return <div data-card className="pc-wrapper-get-started flex flex-col gap-4 border border-[rgba(4,44,47,0.1)] rounded-2xl p-6">
        <div className="pc-wrapper-inner-get-started">
          {icon !== undefined && <div className="pc-icon-container-get-started">{icon}</div>}
          {title !== undefined && <span className="pc-title-get-started">{title}</span>}
        </div>
        {items && items.length > 0 && <ul className="pc-items-get-started">
            {items.map((item, i) => <li key={i}>
                <a href={item.href} className="pc-item-link-get-started">{item.label}</a>
              </li>)}
          </ul>}
      </div>;
  }
  const variants = {
    default: {
      wrapper: "pc-wrapper-default",
      title: "pc-title",
      description: "pc-description"
    },
    horizontal: {
      wrapper: "pc-wrapper-card",
      title: "pc-title-horizontal",
      description: "pc-description"
    },
    stack: {
      wrapper: "pc-wrapper-stack",
      title: "pc-title-stack",
      description: "pc-description"
    },
    darkHorizontal: {
      wrapper: "pc-wrapper-dark-horizontal",
      title: "pc-title-dark-horizontal",
      description: "pc-description-dark-horizontal"
    },
    navigation: {
      wrapper: "pc-wrapper-navigation",
      title: "pc-title-navigation",
      description: "pc-description-navigation"
    },
    dark_stack: {
      icon: "pc-icon-card",
      title: "pc-title",
      description: "pc-description"
    }
  };
  const styles = variants[variant] ?? variants.default;
  const inner = <a data-card href={href ? href : '#'} className={`no-underline flex flex-col h-full items-start gap-4 p-6 rounded-2xl hover:opacity-80 transition-opacity ${styles.wrapper}`}>
      {icon !== undefined && <span className="icon-wrapper">{icon}</span>}
      {(title !== undefined || description !== undefined) && <div className="flex flex-col min-w-0">
          {title !== undefined && <span className={styles.title}>{title}</span>}
          {description !== undefined && <span className={styles.description}>{description}</span>}
        </div>}
    </a>;
  return inner;
};

Person verification (KYC — Know Your Customer) confirms that an individual is who they claim to be. Palm verifies identity against authoritative sources, detects synthetic identities, runs velocity checks, and screens against sanctions and watchlists.

<div className="semitransparent-image-wrapper">
  <img src="https://mintcdn.com/palmfinance/1RPIbiD5PV2g0B_e/images/VerifyPersonEyeCatch.webp?fit=max&auto=format&n=1RPIbiD5PV2g0B_e&q=85&s=65191107bac41e19573bc609c84cb478" alt="Image showcasing a form to collect information, and the output of an user verification request" style={{maxWidth: '1222px', width: '100%', margin: '0' }} width="2444" height="1012" data-path="images/VerifyPersonEyeCatch.webp" />
</div>

***

## What KYC verification checks

* **Identity matching:** Palm compares the submitted name, date of birth, SSN, and address against authoritative sources. Each field is checked independently, so you get granular results — you'll know if the name matched but the address didn't.

* **Synthetic identity detection:** A synthetic identity is a fabricated identity built by combining real and fake data. A fraudster might pair a real SSN (often belonging to a child, elderly person, or recent immigrant) with a fake name and address. These identities can pass basic checks because some of the data is real. Palm detects synthetic identities by analyzing patterns across identity attributes that indicate fabrication.

* **Velocity checks:** Palm tracks how frequently identity attributes appear across recent verifications. If the same SSN shows up in different verification requests in a week, that could be a strong fraud signal — even if each individual verification looks clean. Velocity checks catch patterns that point-in-time checks miss, including application fraud rings and credit stacking (rapidly applying for credit across multiple lenders).

* **Watchlist screening:** Palm screens against sanctions lists (OFAC SDN list and international equivalents), Politically Exposed Person (PEP) databases, and adverse media sources. A sanctions match means the person appears on a government list of individuals with whom financial transactions are restricted or prohibited. A PEP match means the person holds (or recently held) a prominent public function. PEPs aren't necessarily risky, but they require enhanced due diligence under most compliance frameworks.

## What you get back

* **Match results:** How each submitted field compares against authoritative identity records (`match`, `no_match`, `partial_match`, or `not_checked`).
* **Risk assessment:** A risk level (`low`, `medium`, `high`, or `critical`) with specific risk signals that explain the assessment.
* **Synthetic identity detection:** Whether Palm detects indicators of a fabricated identity.
* **Velocity checks:** How frequently identity attributes appear across recent verifications.
* **Watchlist screening:** Sanctions, PEP, and adverse media results.
* **Verification status:** `pending`, `in_progress`, `completed`, or `failed`.

## When to use this

Use person verification during onboarding, before extending credit, or when confirming authorized signers. Common scenarios: verifying beneficial owners, confirming officers during underwriting, or validating authorized representatives.

You can also verify people as part of a business verification by including them as associates. See [Verify a business](/verify/verify-a-business).

## Quickstart

**Prerequisites**

* A Palm API key — <span className="link-wrapper">[Get access](/get-started/get-access)</span>
* The person's name, date of birth, SSN, and address

### Verify a person

Send a `POST` request to `/v1/user/verification`:

```bash wrap Bash theme={null}
curl -X POST https://api.getpalm.com/v1/user/verification \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer sk_test_...' \
  -d '{
    "workflow_key": "user_verification_default",
    "first_name": "Jane",
    "last_name": "Smith",
    "date_of_birth": "1985-03-15",
    "ssn": "123-45-6789",
    "address_line_1": "100 Main Street",
    "city": "San Francisco",
    "region": "CA",
    "postal_code": "94105"
  }'
```

### Request fields

The minimum request requires a `workflow_key`, the person's name, date of birth, SSN, and address — this runs core identity matching. Beyond that, send every identity field you collect: optional fields each unlock additional fraud checks, so the more you send, the more complete the assessment.

If a check's input isn't provided, that check simply doesn't run — a missing input is **not** treated as a risk factor and won't appear in `risk.reasons`.

#### Optional fields and what they unlock

| Field                                                         | What it adds                                                                                                         |
| ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| <span className="initial-bold--success">`phone_number`</span> | Enables identity-theft risk scoring. If omitted, that check doesn't run and isn't counted for or against the result. |
| <span className="initial-bold--success">`email`</span>        | Adds email-based fraud and velocity signals.                                                                         |
| <span className="initial-bold--success">`ip_address`</span>   | Adds device/connection risk signals (session-based verifications).                                                   |

If your workflow is tuned for a specific field set and you're unsure what to send, <span className="link-wrapper">[contact us](mailto:support@getpalm.com)</span> — we'll align your workflow with the data you collect.

For the full field reference, types, and validation rules, see the [API Reference](/api-reference/introduction).

### Response

A successful verification returns match results, risk assessment, and - if associates were included - individual KYC results for each owner:

```json wrap JSON theme={null}
{
  "user_id": "usr_9b2c4d...",
  "verification_id": "ver_3e5f7a...",
  "status": "completed",
  "risk": {
    "level": "low",
    "reasons": []
  },
  "match": {
    "first_name": "match",
    "last_name": "match",
    "date_of_birth": "match",
    "ssn": "match",
    "address_line_1": "match",
    "city": "match",
    "region": "match",
    "postal_code": "match"
  },
  "synthetic": {
    "is_synthetic": false,
    "confidence_score": 12
  },
  "velocity": {
    "email": 1,
    "phone": 1,
    "ssn": 1,
    "address": 2
  },
  "watchlist": {
    "status": "clear"
  },
  "created_at": "2026-01-15T10:30:00Z"
}
```

### Understanding the response

| Field                                                                       | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| --------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <span className="initial-bold--success">`user_id`</span>                    | Palm's identifier for the verified person. Use this for re-verification and audit trails.                                                                                                                                                                                                                                                                                                                                                                                                                      |
| <span className="initial-bold--success">`verification_id`</span>            | Unique identifier for this verification run.                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| <span className="initial-bold--success">`status`</span>                     | Where the verification is in its lifecycle. `completed` means results are ready. `failed` means a system error occurred — retry the request.                                                                                                                                                                                                                                                                                                                                                                   |
| <span className="initial-bold--success">`risk.level`</span>                 | Overall risk assessment: `low`, `medium`, `high`, or `critical`. The level reflects the verification outcome — an identity that can't be verified against authoritative sources is elevated rather than returned as `low`. It also escalates on watchlist hits, synthetic-identity flags, field match failures, and address or identity red flags (for example a commercial or mail-drop address, no established history at the address, multiple identities tied to one address, or a thin identity history). |
| <span className="initial-bold--success">`risk.reasons`</span>               | The genuine risk factors that drove the assessment. An empty array means none were found — read it alongside `risk.level`. Checks that couldn't run because an optional input wasn't provided are **not** listed here. Example: `["identity_theft_indicators", "high_fraud_score"]`.                                                                                                                                                                                                                           |
| <span className="initial-bold--success">`synthetic.is_synthetic`</span>     | Whether Palm detected indicators of a fabricated identity. `true` automatically escalates risk significantly.                                                                                                                                                                                                                                                                                                                                                                                                  |
| <span className="initial-bold--success">`synthetic.confidence_score`</span> | Score from 0–100. Higher means more likely synthetic. Scores above 50 are concerning; above 70 are strong indicators of fabrication.                                                                                                                                                                                                                                                                                                                                                                           |
| <span className="initial-bold--success">`velocity`</span>                   | Count of recent verifications using each identity attribute. An `ssn` count of 1 means this SSN has only been seen in this verification. A count of 5+ in a short period is a fraud signal.                                                                                                                                                                                                                                                                                                                    |
| <span className="initial-bold--success">`watchlist.status`</span>           | `clear` means no matches. `potential_match` means a possible hit that needs review. `confirmed_match` means a definitive match against a sanctions, PEP, or adverse media list.                                                                                                                                                                                                                                                                                                                                |

### Watchlist matches

When `watchlist.status` is `potential_match` or `confirmed_match`, the response includes match details:

```json wrap JSON theme={null}
{
  "watchlist": {
    "status": "potential_match",
    "matches": [
      {
        "type": "pep",
        "name": "tauxbe",
        "confidence_score": 72
      }
    ]
  }
}
```

Each match includes a `type`:

* **`sanctions`:** OFAC SDN list and international sanctions lists. A confirmed sanctions match means you likely cannot do business with this person under US law. This is the most serious watchlist result.
* **`pep`:** Politically Exposed Person. The person holds or recently held a prominent public function. A PEP designation doesn't mean the person is risky — it means enhanced due diligence is required under most regulatory frameworks.
* **`adverse_media`:** Negative news coverage related to financial crime, fraud, or regulatory action. Adverse media hits provide context for risk decisions but aren't definitive on their own — they require human review.

The `confidence_score` (0–100) indicates how closely the watchlist record matches the submitted identity. Scores above 90 are high-confidence matches.

**Name-only matches.** PEP and adverse-media hits matched on name alone — without date-of-birth corroboration — are reported as `potential_match` with a confidence score rather than as confirmed matches, and don't inflate the risk level. This keeps common names from triggering false positives. Sanctions matches are treated as high priority.

## Match fields

KYC verification can return match results for these fields:

| Field                                                           | Description                                                                                                                                                                              |
| --------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <span className="initial-bold--success">`first_name`</span>     | Legal name only — "Bob" won't match "Robert" and will return `no_match` or `partial_match`.                                                                                              |
| <span className="initial-bold--success">`last_name`</span>      | Hyphenated names and name changes (marriage) can cause `partial_match` results.                                                                                                          |
| <span className="initial-bold--success">`middle_name`</span>    | Middle name, if provided.                                                                                                                                                                |
| <span className="initial-bold--success">`date_of_birth`</span>  | A `no_match` on DOB is a strong negative signal — dates of birth rarely have legitimate data entry errors.                                                                               |
| <span className="initial-bold--success">`ssn`</span>            | An SSN `no_match` is the strongest single negative signal — it means the SSN either doesn't exist, belongs to someone else, or was recently issued and hasn't propagated to all sources. |
| <span className="initial-bold--success">`email`</span>          | Email match against known identity records.                                                                                                                                              |
| <span className="initial-bold--success">`phone_number`</span>   | Phone number match.                                                                                                                                                                      |
| <span className="initial-bold--success">`address_line_1`</span> | Street address. People move frequently, so an address `no_match` on its own is less concerning than SSN or DOB mismatches.                                                               |
| <span className="initial-bold--success">`city`</span>           | City match.                                                                                                                                                                              |
| <span className="initial-bold--success">`region`</span>         | State/region match.                                                                                                                                                                      |
| <span className="initial-bold--success">`postal_code`</span>    | ZIP code match.                                                                                                                                                                          |

Only fields included in the verification request appear in match results. For match result types and risk level details, see [Verification Reference](/verify/verification-reference).

## Re-verification

Existing users can be re-verified by passing the `user_id`. Palm retrieves the current data from the vault and runs verification against stored values:

```bash wrap Bash theme={null}
curl -X POST https://api.getpalm.com/v1/user/usr_9b2c4d.../verification \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer sk_test_...' \
  -d '{
    "workflow_key": "user_verification_default",
    "reference_id": "reverify_67890"
  }'
```

Re-verification is useful when compliance requirements change, when there's a suspicious identity signal, or on a scheduled basis.

## Webhooks

Subscribe to `user.verification.completed` to receive async notification when a verification finishes. Webhook payloads include the verification ID, risk level, and summary match results.

## Next steps

<div className="grid lg:grid-cols-2 gap-6 mt-6">
  <PalmCard variant="navigation" title="Verify a business" description="Confirm that a business entity is real, registered, and in good standing." icon={<Icon className={iconProps("navigation")} icon="arrow-right" />} href="/verify/verify-a-business" />

  <PalmCard variant="navigation" title="Verification reference" description="Risk levels, risk signals, match results, and verification lifecycle details." icon={<Icon className={iconProps("navigation")} icon="arrow-right" />} href="/verify/verification-reference" />

  <PalmCard variant="navigation" title="Start monitoring" description="Track changes to verified businesses in real time." icon={<Icon className={iconProps("navigation")} icon="arrow-right" />} href="/monitor/overview" />

  <PalmCard variant="navigation" title="Onboard overview" description="Find and onboard businesses into your platform." icon={<Icon className={iconProps("navigation")} icon="arrow-right" />} href="/onboard/overview" />
</div>
