Enable capabilities
pending to enabled.
You need an existing account and, for client-side calls, the /accounts/{accountID}/capabilities.write scope. The capabilities reference lists every capability, what it unlocks, and its requirements. To see which capabilities each payment method needs, see payment methods.
Request capabilities
You can request capabilities when you create the account or at any point after.
POST endpoint.curl -X POST "https://api.moov.io/accounts/{accountID}/capabilities" \
-H "Authorization: Bearer {token}" \
-H "x-moov-version: v2026.07.00" \
--data-raw '{
"capabilities": [
"transfers",
"send-funds.ach",
"collect-funds.ach",
"wallet.balance"
]
}'
mc, _ := moov.NewClient()
var accountID string
mc.RequestCapabilities(ctx, accountID,
[]moov.CapabilityName{
moov.CapabilityName_Transfers,
moov.CapabilityName_SendFundsACH,
moov.CapabilityName_CollectFundsACH,
moov.Capability_NameWalletBalance,
},
)
const moov = Moov(token);
const accountID = "accountID";
const capabilities = [
"send-funds.ach",
"collect-funds.ach"
];
moov.accounts.capabilities.request({accountID, capabilities});
const result = await moov.capabilities.request({
accountID: "0de140d5-cc78-4eeb-ab00-1f51aaf6c814",
addCapabilities: {
capabilities: [
"collect-funds",
],
},
});
res = moov.capabilities.request(account_id="0de140d5-cc78-4eeb-ab00-1f51aaf6c814", capabilities=[
components.CapabilityID.COLLECT_FUNDS,
])
res = s.capabilities.request(account_id: 'de140d5c-c78e-4ebb-a001-f51aaf6c814a', add_capabilities: Models::Components::AddCapabilities.new(
capabilities: [
Models::Components::CapabilityID::COLLECT_FUNDS_CARD_PAYMENTS,
]
))
RequestCapabilitiesResponse res = sdk.capabilities().request()
.accountID("0de140d5-cc78-4eeb-ab00-1f51aaf6c814")
.addCapabilities(AddCapabilities.builder()
.capabilities(List.of(
CapabilityID.COLLECT_FUNDS))
.build())
.call();
var res = await sdk.Capabilities.RequestAsync(
accountID: "de140d5c-c78e-4ebb-a001-f51aaf6c814a",
body: new AddCapabilities() {
Capabilities = new List<CapabilityID>() {
CapabilityID.CollectFundsCardPayments,
},
}
);
$addCapabilities = new Components\AddCapabilities(
capabilities: [
Components\CapabilityID::CollectFunds,
],
);
$response = $sdk->capabilities->request(
accountID: '0de140d5-cc78-4eeb-ab00-1f51aaf6c814',
addCapabilities: $addCapabilities
);
The response lists each requested capability with its status and requirements.currentlyDue.
Fulfill requirements
Moov returns the requirements for each capability based on the capability and whether the account is an individual or business. Fulfill everything in requirements.currentlyDue.
| Requirement | Applies to | How to fulfill |
|---|---|---|
| Verification (KYC/KYB) | Every capability except transfers |
Send profile data (name, address, tax ID, birth date) with the accounts PATCH endpoint. Upload documents if Moov asks for them. |
| Business representatives | Business accounts | Add a controller and all owners with 25% or more, then set ownersProvided: true. |
| Underwriting | Every capability except transfers and wallet.balance |
Submit fields with the underwriting POST endpoint. |
| Platform agreement | Every capability except transfers |
Send a terms of service token or manual acceptance on the account. |
New requirements can appear after you submit data, for example when underwriting values exceed the lowest tier. Check the capability again after each submission.
Check capability status
Each capability moves through these statuses:
| Status | Meaning |
|---|---|
pending |
Requirements are missing or failed verification. Check requirements.currentlyDue and requirements.errors. |
in-review |
All requirements are fulfilled and Moov is reviewing them. |
enabled |
The capability is active. |
disabled |
The capability was turned off by Moov (for example, a risk action) or by you through the API or Dashboard. See disabledReason. |
Use the list capabilities GET endpoint for all capabilities on an account, or the retrieve capability GET endpoint for one.
curl -X GET "https://api.moov.io/accounts/{accountID}/capabilities" \
-H "Authorization: Bearer {token}" \
-H "x-moov-version: v2026.07.00"
mc, _ := moov.NewClient()
var accountID string
mc.ListCapabilities(ctx, accountID)
const result = await moov.capabilities.list({
accountID: "1a50ab1c-1714-49e7-a016-cea17b33511a",
});
res = moov.capabilities.list(account_id="1a50ab1c-1714-49e7-a016-cea17b33511a")
res = s.capabilities.list(account_id: '1a50ab1c-1714-49e7-a016-cea17b33511a')
ListCapabilitiesResponse res = sdk.capabilities().list()
.accountID("1a50ab1c-1714-49e7-a016-cea17b33511a")
.call();
var res = await sdk.Capabilities.ListAsync(accountID: "1a50ab1c-1714-49e7-a016-cea17b33511a");
$response = $sdk->capabilities->list(
accountID: '1a50ab1c-1714-49e7-a016-cea17b33511a'
);
| Field | Description |
|---|---|
capability |
The capability key (for example, collect-funds.ach) |
status |
Current status (pending, in-review, enabled, disabled) |
requirements.currentlyDue |
List of outstanding requirements |
requirements.errors |
Array of errors encountered during verification |
disabledReason |
If disabled, the reason (for example, risk action) |
createdOn, updatedOn, disabledOn |
Lifecycle timestamps |
{
"capability": "collect-funds.ach",
"accountID": "670356c4-bd3c-414b-9709-c4dc84752902",
"status": "pending",
"requirements": {
"currentlyDue": [
"document.business.verification"
],
"errors": [
{
"requirement": "business.legalname",
"errorCode": "failed-automatic-verification"
}
]
},
"createdOn": "2025-05-13T19:46:53Z",
"updatedOn": "2025-05-13T19:50:58Z"
}
{
"capability": "collect-funds.ach",
"accountID": "670356c4-bd3c-414b-9709-c4dc84752902",
"status": "pending",
"requirements": {
"currentlyDue": [
"document.business.verification"
],
"errors": [
{
"requirement": "business.legalname",
"errorCode": "failed-automatic-verification"
}
]
},
"createdOn": "2025-05-13T19:46:53Z",
"updatedOn": "2025-05-13T19:50:58Z"
}
In the Dashboard, accounts with outstanding requirements show an action-needed indicator in the accounts list and a banner on the account page.
Listen for status changes
Subscribe to the capability.requested and capability.updated webhooks to react when a capability changes status, for example to prompt the account holder for missing information.
Next steps
- Troubleshoot capabilities to fix requirement errors and upload documents
- Send a resolution link so the account holder can fix errors themselves
- Link a source such as a bank account or card