> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cloud.coinbase.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Capabilities

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](/customers-kyc/requirements) page |
| `inactive`    | Blocked by a compliance decision                                                   | Cannot be resolved via the API. Do not proceed                                     |

<Warning>
  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.
</Warning>

## 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}
```

```json theme={null}
{
  "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:

```bash theme={null}
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:

```javascript theme={null}
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:

```json theme={null}
{
  "type": "customer.capability.status_changed",
  "data": {
    "customerId": "customer_af2937b0-...",
    "capability": "custodyFiat",
    "previousStatus": "pending",
    "status": "active"
  }
}
```

<Note>
  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.
</Note>

## 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](/customers-kyc/requirements) page for the resolution reference.
