Granular capabilities migration guide

Last updated: December 19, 2025

This guide helps you understand what changes you need to make based on your current integration with Moov. Find your use case below and follow the steps to migrate to the new granular capabilities system.

Before you begin

Key changes

  1. API Version — You'll need to use API version v2025.07.00 or later

  2. No automatic mapping — Legacy capabilities do not auto-convert; you must explicitly request new granular capabilities

  3. Business accounts only — Granular capabilities are only available for business accounts

  4. New underwriting endpoint — Underwriting data is now submitted via a POST endpoint

Version header

Add the version header to all API requests:

curl -X POST "<https://api.moov.io/accounts/{accountID}/capabilities>" \\\\
  -H "Authorization: Bearer {token}" \\\\
  -H "x-moov-version: v2025.07.00" \\\\
  -H "Content-Type: application/json"

Full Capabilities reference

ACH/Bank Transfer Customers

If you're currently using the legacy send-funds or collect-funds capabilities for ACH bank transfers, here's what you need to know.

Capability mapping

What you're doing

Legacy

New Granular

Collecting payments via ACH debit

collect-funds

collect-funds.ach

Sending payments via ACH credit

send-funds

send-funds.ach

Request new capabilities

curl -X POST "<https://api.moov.io/accounts/{accountID}/capabilities>" \\\\
  -H "Authorization: Bearer {token}" \\\\
  -H "x-moov-version: v2025.07.00" \\\\
  -H "Content-Type: application/json" \\\\
  -d '{
    "capabilities": [
      "collect-funds.ach",
      "send-funds.ach"
    ]
  }'

Underwriting requirements

Full Underwriting reference

Most ACH customers process more than $10,000/month, which triggers extended underwriting requirements.

Baseline requirements (all ACH capabilities)

FieldDescription

geographicReach

Where are your customers located? (us-only, us-and-international, international-only)

monthlyVolumeRange

Estimated monthly volume per capability

Extended requirements (>$10k/month or not us-only)

Field

Description

businessPresence

How does the business operate? (online-only, retail-storefront, etc.)

volumeShareByCustomerType

Percentage split: business, consumer, p2p (must total 100)

pendingLitigation

Current or pending legal matters

averageTransactionAmount

Average transaction size in USD

maximumTransactionAmount

Maximum transaction size in USD

Submit underwriting data

Use the POST endpoint to submit underwriting:

curl -X POST "<https://api.moov.io/accounts/{accountID}/underwriting>" \\\\
  -H "Authorization: Bearer {token}" \\\\
  -H "x-moov-version: v2025.07.00" \\\\
  -H "Content-Type: application/json" \\\\
  -d '{
    "geographicReach": "us-only",
    "businessPresence": "online-only",
    "volumeShareByCustomerType": {
      "business": 70,
      "consumer": 30,
      "p2p": 0
    },
    "pendingLitigation": "none",
    "collectFunds": {
      "ach": {
        "estimatedActivity": {
          "monthlyVolumeRange": "50k-100k",
          "averageTransactionAmount": 500,
          "maximumTransactionAmount": 5000
        }
      }
    },
    "sendFunds": {
      "ach": {
        "estimatedActivity": {
          "monthlyVolumeRange": "50k-100k",
          "averageTransactionAmount": 1000,
          "maximumTransactionAmount": 10000
        }
      }
    }
  }'


Card Payment Customers

If you're currently using the legacy collect-funds capability to accept card payments, here's what you need to know.

Capability mapping

What you're doing

Legacy

New Granular

Accepting card payments

collect-funds

collect-funds.card-payments

Accepting both cards and ACH

collect-funds

collect-funds.card-payments + collect-funds.ach

Request new capabilities

curl -X POST "<https://api.moov.io/accounts/{accountID}/capabilities>" \\\\
  -H "Authorization: Bearer {token}" \\\\
  -H "x-moov-version: v2025.07.00" \\\\
  -H "Content-Type: application/json" \\\\
  -d '{
    "capabilities": [
      "collect-funds.card-payments"
    ]
  }'

Underwriting requirements

