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

# Listar movimientos de una cuenta

> Los movimientos de la cuenta como quedaron en la última lectura del banco, más nuevos primero. Exige `banking:read` explícito.

Los movimientos de una cuenta bancaria tal como quedaron en la última lectura
del banco, los más nuevos primero. El GET nunca toca al banco.

```bash theme={null}
curl "https://api.tupana.ai/v2/bank-accounts/bacc_7Hk2938475610293/movements/?since=2026-10-01&until=2026-10-31" \
  -H "Authorization: Api-Key TU_API_KEY"
```

```json theme={null}
{
  "data": [
    {
      "id": "move_Qm8102938475612",
      "account_id": "bacc_7Hk2938475610293",
      "company_id": "ment_3672486436546233854",
      "amount": 450000,
      "direction": "inbound",
      "currency": "CLP",
      "status": "posted",
      "posted_movement_id": null,
      "transaction_date": "2026-10-24",
      "post_date": "2026-10-25",
      "description": "TRANSFERENCIA DE COMERCIAL ANDINA SPA",
      "balance_after": null,
      "counterparty": {
        "tax_id": "76.543.169-7",
        "name": "Comercial Andina SpA",
        "institution": { "code": "cl_banco_de_chile", "name": "Banco de Chile" },
        "account_number_mask": "0912"
      },
      "category": "customer_payment"
    }
  ],
  "meta": { "page": 1, "page_size": 50, "total": 1, "total_pages": 1 },
  "links": { "next": null, "prev": null }
}
```

