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

# Banca empresa

> Conecta cuentas de empresa (no solo personas) con el mismo flujo, distinguiendo con holder_type.

Rail soporta cuentas **de empresa** además de las de personas. El modelo es el
mismo que usa Fintoc: **no hay una institución aparte** para empresa — usas la
misma institución (ej. `santander`) y distingues el tipo de titular con un
campo `holder_type`.

| `holder_type`          | Para qué       | Quién es el titular            |
| ---------------------- | -------------- | ------------------------------ |
| `individual` (default) | Banca personal | La persona (su RUT)            |
| `business`             | Banca empresa  | La empresa (RUT de la empresa) |

<Note>
  El `holder_type` lo decides **tú** (el integrador) al emitir el `widget_token`
  — no lo elige el usuario final. Tú sabes si estás onboardeando una persona o
  una empresa. Si lo omites, es `individual`.
</Note>

## Flujo de integración

Es el mismo flujo del [widget](/guides/widget), con un solo cambio: al emitir el
`widget_token` envías `holder_type: "business"`. El widget se encarga del resto
(muestra el form correcto y filtra los bancos que soportan empresa).

```mermaid theme={null}
sequenceDiagram
    participant App as Tu frontend
    participant Backend as Tu backend
    participant Widget as widget.rail.cl
    participant Rail

    Backend->>Rail: POST /v1/widget_tokens { holder_type: "business" }
    Rail-->>Backend: { id: "wt_..." }
    Backend-->>App: wt_*
    App->>Widget: Rail.openWidget({ token, pk })
    Widget->>Rail: GET /v1/widget/info (lee holder_type)
    Rail-->>Widget: holder_type=business + bancos empresa
    Widget->>App: form empresa (RUT empresa + RUT persona + clave)
    Widget->>Rail: sync inicial
    Rail-->>Widget: link_id, et_*
    Widget-->>App: onSuccess(et_*)
    App->>Backend: POST /callback { et_* }
    Backend->>Rail: POST /v1/exchange_tokens/{et}
    Rail-->>Backend: { link_id, holder_type: "business" }
```

### 1. (Opcional) Descubre qué bancos soportan empresa

`GET /v1/institutions` lista las instituciones con sus productos por
`holder_type`, y los campos de credenciales que pide cada una. Útil si quieres
armar tu propia UI de selección antes de abrir el widget.

```bash theme={null}
curl "https://api.rail.cl/v1/institutions?holder_type=business" \
  -H "Authorization: Bearer rail_pk_live_…"
```

```json theme={null}
{
  "object": "list",
  "data": [
    {
      "object": "institution",
      "id": "cl_santander",
      "country": "cl",
      "name": "Banco Santander Chile",
      "products": [
        {
          "name": "movements",
          "holder_type": "business",
          "credential_fields": [
            { "key": "rut_empresa", "label": "RUT empresa", "type": "rut" },
            { "key": "rut", "label": "RUT persona", "type": "rut" },
            { "key": "password", "label": "Clave portal web", "type": "password" }
          ]
        }
      ]
    }
  ]
}
```

`credential_fields` te dice exactamente qué campos pide el banco para ese
`holder_type`. El widget los renderiza solo; esto es para cuando quieres mostrar
el listado o el form tú mismo.

### 2. Emite el widget token con `holder_type: "business"`

```bash theme={null}
curl https://api.rail.cl/v1/widget_tokens \
  -X POST \
  -H "Authorization: Bearer rail_sk_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "holder_type": "business",
    "institution_id": "cl_santander"
  }'
```

<Tip>
  `institution_id` es opcional. Si lo envías, el widget abre directo en ese banco.
  Si no, el widget muestra el picker **filtrado a los bancos que soportan
  empresa** (no aparecen los de solo-personas ni los marcados "Pronto").
</Tip>

### 3. Abre el widget (igual que siempre)

El frontend no cambia — el `holder_type` ya viajó en el token. El widget detecta
que es empresa y muestra los **3 campos** (en vez de los 2 de personas):

| Campo                | Qué es                                     |
| -------------------- | ------------------------------------------ |
| **RUT empresa**      | RUT de la empresa (es el titular del link) |
| **RUT persona**      | RUT del usuario que ingresa al portal      |
| **Clave portal web** | La clave de ese usuario                    |

```html theme={null}
<script src="https://widget.rail.cl/v1/embed.js"></script>
<script>
  Rail.openWidget({
    token: 'wt_…',          // emitido con holder_type: "business"
    publishableKey: 'rail_pk_live_…',
    onSuccess: (et) => {
      fetch('/api/rail-callback', {
        method: 'POST',
        body: JSON.stringify({ exchange_token: et }),
      });
    },
  });
</script>
```

### 4. Canjea el exchange token

Igual que en el flujo personal. El `link` resultante queda con
`holder_type: "business"` y su `holder_id` es el **RUT de la empresa**.

```json theme={null}
{
  "object": "link",
  "id": "link_8a2f4c6e1b9d5037",
  "bank_id": "santander",
  "holder_type": "business",
  "holder_id": "76.543.210-3",
  "status": "active"
}
```

De acá en adelante, lees cuentas y movimientos exactamente igual que con un link
personal (`GET /v1/accounts?link_id=…`, etc).

## Disponibilidad

<Warning>
  **Santander Empresa (Office Banking) está en habilitación temprana.** Puedes
  integrar el flujo y tus usuarios pueden ingresar credenciales hoy, pero la
  sincronización de cuentas/movimientos para empresa se está terminando de
  activar. Consulta `GET /v1/institutions?holder_type=business` para ver en todo
  momento qué bancos están disponibles para empresa — cuando sumemos otro, aparece
  ahí sin que cambies tu integración.
</Warning>
