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

# Tesorería

> Consultá saldos y movimientos, y transferí fondos PES desde una integración.

La API de tesorería sirve para resolver los IDs de cuentas bancarias que usan
otros recursos, consultar saldos, recorrer movimientos y transferir fondos PES
sin abrir el dashboard. La creación y administración de cuentas bancarias
continúa en la interfaz de La Pyme y en los procesos de migración.

Estos seis endpoints de consulta requieren `treasury:read`:

* `GET /api/v1/bank-accounts`
* `GET /api/v1/bank-accounts/{bank_account_id}`
* `GET /api/v1/treasury/balances`
* `GET /api/v1/treasury/movements`
* `GET /api/v1/funds-transfers`
* `GET /api/v1/funds-transfers/{funds_transfer_id}`

`POST /api/v1/funds-transfers` requiere `treasury:write` e
`Idempotency-Key`.

## Cuentas bancarias

La colección y el detalle devuelven configuración segura como banco, nombre,
moneda, CBU, alias, uso de chequera y estado. No exponen el ID de la cuenta
contable vinculada, la organización, actores internos ni un saldo calculado.

<CodeGroup>
  ```bash cURL theme={null}
  curl "https://api.lapyme.com.ar/api/v1/bank-accounts?status=active&currency=PES" \
    -H "Authorization: Bearer $LAPYME_API_KEY"
  ```

  ```typescript TypeScript theme={null}
  const response = await fetch(
    "https://api.lapyme.com.ar/api/v1/bank-accounts?status=active&currency=PES",
    { headers: { Authorization: `Bearer ${process.env.LAPYME_API_KEY}` } }
  );

  const bankAccounts = await response.json();
  ```

  ```python Python theme={null}
  import os, requests

  bank_accounts = requests.get(
      "https://api.lapyme.com.ar/api/v1/bank-accounts",
      headers={"Authorization": f"Bearer {os.environ['LAPYME_API_KEY']}"},
      params={"status": "active", "currency": "PES"},
  ).json()
  ```
</CodeGroup>

Las referencias y las proyecciones financieras incluyen cuentas `PES` y `DOL`.

## Saldos

`GET /api/v1/treasury/balances` devuelve las cuentas bancarias, cajas
registradoras y cajas fuertes visibles. Podés filtrar por `balance_type`,
`balance_id`, `status` y `as_of`.

Los importes son enteros en unidades menores. `native_amount` está expresado en
`currency`; `functional_amount` está expresado en `functional_currency`, que en
esta versión siempre es `PES`. En una fuente `PES`, ambos valores coinciden. En
una fuente `DOL`, `native_amount` es el saldo USD que se usa para operar y
conciliar, mientras que `functional_amount` es su valor contable registrado en
ARS.

`native_amount_quality` puede ser `exact`, `derived` o `unavailable`. Cuando un
historial DOL no conserva evidencia suficiente, `native_amount` es `null`: la
API no adivina dólares a partir de pesos. `anomaly_count` informa cuántos hechos
del saldo requieren revisión.

```json theme={null}
{
  "object": "treasury_balance",
  "currency": "DOL",
  "native_amount": 500000,
  "native_amount_quality": "exact",
  "functional_amount": 650000000,
  "functional_currency": "PES",
  "anomaly_count": 0
}
```

`visibility_scope` informa si la respuesta representa toda la organización o
solo hechos propios del usuario delegado:

* `organization`: proyección organizacional permitida.
* `own`: suma limitada a movimientos creados por el usuario delegado.

## Movimientos

`GET /api/v1/treasury/movements` devuelve un ledger inmutable y paginado. Los
filtros disponibles son `balance_type`, `balance_id`, `movement_type`,
`date_from` y `date_to`.

Un `native_amount` o `functional_amount` positivo aumenta el saldo y uno
negativo lo reduce. `functional_amount_origin` indica si el valor ARS proviene
de una cotización (`rate`), del valor contable existente (`carrying_value`) o
de un historial sin procedencia canónica (`legacy_unknown`). Cuando el origen
es `rate`, el objeto `rate` conserva `value`, `rate_date` y `source`.

`occurred_on` es la fecha operativa; `created_at` es el timestamp real de
persistencia. El `id` identifica la línea durable del movimiento y puede
guardarse para deduplicación local.

La respuesta no incluye débitos/créditos internos, IDs del plan de cuentas ni
una operación para editar movimientos. Las correcciones financieras se
representan mediante hechos contables explícitos en La Pyme.

## Transferencias de fondos

Una transferencia mueve fondos entre dos identidades compuestas. Siempre enviá
`balance_type` y `balance_id` tanto en `source` como en `destination`: un mismo
UUID puede identificar una caja registradora y una caja fuerte distintas.

La primera versión admite únicamente dos puntas denominadas en PES. `amount` es
un entero en centavos —por ejemplo, `125000` representa ARS 1.250,00— y
`occurred_on` es una fecha de negocio argentina `YYYY-MM-DD`. No envíes
`currency`: la API la comprueba en las dos puntas y devuelve `422` si encuentra
DOL o una combinación de monedas.