Card payment capabilities have additional requirements beyond the baseline and extended fields.

Baseline requirements (all ACH capabilities)

FieldDescription

geographicReach

Where are your customers located? (us-only, us-and-international, international-only)

monthlyVolumeRange

Estimated monthly volume per capability

Extended requirements (>$10k/month or not us-only)

Field

Description

businessPresence

How does the business operate? (online-only, retail-storefront, etc.)

volumeShareByCustomerType

Percentage split: business, consumer, p2p (must total 100)

pendingLitigation

Current or pending legal matters

averageTransactionAmount

Average transaction size in USD

maximumTransactionAmount

Maximum transaction size in USD

Card-specific requirements

Field

Description

currentlyAcceptsCards

Does the business currently accept card payments?

cardAcceptanceMethods

Percentage breakdown: inPersonPercentage, onlinePercentage, mailOrPhonePercentage (must total 100)

For card-not-present merchants (online < 80% in-person)

Field

Description

fulfillment.method

How customers receive purchases (shipped-physical-goods, digital-content, etc.)

fulfillment.timeframe

When customers receive purchases (immediate, within-7-days, etc.)

refundPolicy

Business refund policy (full-refund-within-30-days, no-refunds, etc.)

If currently accepting cards

If currentlyAcceptsCards is true, you'll need to upload processing statements via the files API.

Submit underwriting data

curl -X POST "<https://api.moov.io/accounts/{accountID}/underwriting>" \\\\
  -H "Authorization: Bearer {token}" \\\\
  -H "x-moov-version: v2025.07.00" \\\\
  -H "Content-Type: application/json" \\\\
  -d '{
    "geographicReach": "us-only",
    "businessPresence": "online-only",
    "volumeShareByCustomerType": {
      "business": 20,
      "consumer": 80,
      "p2p": 0
    },
    "pendingLitigation": "none",
    "collectFunds": {
      "cardPayments": {
        "estimatedActivity": {
          "monthlyVolumeRange": "50k-100k",
          "averageTransactionAmount": 75,
          "maximumTransactionAmount": 500
        },
        "currentlyAcceptsCards": true,
        "cardAcceptanceMethods": {
          "inPersonPercentage": 0,
          "onlinePercentage": 100,
          "mailOrPhonePercentage": 0
        },
        "fulfillment": {
          "method": "digital-content",
          "timeframe": "immediate"
        },
        "refundPolicy": "full-refund-within-30-days"
      }
    }
  }'

New Capabilities Available

The granular capabilities system opens up easy access to new payment rails. If your business needs these, you can now request them for your existing accounts:

Instant payouts

Capability

Description

Use cases

send-funds.instant-bank

Real-time payouts via RTP and FedNow

Insurance claims, instant disbursements

send-funds.push-to-card

Instant card payouts via Visa Direct and Mastercard Send

Gig economy payouts, same-day withdrawals

Money transfer (specialized use cases)

Capability

Description

Use cases

money-transfer.pull-from-card

Pull funds from debit/prepaid cards

Account funding, me-to-me transfers, P2P

money-transfer.push-to-card

Push funds to debit/prepaid cards

Withdrawals, me-to-me transfers, P2P

Note: Money transfer capabilities are limited to approved use cases. Contact Moov to determine eligibility.


Migration checklist

Use this checklist to track your migration progress:

  • Review this guide and identify your use case(s)

  • Update API requests to include x-moov-version: v2025.07.00 header

  • Identify which granular capabilities you need based on the mapping tables

  • Update capability request code to use new granular capability names

  • Prepare underwriting data for each capability

  • Update underwriting submission to use POST endpoint with new schema

  • Monitor for any capability requirement errors


Troubleshooting

If you encounter errors during migration, check the capabilities API response for requirement errors:

{
  "capability": "collect-funds.ach",
  "status": "pending",
  "requirements": {
    "currentlyDue": ["underwriting.geographicReach"],
    "errors": [
      {
        "requirement": "business.ein",
        "errorCode": "failed-automatic-verification"
      }
    ]
  }
}

For a complete list of errors, see the Troubleshooting Guide.


Getting help