A capability represents a specific action a customer is authorized to take: holding a balance, sending a transfer, or placing a trade. Before initiating any of these operations on behalf of a customer, you must check that the relevant capability is active. Coinbase determines which capabilities a customer can access based on the identity information you submit and the outcome of their compliance review.
Capability statuses
| Status | Meaning | What to do |
|---|
unrequested | Capability was not included in the capabilities block when creating the customer | Request it by updating the customer |
active | Customer is authorized for this action | Proceed with the operation |
pending | One or more requirements are outstanding | Resolve the requirements. See the Requirements page |
inactive | Blocked by a compliance decision | Cannot be resolved via the API. Do not proceed |
Always check capability status before initiating operations. Initiating a transfer or creating an account without an active capability will result in an error: typically 403 from the gating service, or 422 (customer_not_ready_for_account_creation) on account and deposit-destination creation.
All capabilities
Most capabilities require the same base set of identity fields: name, date of birth, full SSN, address, purpose of account, and source of funds. tradeCrypto requires additional information; see the table below.
| Capability | What it unlocks | Required fields |
|---|
custodyFiat | Hold fiat balances in a custodial account | Base fields |
custodyStablecoin | Hold stablecoin balances | Base fields |
custodyCrypto | Hold crypto balances | Base fields |
transferFiat | Send fiat transfers (Fedwire, SWIFT, SEPA) | Base fields |
transferCrypto | Send onchain crypto transfers | Base fields |
transferStablecoin | Send stablecoin transfers | Base fields |
tradeStablecoin | Convert between stablecoins | Base fields |
tradeCrypto | Place crypto trade orders | Base fields + citizenship, employment status, occupation, expected volume, email, phone |
How to check capabilities
Capabilities are returned in the customer object. The response includes all capabilities, both requested and unrequested:
GET /v2/customers/{customerId}
{
"customerId": "customer_af2937b0-...",
"capabilities": {
"custodyFiat": { "requested": true, "status": "active" },
"custodyStablecoin": { "requested": true, "status": "pending" },
"transferFiat": { "requested": true, "status": "active" },
"transferCrypto": { "requested": false, "status": "unrequested" },
"custodyCrypto": { "requested": false, "status": "unrequested" },
"transferStablecoin": { "requested": false, "status": "unrequested" },
"tradeStablecoin": { "requested": false, "status": "unrequested" },
"tradeCrypto": { "requested": false, "status": "inactive" }
}
}
To check a specific capability:
cdpcurl -k $CDP_API_KEY \
"https://api.cdp.coinbase.com/platform/v2/customers/$CUSTOMER_ID" \
| jq '.capabilities.custodyFiat.status'
Expected output: "active"
Capability-gating pattern
Check capability status before each protected operation:
const customer = await getCustomer(customerId);
const capability = customer.capabilities[requiredCapability];
if (capability.status !== 'active') {
// Surface requirements to the user and handle resolution
const requirements = customer.requirements;
// Do NOT expose compliance-specific reasons to end-users
throw new Error('Customer not yet authorized for this action');
}
// Proceed with transfer / account creation / order
Webhooks
Subscribe to customer.capability.status_changed to receive real-time updates when a capability transitions between states:
{
"type": "customer.capability.status_changed",
"data": {
"customerId": "customer_af2937b0-...",
"capability": "custodyFiat",
"previousStatus": "pending",
"status": "active"
}
}
Webhook event names are provisional and subject to change until the webhooks documentation ships. This is the recommended approach for production; it keeps your integration responsive as Coinbase processes compliance decisions in real time.
Capability resolution
If a capability is pending or inactive, check requirements on the customer object to find what needs to be resolved. See the Requirements page for the resolution reference.