La creación confirma un hecho financiero completo en una sola transacción:
una transferencia, un efecto negativo en el origen, uno positivo en el destino
y un asiento balanceado. No tiene `status`, actualización, cancelación ni
eliminación. La política de tesorería permite que el saldo de origen quede
negativo; no existe un error de fondos insuficientes para esta operación.

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST "https://api.lapyme.com.ar/api/v1/funds-transfers" \
    -H "Authorization: Bearer $LAPYME_API_KEY" \
    -H "Content-Type: application/json" \
    -H "Idempotency-Key: cierre-caja-2026-07-21" \
    -d '{
      "source": {
        "balance_type": "register",
        "balance_id": "550e8400-e29b-41d4-a716-446655440601"
      },
      "destination": {
        "balance_type": "bank_account",
        "balance_id": "550e8400-e29b-41d4-a716-446655440602"
      },
      "amount": 125000,
      "occurred_on": "2026-07-21",
      "reference": "CIERRE-001",
      "description": "Depósito del cierre de caja"
    }'
  ```

  ```typescript TypeScript theme={null}
  const response = await fetch(
    "https://api.lapyme.com.ar/api/v1/funds-transfers",
    {
      method: "POST",
      headers: {
        Authorization: `Bearer ${process.env.LAPYME_API_KEY}`,
        "Content-Type": "application/json",
        "Idempotency-Key": "cierre-caja-2026-07-21",
      },
      body: JSON.stringify({
        source: {
          balance_type: "register",
          balance_id: "550e8400-e29b-41d4-a716-446655440601",
        },
        destination: {
          balance_type: "bank_account",
          balance_id: "550e8400-e29b-41d4-a716-446655440602",
        },
        amount: 125_000,
        occurred_on: "2026-07-21",
        reference: "CIERRE-001",
        description: "Depósito del cierre de caja",
      }),
    }
  );

  const { data: transfer } = await response.json();
  ```

  ```python Python theme={null}
  import os, requests

  response = requests.post(
      "https://api.lapyme.com.ar/api/v1/funds-transfers",
      headers={
          "Authorization": f"Bearer {os.environ['LAPYME_API_KEY']}",
          "Idempotency-Key": "cierre-caja-2026-07-21",
      },
      json={
          "source": {
              "balance_type": "register",
              "balance_id": "550e8400-e29b-41d4-a716-446655440601",
          },
          "destination": {
              "balance_type": "bank_account",
              "balance_id": "550e8400-e29b-41d4-a716-446655440602",
          },
          "amount": 125000,
          "occurred_on": "2026-07-21",
          "reference": "CIERRE-001",
          "description": "Depósito del cierre de caja",
      },
  )
  transfer = response.json()["data"]
  ```
</CodeGroup>

La respuesta `201` incluye dos `accounting_effects`, siempre en orden origen y
destino. Sus importes tienen signos opuestos y suman cero. Cada
`treasury_movement_id` es el `id` durable que también aparece en
`GET /api/v1/treasury/movements`; no se exponen cuentas contables ni IDs de las
patas internas.

Repetir exactamente el mismo cuerpo con la misma `Idempotency-Key` devuelve el
mismo recurso sin duplicar el movimiento de dinero. Reusar la clave con un
cuerpo distinto devuelve `409 IDEMPOTENCY_CONFLICT`. Una punta inexistente,
oculta o de otra organización devuelve `404`; una punta o cuenta vinculada
inactiva devuelve `409`; una fecha futura, moneda no soportada o configuración
contable faltante devuelve `422`.

La visibilidad se evalúa sobre ambas puntas. Una integración delegada no puede
ver una transferencia si una de ellas queda fuera de sus cajas o cajas fuertes
asignadas. Con visibilidad `own`, además, solo aparecen hechos creados por ese
usuario.

### Listar y obtener una transferencia

La colección se ordena por `occurred_on`, `created_at` e `id`, en orden
descendente. `date_from` y `date_to` son inclusivos. Para filtrar por cualquiera
de las dos puntas, enviá juntos `balance_type` y `balance_id`.

```bash theme={null}
curl "https://api.lapyme.com.ar/api/v1/funds-transfers?balance_type=register&balance_id=550e8400-e29b-41d4-a716-446655440601&date_from=2026-07-01&date_to=2026-07-21&limit=25" \
  -H "Authorization: Bearer $LAPYME_API_KEY"
```

Los elementos de la lista omiten `accounting_effects`. Usá el detalle cuando
necesites seguir los movimientos contables:

```bash theme={null}
curl "https://api.lapyme.com.ar/api/v1/funds-transfers/550e8400-e29b-41d4-a716-446655440701" \
  -H "Authorization: Bearer $LAPYME_API_KEY"
```

## Paginación y sincronización

Las cuatro colecciones usan `cursor` y `limit`. Guardá `next_cursor` y repetí la
misma consulta mientras `has_more` sea `true`. Consultar estos endpoints no
produce efectos ni requiere `Idempotency-Key`.

La API no agrega eventos webhook de tesorería. Para una sincronización periódica,
consultá saldos, movimientos o transferencias con los filtros de fecha y cursor
adecuados.
