Underwriting is Moov's risk assessment process that lets us safely enable payment capabilities for accounts on your platform.

As a payment processor, Moov is required to do due diligence and understand an account's business model, transaction patterns, and risk profile before enabling money movement capabilities. Through underwriting, we can understand and prevent unnecessary financial risk while ensuring high-volume established businesses have adequate processing thresholds.

## Quick start

Underwriting is required for all capabilities except `transfers`. Here's what you need to know:

1. **Request capabilities** → Moov returns the baseline required underwriting fields
2. **Submit underwriting data** → Use the [underwriting API](https://docs.moov.io/api/moov-accounts/underwriting/post/)
3. **Re-check capabilities** → Additional requirements may appear based on the submitted values
4. **Repeat until no requirements remain** → Once all requirements are met, capabilities are enabled

Most approvals are instant. Some high-volume or high-risk profiles may take up to two business days.

## How requirements work

Underwriting requirements are **tiered** based on the account's business profile. This means low-volume, US-only businesses have minimal requirements, while higher-volume or international businesses need to provide more detail.

### Baseline requirements (all capabilities)

Every capability requires these two fields:

| Field | Description | Values |
| --- | --- | --- |
| `geographicReach` | Where are the account's customers located? | `us-only`, `us-and-international`, `international-only` |
| `monthlyVolumeRange` | Estimated monthly transaction volume for the capability | See [volume ranges](https://docs.moov.io/guides/accounts/requirements/underwriting/#volume-ranges) |

**Fast path:** If `geographicReach` is `us-only` AND `monthlyVolumeRange` is `under-10k`, these are the only fields required for most capabilities.

### Extended requirements

These fields are required when **either** of the following is true:

- `monthlyVolumeRange` is greater than `under-10k`
- `geographicReach` is `us-and-international` or `international-only`

| Field | Description | Format |
| --- | --- | --- |
| `businessPresence` | How does the business operate? | See [business presence types](https://docs.moov.io/guides/accounts/requirements/underwriting/#business-presence-types) |
| `volumeShareByCustomerType` | Percentage of transactions that are B2B vs B2C vs P2P | Object with `business`, `consumer`, `p2p` (must total 100) |
| `pendingLitigation` | Current or pending legal matters | See [pending litigation](https://docs.moov.io/guides/accounts/requirements/underwriting/#pending-litigation) |
| `averageTransactionAmount` | Average transaction size in USD | Integer (per capability) |
| `maximumTransactionAmount` | Maximum transaction size in USD | Integer (per capability) |

### Card payment requirements

The `collect-funds.card-payments` capability has additional requirements:

| Condition | Additional fields required |
| --- | --- |
| All card accounts | [`currentlyAcceptsCards`](https://docs.moov.io/guides/accounts/requirements/underwriting/#card-acceptance), [`cardAcceptanceMethods`](https://docs.moov.io/guides/accounts/requirements/underwriting/#card-acceptance-methods) |
| Card-not-present accounts (`inPersonPercentage` < 80%) | [`fulfillment`](https://docs.moov.io/guides/accounts/requirements/underwriting/#fulfillment), [`refundPolicy`](https://docs.moov.io/guides/accounts/requirements/underwriting/#refund-policy-options) |
| Currently accepts cards (`currentlyAcceptsCards` = true) | Upload processing statements via [files API](https://docs.moov.io/api/moov-accounts/files/post/) |

## Capabilities reference

All capabilities follow the same tiered requirement structure. The table below shows available capabilities:

| Capability | Description |
| --- | --- |
| **Collect funds** |  |
| `collect-funds.ach` | Pull funds via ACH debit |
| `collect-funds.card-payments` | Accept cards and digital wallets (e.g. Apple/Google Pay) |
| **Send funds** |  |
| `send-funds.ach` | Push funds via ACH credit (standard or same-day) |
| `send-funds.push-to-card` | Instant disbursement via Visa Direct or Mastercard Send |
| `send-funds.instant-bank` | Instant bank transfers via RTP |
| **Money transfer** |  |
| `money-transfer.pull-from-card` | Pull funds from debit/prepaid cards for me-to-me account funding or person-to-person |
| `money-transfer.push-to-card` | Push funds to debit/prepaid cards for me-to-me transfers or person-to-person |

## API workflow

### Check requirements

Use the [capabilities API](https://docs.moov.io/api/moov-accounts/capabilities/list/) to see what's required. Underwriting fields are prefixed with `underwriting.`:

Ask

```json
{
  "capability": "collect-funds.card-payments",
  "status": "pending",
  "requirements": {
    "currentlyDue": [
      "underwriting.geographicReach",
      "underwriting.collectFunds.cardPayments.estimatedActivity.monthlyVolumeRange"
    ]
  }
}
```

### Submit underwriting data

Use the [underwriting POST endpoint](https://docs.moov.io/api/moov-accounts/underwriting/post/) to submit data:

Ask

```json
{
  "geographicReach": "us-only",
  "collectFunds": {
    "cardPayments": {
      "estimatedActivity": {
        "monthlyVolumeRange": "under-10k"
      }
    }
  }
}
```

The POST endpoint is required for API versions v2025.07.00 and later.

### Check for additional requirements

Re-query capabilities after each submission. New requirements may appear based on the submitted values:

Ask

```json
{
  "capability": "collect-funds.card-payments",
  "status": "pending",
  "requirements": {
    "currentlyDue": [
      "underwriting.pendingLitigation",
      "underwriting.businessPresence",
      "underwriting.volumeShareByCustomerType",
      "underwriting.collectFunds.cardPayments.estimatedActivity.averageTransactionAmount",
      "underwriting.collectFunds.cardPayments.estimatedActivity.maximumTransactionAmount"
    ]
  }
}
```

### Repeat until complete

Continue submitting data until `currentlyDue` is empty and `status` changes to `enabled`.

## Full example

This example onboards an account requesting `collect-funds.ach` and `collect-funds.card-payments`.

### Request capabilities

Ask

```bash
curl -X POST "https://api.moov.io/accounts/{accountID}/capabilities" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "capabilities": [
      "collect-funds.ach",
      "collect-funds.card-payments"
    ]
  }'
```

**Response:** Initial requirements for both capabilities:

Ask

```json
[
  {
    "capability": "collect-funds.ach",
    "status": "pending",
    "requirements": {
      "currentlyDue": [
        "underwriting.geographicReach",
        "underwriting.collectFunds.ach.estimatedActivity.monthlyVolumeRange"
      ]
    }
  },
  {
    "capability": "collect-funds.card-payments",
    "status": "pending",
    "requirements": {
      "currentlyDue": [
        "underwriting.geographicReach",
        "underwriting.collectFunds.cardPayments.estimatedActivity.monthlyVolumeRange"
      ]
    }
  }
]
```

### Submit baseline underwriting

Submit geographic reach and volume estimates:

Ask

```json
{
  "geographicReach": "us-only",
  "collectFunds": {
    "ach": {
      "estimatedActivity": {
        "monthlyVolumeRange": "under-10k"
      }
    },
    "cardPayments": {
      "estimatedActivity": {
        "monthlyVolumeRange": "10k-50k"
      }
    }
  }
}
```

**Result:** ACH is approved (low volume, US-only). Card payments triggers extended requirements because volume exceeds `under-10k`:

Ask

```json
[
  {
    "capability": "collect-funds.ach",
    "status": "enabled",
    "requirements": {}
  },
  {
    "capability": "collect-funds.card-payments",
    "status": "pending",
    "requirements": {
      "currentlyDue": [
        "underwriting.pendingLitigation",
        "underwriting.businessPresence",
        "underwriting.volumeShareByCustomerType",
        "underwriting.collectFunds.cardPayments.estimatedActivity.averageTransactionAmount",
        "underwriting.collectFunds.cardPayments.estimatedActivity.maximumTransactionAmount",
        "underwriting.collectFunds.cardPayments.currentlyAcceptsCards",
        "underwriting.collectFunds.cardPayments.cardAcceptanceMethods"
      ]
    }
  }
]
```

### Submit extended requirements

Complete all remaining requirements:

Ask

```json
{
  "pendingLitigation": "none",
  "businessPresence": "online-only",
  "volumeShareByCustomerType": {
    "business": 80,
    "consumer": 20,
    "p2p": 0
  },
  "collectFunds": {
    "cardPayments": {
      "estimatedActivity": {
        "averageTransactionAmount": 150,
        "maximumTransactionAmount": 1000
      },
      "currentlyAcceptsCards": true,
      "cardAcceptanceMethods": {
        "inPersonPercentage": 10,
        "onlinePercentage": 90,
        "mailOrPhonePercentage": 0
      },
      "fulfillment": {
        "method": "shipped-physical-goods",
        "timeframe": "within-7-days"
      },
      "refundPolicy": "full-refund-within-30-days"
    }
  }
}
```

### Upload documents (if required)

If the account currently accepts cards, upload processing statements:

Ask

```bash
curl -X POST "https://api.moov.io/accounts/{accountID}/files" \
  -H "Authorization: Bearer {token}" \
  -F "file=@/path/to/processing-statement.pdf" \
  -F "filePurpose=underwriting"
```

## Reference

Use the following sections as a reference for various parts of the underwriting process.

### Volume ranges

Select the range that matches the account's expected monthly transaction volume for `monthlyVolumeRange`:

| Value | Range |
| --- | --- |
| `under-10k` | Less than $10,000 |
| `10k-50k` | $10,000 – $50,000 |
| `50k-100k` | $50,000 – $100,000 |
| `100k-250k` | $100,000 – $250,000 |
| `250k-500k` | $250,000 – $500,000 |
| `500k-1m` | $500,000 – $1,000,000 |
| `1m-5m` | $1,000,000 – $5,000,000 |
| `over-5m` | Over $5,000,000 |

### Business presence types

Select the option that best describes how the business operates for `businessPresence`:

| Value | Description |
| --- | --- |
| `commercial-office` | Traditional office space |
| `retail-storefront` | Physical retail location |
| `home-based` | Operated from residential address |
| `online-only` | No physical customer interaction |
| `mobile-business` | Service provider that travels to customers |
| `mixed-presence` | Combination of physical and online |

### Pending litigation

Select the option that applies to current or pending legal matters for `pendingLitigation`:

| Value | Description |
| --- | --- |
| `none` | No current or pending litigation |
| `government-enforcement-or-investigation` | Regulatory investigations or enforcement actions |
| `fraud-or-financial-crime` | Allegations of fraud or financial misconduct |
| `consumer-protection-or-class-action` | Consumer complaints or class action suits |
| `data-breach-or-privacy` | Data security or privacy violations |
| `bankruptcy-or-insolvency` | Financial distress proceedings |
| `employment-or-workplace-disputes` | Employee-related legal issues |
| `personal-injury-or-medical` | Injury or medical malpractice claims |
| `intellectual-property` | Patent, trademark, or copyright disputes |
| `other` | Other significant legal matters |

### Card acceptance

Indicate whether the business currently accepts card payments for `currentlyAcceptsCards`:

| Value | Description |
| --- | --- |
| `true` | Business currently accepts card payments (requires uploading processing statements) |
| `false` | Business does not currently accept card payments |

### Card acceptance methods

Describe the distribution of card transactions by payment channel for `cardAcceptanceMethods`. All three percentages must total 100:

| Field | Description |
| --- | --- |
| `inPersonPercentage` | Percentage of transactions where the card is present (POS, tap-to-pay) |
| `onlinePercentage` | Percentage of transactions from online/ecommerce channels |
| `mailOrPhonePercentage` | Percentage of transactions via mail order or phone order (MOTO) |

**Example:**

Ask

```json
{
  "cardAcceptanceMethods": {
    "inPersonPercentage": 10,
    "onlinePercentage": 85,
    "mailOrPhonePercentage": 5
  }
}
```

If `inPersonPercentage` is less than 80%, [`fulfillment`](https://docs.moov.io/guides/accounts/requirements/underwriting/#fulfillment) and [`refundPolicy`](https://docs.moov.io/guides/accounts/requirements/underwriting/#refund-policy-options) details are also required.

### Fulfillment

For card-not-present accounts, provide details on how goods or services are delivered. The `fulfillment` object contains two fields:

| Field | Description |
| --- | --- |
| `method` | How the account's customers receive their purchase — see [method values](https://docs.moov.io/guides/accounts/requirements/underwriting/#fulfillment-methods) below |
| `timeframe` | When the account's customers typically receive their purchase — see [timeframe values](https://docs.moov.io/guides/accounts/requirements/underwriting/#fulfillment-timeframes) below |

**Example:**

Ask

```json
{
  "fulfillment": {
    "method": "shipped-physical-goods",
    "timeframe": "within-7-days"
  }
}
```

### Fulfillment methods

Select how the account's customers receive goods or services for `fulfillment.method`:

| Value | Description |
| --- | --- |
| `shipped-physical-goods` | Items shipped via carrier |
| `local-pickup-or-delivery` | Customer pickup or local delivery |
| `digital-content` | Downloads, streaming, digital products |
| `in-person-service` | Service provided at business location |
| `remote-service` | Service provided remotely/virtually |
| `donation` | Charitable contributions |
| `bill-or-debt-payment` | Utility bills, loan payments, etc. |
| `subscription-or-membership` | Recurring access or services |
| `other` | Custom fulfillment method |

### Fulfillment timeframes

Select when the account's customers typically receive their purchase for `fulfillment.timeframe`:

| Value | Description |
| --- | --- |
| `immediate` | Instant delivery (digital goods, in-person services) |
| `within-7-days` | Standard shipping timeframe |
| `within-30-days` | Extended delivery window |
| `over-30-days` | Long-term delivery (custom orders, pre-orders) |
| `scheduled-event` | Delivery tied to specific event date |
| `recurring-schedule` | Ongoing subscription deliveries |
| `pre-order` | Payment before product availability |
| `other` | Custom timeframe |

### Refund policy options

Select the option that describes the business's refund policy for `refundPolicy`:

| Value | Description |
| --- | --- |
| `no-refunds` | All sales final |
| `full-refund-within-30-days` | Standard 30-day return window |
| `full-refund-extended-window` | Returns accepted beyond 30 days |
| `partial-refund` | Reduced refund amount (restocking fees, etc.) |
| `store-credit-only` | Refunds as store credit/gift cards only |
| `prorated-refund` | Refund amount based on usage/time |
| `conditional-refund` | Refunds under specific conditions only |
| `event-based-policy` | Refunds tied to event cancellation/rescheduling |
| `custom-policy` | Unique refund terms |