Necesitas `banking:read` explícito en la API key (ver
[Introducción](https://docs.tupana.ai/api-reference/v2/banking/introduction.md#permiso)). Una cuenta de
otra empresa responde `404`.

## Filtros

| Parámetro | Qué hace |
| - | - |
| `since`, `until` | Rango de `transaction_date`, inclusivo, `YYYY-MM-DD`. |
| `direction` | `inbound` (entra dinero) o `outbound` (sale). |
| `status` | `pending` o `posted`. |
| `min_amount`, `max_amount` | Sobre el monto sin signo. |

Un valor inválido responde `400` con `code: parameter_invalid` y `param`.
`page` y `page_size` (tope 200) paginan; `?fields=` recorta los campos.

## El dato crudo

* `amount` nunca lleva signo; `direction` dice si entró o salió. Es el mismo
  contrato de Fintoc v2, así que si ya integraste un agregador no cambias nada.
  Entero en CLP; con decimales en otras monedas.
* `status`: `pending` mientras el banco no lo contabiliza, `posted` cuando sí,
  `removed` si el banco lo revirtió. `posted_movement_id` enlazará una
  pendiente con la posteada que la reemplazó cuando llegue la sincronización
  por cursor; hoy viene `null`, igual que `balance_after`.
* `description` es la glosa tal cual la entrega el banco. No la normalizamos.

## Lo que Tupana agrega

* `counterparty`: la contraparte resuelta. Un agregador entrega la glosa;
  Tupana además identifica el RUT, la razón social, el banco y la cuenta
  enmascarada de quien pagó o cobró, con el dato estructurado del banco o, si
  no viene, con lo que dice la glosa. `null` cuando no hay nada que resolver.
  El número de cuenta de la contraparte completo nunca sale.
* `category`: qué es el dinero según la clasificación de Tupana:
  `customer_payment`, `supplier_payment`, `payroll`, `taxes`, `bank_fees`,
  `internal_transfer`, `card_settlement`. `null` si todavía no se clasificó o
  no se identificó.

> [!NOTE]
>
> Acá no hay nada de documentos tributarios ni de conciliación: ni facturas
> asociadas, ni estado contable. La API bancaria habla de dinero.


## OpenAPI

````yaml api-reference/openapi-v2.json GET /bank-accounts/{account_id}/movements/
openapi: 3.0.0
info:
  title: Tupana API — v2
  description: >-
    API v2 de Tupana: facturación electrónica, cesiones, recaudación, consultas,
    boleta de honorarios y nómina. Los identificadores de recursos son public
    IDs opacos con prefijo (docu_, ment_, cred_, doce_, empl_…).
  version: 2.0.0
servers:
  - url: https://api.tupana.ai/v2
    description: Producción (v2)
security:
  - apiKeyAuth: []
paths:
  /bank-accounts/{account_id}/movements/:
    get:
      tags:
        - Movimientos
      summary: Listar movimientos de una cuenta
      description: >-
        Los movimientos de la cuenta como quedaron en la última lectura del
        banco, más nuevos primero. Exige `banking:read` explícito.
      operationId: listBankAccountMovements_v2
      parameters:
        - name: account_id
          in: path
          required: true
          schema:
            type: string
            example: bacc_7Hk2938475610293
        - name: since
          in: query
          required: false
          schema:
            type: string
            format: date
          description: Desde esta `transaction_date`, inclusive.
        - name: until
          in: query
          required: false
          schema:
            type: string
            format: date
          description: Hasta esta `transaction_date`, inclusive.
        - name: direction
          in: query
          required: false
          schema:
            type: string
            enum:
              - inbound
              - outbound
        - name: status
          in: query
          required: false
          schema:
            type: string
            enum:
              - pending
              - posted
        - name: min_amount
          in: query
          required: false
          schema:
            type: number
          description: Sobre el monto sin signo.
        - name: max_amount
          in: query
          required: false
          schema:
            type: number
          description: Sobre el monto sin signo.
        - name: page
          in: query
          required: false
          schema:
            type: integer
            default: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            default: 50
            maximum: 200
        - name: fields
          in: query
          required: false
          schema:
            type: string
      responses:
        '200':
          description: Movimientos
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Movement'
                  meta:
                    type: object
                    properties:
                      page:
                        type: integer
                      page_size:
                        type: integer
                      total:
                        type: integer
                      total_pages:
                        type: integer
                  links:
                    type: object
                    properties:
                      next:
                        type: string
                        nullable: true
                      prev:
                        type: string
                        nullable: true
        '400':
          description: 'Un filtro inválido (`code: parameter_invalid`, `param`)'
        '403':
          description: >-
            La API key no tiene `banking:read` explícito (`code:
            banking_permission_required`)
        '404':
          description: La cuenta no existe para esta API key
      security:
        - apiKeyAuth: []
components:
  schemas:
    Movement:
      type: object
      properties:
        id:
          type: string
          example: move_Qm8102938475612
        account_id:
          type: string
          example: bacc_7Hk2938475610293
        company_id:
          type: string
          example: ment_3672486436546233854
        amount:
          type: number
          example: 450000
          description: Sin signo. Entero en CLP.
        direction:
          type: string
          enum:
            - inbound
            - outbound
        currency:
          type: string
          example: CLP
        status:
          type: string
          enum:
            - pending
            - posted
            - removed
        posted_movement_id:
          type: string
          nullable: true
          description: >-
            En una pendiente retirada: el id del movimiento posteado que la
            reemplazó.
        transaction_date:
          type: string
          format: date
          nullable: true
        post_date:
          type: string
          format: date
          nullable: true
        description:
          type: string
          description: La glosa tal cual la entrega el banco.
        balance_after:
          type: number
          nullable: true
          description: >-
            Saldo de la cuenta tras el movimiento, cuando la fuente lo entrega
            (cartolas).
        counterparty:
          $ref: '#/components/schemas/Counterparty'
        category:
          type: string
          nullable: true
          enum:
            - customer_payment
            - supplier_payment
            - payroll
            - taxes
            - bank_fees
            - internal_transfer
            - card_settlement
          description: >-
            Clasificación Tupana del movimiento. `null` si no se clasificó o no
            se identificó.
        card:
          type: object
          nullable: true
          description: Solo en movimientos de una cuenta de crédito.
          properties:
            last_four:
              type: string
              example: '2105'
            merchant:
              type: string
              nullable: true
              example: AMAZON WEB SERVICES
            installments:
              type: integer
              nullable: true
              description: '`null` hasta que la fuente lo entregue.'
    Counterparty:
      type: object
      nullable: true
      description: >-
        La contraparte resuelta por Tupana. `null` cuando no hay nada que
        resolver.
      properties:
        tax_id:
          type: string
          nullable: true
          example: 76.543.169-7
        name:
          type: string
          nullable: true
          example: Comercial Andina SpA
        institution:
          type: object
          nullable: true
          properties:
            code:
              type: string
              example: cl_banco_de_chile
            name:
              type: string
              example: Banco de Chile
        account_number_mask:
          type: string
          nullable: true
          example: '0912'
          description: Últimos 4 dígitos. El número completo nunca sale.
  securitySchemes:
    apiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: >-
        API Key para autenticación. Debe proporcionarse en el header
        Authorization con el formato: 'Api-Key YOUR-API-KEY' (incluye el prefijo
        'Api-Key ' seguido de tu API key)

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.