# Send a banking API transfer

> Creates the intent of a transfer from one of the merchant bank accounts in the Banca Cliente portal; the payment only executes when confirmed with the code sent to the merchant email.

- kind: mcp-tool
- status: stable
- access: destructive
- last_verified: 2026-10-20
- url: https://tilopay.com/en/developers/agentes/mcp/api-bancario/send-transfer

> **Warning:** This tool moves real money. It does not send the payment yet: it creates the intent in the
>   Banca Cliente portal, which validates the destination and sends a 6-digit code to the
>   merchant's email (valid for 30 minutes). The payment only executes when calling
>   [baas_confirm_transfer](/en/developers/agentes/mcp/api-bancario/confirm-transfer) with that code.

> These tools are enabled on request and only work for users with Tilopay banking API credentials. They are not part of the default MCP access: Tilopay enables the group case by case. Requires: Tilopay banking API credentials registered by Tilopay for that user.

- `baas_send_transfer`
- Access: Sensitive
- Requires confirmation: https://tilopay.com/en/developers/agentes/mcp/permisos#confirmaciones
- API operation: `POST /api/public/v1/transactions/payments` — https://tilopay.com/en/developers/api-bancario/pagos

Creates the intent of a transfer from the merchant's bank account in the Banca Cliente portal (not the payment yet). The portal validates the destination and sends a 6-digit code to the merchant's email; the payment only executes when baas_confirm_transfer is called with that code (valid for 30 minutes). Default method: SINPE Móvil (destination by phone); for an account transfer, destinationAccountType=IBAN. baas_validate_destination is optional to show the holder beforehand; this tool validates the destination on its own.

**Parameters**

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `amount` | number | yes | Amount to transfer |
| `currency` | string | yes | ISO 4217 currency (CRC, USD) |
| `contactName` | string | — | Name of the saved contact (alternative to destinationAccountValue; one of the two is required) |
| `destinationAccountType` | string (PHONE | IBAN) | — | PHONE = SINPE Móvil (default), IBAN = account transfer |
| `destinationAccountValue` | string | — | Phone: +50688887777, 506 8888-7777 or 88887777 are accepted and normalized to 8 digits; IBAN in uppercase without spaces. Alternative to contactName: one of the two is required. |
| `destinationName` | string | — | Recipient name (if not validated via contact) |
| `detailReference` | string | — | Transfer concept (minimum 15 characters) |
| `assignmentId` | string | — | Not used in this flow |
| `allowDuplicate` | boolean | — | Only true when the user literally confirmed they want to repeat a recent identical transfer (e.g. 'yes, it is another one'). Never enabled on the agent's own initiative. |

**Returns**

`{ requires_transfer_code: true, channel: "email", via: "portal", resumen: { beneficiario_nombre, beneficiario_confirmado_por_banco, beneficiario_identificacion_enmascarada, entidad_financiera, destino_tipo, destino_legible, monto, moneda, concepto, origen, datos_no_informados[] }, requires_approval, message }`

It does not return an intentId: the intent stays stored on the server. Special responses: requires_duplicate_confirmation (same destination, amount and currency within 120 s; repeat with allowDuplicate: true only if the user literally confirmed it) and requires_open_intent_resolution (there is already an open intent: confirm it with baas_confirm_transfer or cancel it with baas_cancel_transfer).
