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

# Envía tu primera transferencia

> Envía tu primera transferencia de prueba con Fintoc de punta a punta, desde generar las API keys hasta suscribirte a los webhooks de la Transfers API.

Al final, habrás firmado tus solicitudes con un JSON Web Signature (JWS), fondeado una `Account` de prueba y enviado tu primera `Transfer`.

## Paso 1 — Obtén tus API keys de prueba

En el [Dashboard](https://dashboard.fintoc.com/), ve a **Developers → API Keys**. Verás llaves para el modo `test` (`sk_test_...`) y el modo `live` (`sk_live_...`). Copia la llave secreta de `test`.

## Paso 2 — Registra las llaves JWS

Los endpoints que mueven dinero requieren solicitudes firmadas. Estos endpoints crean transferencias, devuelven transferencias o verifican un número de cuenta bancaria mexicano estandarizado. Sigue [Genera llaves JWS](/es/guides/transfers/transfers-setup/setting-up-jws-keys) para crear un par de llaves y subir la llave pública. Regresa a esta página cuando termines.

## Paso 3 — Lista tus cuentas

Toda organización comienza con una `Account` raíz. Obtenla con una solicitud `GET` a `/v2/accounts`:

```bash cURL theme={null}
curl --request GET \
     --url https://api.fintoc.com/v2/accounts \
     --header 'Authorization: YOUR_TEST_SECRET_KEY' \
     --header 'accept: application/json' \
     --header 'content-type: application/json'
```

La respuesta se ve así:

```json JSON theme={null}
[
  {
    "id": "acc_23JlasHas241",
    "object": "account",
    "mode": "test",
    "description": "My root account",
    "root_account_number": "000000000000000000",
    "root_account_number_id": "acno_Kasf91034gj1AD",
    "available_balance": 0,
    "currency": "MXN",
    "entity": {
      "id": "ent_4324qwkalsds",
      "holder_name": "Test Entity 1",
      "holder_id": "ND"
    }
  }
]
```

### Usa un SDK

Si usas Node o Python, instala el [SDK de Node](https://github.com/fintoc-com/fintoc-node) o el [SDK de Python](https://github.com/fintoc-com/fintoc-python) para llamar a la API. El SDK firma cada solicitud con [JWS](/es/guides/transfers/transfers-setup/setting-up-jws-keys) y maneja la paginación.

Instala un SDK:

<CodeGroup>
  ```bash Install Node SDK theme={null}
  npm install fintoc
  ```

  ```bash Install Python SDK theme={null}
  pip install fintoc
  ```
</CodeGroup>

Lista tus cuentas:

<CodeGroup>
  ```javascript Node theme={null}
  const { Fintoc } = require('fintoc');

  // Puedes proporcionar una ruta a tu archivo PEM o pasar la llave PEM directamente como string.
  // const privateKey = process.env.JWS_PRIVATE_KEY;
  const privateKey = './private_key.pem';

  const fintoc = new Fintoc('YOUR_TEST_SECRET_KEY', privateKey);

  const accounts = await fintoc.v2.accounts.list();
  for await (const account of accounts) {
    console.log(account.id, account.description, account.root_account_number, account.available_balance);
  }
  ```

  ```python Python theme={null}
  from fintoc import Fintoc

  # Puedes proporcionar una ruta a tu archivo PEM o pasar la llave PEM directamente como string.
  # jws_private_key = os.environ.get('JWS_PRIVATE_KEY')
  jws_private_key = "./private_key.pem"

  client = Fintoc("YOUR_TEST_SECRET_KEY", jws_private_key=jws_private_key)

  for account in client.v2.accounts.list():
      print(account.id, account.description, account.root_account_number, account.available_balance)
  ```
</CodeGroup>

Guarda el `id` (`acc_...`) y el `root_account_number_id` (`acno_...`) de la respuesta. Usa `root_account_number_id` para fondear la `Account` de prueba. Usa `id` para crear la `Transfer` saliente.

## Paso 4 — Fondea tu cuenta de prueba

Tu `Account` de prueba comienza vacía. Simula una transferencia entrante para tener dinero que enviar:

```bash cURL theme={null}
curl --request POST \
     --url https://api.fintoc.com/v2/simulate/receive_transfer \
     --header 'Authorization: YOUR_TEST_SECRET_KEY' \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --data '
{
  "account_number_id": "acno_Kasf91034gj1AD",
  "amount": 59013,
  "currency": "MXN"
}
'
```

La respuesta es la `Transfer` entrante simulada que fondea tu `Account`:

```json JSON theme={null}
{
  "id": "tr_7HbN2kPq9wZ4xR1s",
  "object": "transfer",
  "amount": 59013,
  "currency": "MXN",
  "status": "succeeded",
  "direction": "inbound",
  "account_number_id": "acno_Kasf91034gj1AD",
  "comment": "Simulated inbound transfer"
}
```

<Warning>
  **Las monedas se representan como enteros**

  La API de Fintoc representa el dinero en la unidad mínima de la moneda como un entero sin decimales. Un monto de $590.13 MXN es `59013`. El CLP no tiene unidad menor, así que un monto de $59.013 CLP también es `59013`.

  Consulta [Monedas](/es/guides/home/currencies).
</Warning>

Consulta [Prueba tu integración](/es/guides/transfers/transfers-setup/test-your-integration) para ver simulaciones de fallos, devoluciones y payouts rechazados.

## Paso 5 — Envía tu primera transferencia

Crea una `Transfer` saliente desde la `Account` de prueba que fondeaste.

```bash cURL theme={null}
curl --request POST \
     --url https://api.fintoc.com/v2/transfers \
     --header 'Authorization: YOUR_TEST_SECRET_KEY' \
     --header 'Fintoc-JWS-Signature: YOUR_JWS_SIGNATURE' \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --data '
{
  "amount": 59013,
  "currency": "MXN",
  "account_id": "acc_23JlasHas241",
  "comment": "Pago de credito 10451",
  "reference_id": "150195",
  "counterparty": {
    "account_number": "000000000000000000"
  }
}'
```

La respuesta es la `Transfer` saliente que creaste:

```json JSON theme={null}
{
  "id": "tr_5pQ8rXcViBnM3kL2",
  "object": "transfer",
  "amount": 59013,
  "currency": "MXN",
  "status": "succeeded",
  "direction": "outbound",
  "comment": "Pago de credito 10451",
  "reference_id": "150195",
  "counterparty": {
    "account_number": "000000000000000000"
  }
}
```

## Paso 6 — Crea un endpoint de webhook

Los webhooks notifican a tu servidor cuando una transferencia se liquida, así no necesitas hacer polling del estado. Ve a **Developers → Webhooks** en el Dashboard. Agrega tu URL y luego suscríbete a `transfer.inbound.succeeded` y `transfer.outbound.succeeded`.

## Prueba la integración

Confirma que todo el flujo funcionó de principio a fin:

1. Después del Paso 4, vuelve a listar tus cuentas y confirma que `available_balance` aumentó en `59013`.
2. Confirma que la transferencia del Paso 5 retorna `"status": "succeeded"`.
3. Después del Paso 6, repite los Pasos 4 y 5. Confirma que tu endpoint recibe un webhook `transfer.outbound.succeeded` para la nueva transferencia saliente.
