# Qué puedes hacer (/docs/capabilities)

<Endpoint method="GET" path="/v1/capabilities" href="/docs/api/capabilities/list-capabilities" />

Cada elemento de la respuesta es algo que tu cuenta puede hacer: un **producto** (`payin` para cobrar, `payout` para pagar, `remittance` para un corredor completo) por un **método** y en una **moneda**. Trae también los campos que pide, cómo se cobra y si puedes usarlo ahora.

Arma tus formularios con esta respuesta y no tendrás que cambiar código cuando Caibo abra un país o un método nuevo: simplemente aparecerá en la lista.

## Filtros [#filtros]

Todos son opcionales y se combinan:

| Parámetro | Ejemplo |
| --- | --- |
| `product` | `payin`, `payout`, `remittance` |
| `country` | `BR`, `PE` (ISO 3166-1 alfa-2) |
| `currency` | `BRL`, `PEN` |
| `method` | `pix`, `bank_transfer` |

```bash
curl "$CAIBO_API/v1/capabilities?product=payin&currency=BRL" \
  -H "Authorization: Bearer $CAIBO_API_KEY"
```

```json
{
  "data": [
    {
      "product": "payin",
      "operation": "payin",
      "method": "pix",
      "currency": "BRL",
      "country": "BR",
      "payment_currency": "BRL",
      "settlement_currencies": ["USDT"],
      "settlement_asset": "USDT",
      "collection": ["payment"],
      "payment_method_fields": [
        {
          "name": "payer.name",
          "type": "string",
          "required": true,
          "pattern": "^.{2,140}$",
          "description": "The payer's full name.",
          "example": "Ana Souza"
        },
        {
          "name": "settlement_currency",
          "type": "enum",
          "required": false,
          "enum": ["USDT"],
          "description": "The currency the balance is credited in."
        }
      ],
      "customer_fields": [
        { "name": "type", "type": "enum", "required": true, "enum": ["individual", "business"], "description": "…" },
        { "name": "country", "type": "string", "required": true, "pattern": "^[A-Z]{2}$", "description": "…" }
      ],
      "available": true
    }
  ],
  "has_more": false
}
```

## Los campos [#los-campos]

<TypeTable
  type={{
    product: { type: '"payin" | "payout" | "remittance"', description: "Qué es: cobrar, pagar o un corredor completo." },
    method: { type: "string", description: "El método: pix, bank_transfer, mobile_payment… Siempre va junto con currency, porque un mismo método puede existir en varias monedas." },
    currency: { type: "string", description: "La moneda que envía el pagador (cobro) o que recibe el beneficiario (pago)." },
    country: { type: "string", description: "El país del método, cuando tiene uno." },
    settlement_asset: { type: "string", description: "En un cobro, la moneda en que se acredita tu saldo por defecto." },
    collection: { type: '("account" | "payment")[]', description: "En un cobro: payment se cobra como un pago único con monto exacto; account abre una cuenta que recibe cualquier depósito." },
    payment_method_fields: { type: "FieldSpec[]", description: "En un cobro: lo que lleva POST /v1/funding-accounts además de method y currency." },
    beneficiary_fields: { type: "FieldSpec[]", description: "En un pago: lo que lleva details al registrar el beneficiario." },
    customer_fields: { type: "FieldSpec[]", description: "Lo que debe tener tu cliente (por ejemplo, el remitente de un pago)." },
    limits: { type: "Limit[]", description: "En un pago: tus límites por operación y diarios, si tu cuenta los tiene." },
    available: { type: "boolean", description: "Si tu cuenta lo puede usar ahora mismo." },
    reason: { type: '"suspended" | "not_enabled" | "no_provider"', description: "Por qué no está disponible, cuando available es false." },
  }}
/>

### FieldSpec: cómo describir un campo [#fieldspec-cómo-describir-un-campo]

Cada campo trae `name`, `type` (`string`, `number`, `iban`, `phone`, `email`, `date`, `enum`), `required` y `description`, y puede traer `pattern` (una expresión regular), `enum`, `example` y `note`. Con eso puedes validar en tu formulario lo mismo que valida la API.

Un nombre con punto indica un objeto anidado en los `details` de un beneficiario: `document.type` es `{"document": {"type": "V"}}`. En `payer`, en cambio, la clave es el nombre completo: `{"payer": {"payer.name": "Ana Souza"}}`.

## Disponible y no disponible [#disponible-y-no-disponible]

| `reason` | Qué significa | Qué hacer |
| --- | --- | --- |
| `suspended` | Caibo detuvo la operación temporalmente, para todos o para tu cuenta. | Reintenta más tarde. Si lo intentas, la API responde `503 operation_suspended`. |
| `not_enabled` | El producto no está activado para tu cuenta. | Pide la activación a Caibo. |
| `no_provider` | No hay ruta disponible para tu cuenta. | Pide la activación a Caibo. |

Si pides un método o una moneda que no aparece en la lista, la API responde `422 unsupported_method`.

<Callout title="Caibo activa y tú no cambias nada">
La activación ocurre del lado de Caibo: por país para todos, o solo para tu cuenta. Cuando algo se activa, empieza a aparecer con `available: true`. Tu integración lee la lista y lo usa.
</Callout>
