Skip to main content
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

StatusMeaningWhat to do
unrequestedCapability was not included in the capabilities block when creating the customerRequest it by updating the customer
activeCustomer is authorized for this actionProceed with the operation
pendingOne or more requirements are outstandingResolve the requirements. See the Requirements page
inactiveBlocked by a compliance decisionCannot 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.
CapabilityWhat it unlocksRequired fields
custodyFiatHold fiat balances in a custodial accountBase fields
custodyStablecoinHold stablecoin balancesBase fields
custodyCryptoHold crypto balancesBase fields
transferFiatSend fiat transfers (Fedwire, SWIFT, SEPA)Base fields
transferCryptoSend onchain crypto transfersBase fields
transferStablecoinSend stablecoin transfersBase fields
tradeStablecoinConvert between stablecoinsBase fields
tradeCryptoPlace crypto trade ordersBase 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.