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

# List bank connections

> Returns the workspace's bank connections ordered by `name`, then `id`.

One connection is one authorisation with one bank, and it can feed several accounts.
Connections delegated from another workspace are included when they feed an account
this workspace can see, so every `bank` on an account resolves here.

Manual accounts have no connection and are not represented.




## OpenAPI

````yaml /openapi/v1.yaml get /banks
openapi: 3.1.0
info:
  title: ThinkOut API
  version: '1.0'
  description: >
    Programmatic access to the data of a ThinkOut workspace.


    Every endpoint in version 1 is a `GET`. Lists share one response envelope,
    and page

    with a cursor wherever the list can grow.


    Version 1 changes additively. New endpoints, new optional parameters, new
    response

    fields and new enum values can appear at any time, so tolerate unknown
    fields and

    never treat an enum as a closed set.
  contact:
    name: ThinkOut developer support
    url: https://developers.thinkout.io/guides/support
servers:
  - url: https://api.thinkout.io/v1
security:
  - apiKey: []
tags:
  - name: Banks
    description: The workspace's bank connections and the state of each one.
  - name: Accounts
    description: Manual, bank-synced and delegated accounts with computed balances.
  - name: Transactions
    description: Booked and pending movements on the workspace's accounts.
  - name: Categories
    description: The workspace category tree, split by direction and business activity.
  - name: Counterparties
    description: Customers and suppliers that transactions and forecasts are attributed to.
  - name: Labels
    description: Free-form tags grouped by label type.
  - name: Forecasts
    description: Planned inflows and outflows and the transactions that realised them.
  - name: Reports
    description: >-
      Totals rather than rows. Summaries over transactions and forecasts, and
      the workspace's own saved cash flow views.
paths:
  /banks:
    get:
      tags:
        - Banks
      summary: List bank connections
      description: >
        Returns the workspace's bank connections ordered by `name`, then `id`.


        One connection is one authorisation with one bank, and it can feed
        several accounts.

        Connections delegated from another workspace are included when they feed
        an account

        this workspace can see, so every `bank` on an account resolves here.


        Manual accounts have no connection and are not represented.
      operationId: listBanks
      parameters:
        - name: status
          in: query
          schema:
            $ref: '#/components/schemas/BankStatus'
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/cursor'
      responses:
        '200':
          description: A page of bank connections.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/List'
                  - type: object
                    properties:
                      data:
                        type: array
                        items:
                          $ref: '#/components/schemas/Bank'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimited'
components:
  schemas:
    BankStatus:
      type: string
      description: >
        The state of the connection as of ThinkOut's last exchange with the
        provider.


        `connected` is working. `loading` is a sync in progress.
        `requires_action` needs a

        person to sign in or re-approve the connection in ThinkOut, and no new
        transactions

        arrive until they do. `error` is a failure ThinkOut could not resolve on
        its own,

        and covers any provider state ThinkOut cannot place.


        Only `connected` means the data behind it is current.
      enum:
        - connected
        - loading
        - requires_action
        - error
    List:
      type: object
      required:
        - object
        - data
        - has_more
        - next_cursor
      properties:
        object:
          type: string
          const: list
        data:
          type: array
          items: {}
        has_more:
          type: boolean
          description: Whether another page exists.
        next_cursor:
          type:
            - string
            - 'null'
          description: Pass as `cursor` to fetch the next page. `null` on the last page.
    Bank:
      type: object
      description: >
        One authorisation with one bank. Several accounts can share a
        connection, and a

        workspace can hold several connections to the same bank.
      required:
        - object
        - id
        - name
        - country_code
        - status
        - last_sync_at
        - consent_expires_at
        - created_at
        - updated_at
      properties:
        object:
          type: string
          const: bank
        id:
          type: string
          format: uuid
        name:
          type: string
          description: The bank's name as the provider reports it.
          example: ING Bank
        country_code:
          type:
            - string
            - 'null'
          description: ISO 3166-1 alpha-2 country of the bank.
          pattern: ^[A-Z]{2}$
          example: RO
        status:
          $ref: '#/components/schemas/BankStatus'
        last_sync_at:
          type:
            - string
            - 'null'
          format: date-time
          description: >
            When the provider last returned data successfully. `null` when it
            never has.


            This is the age of the data, not the age of the connection. A
            connection can sit

            at `connected` with a `last_sync_at` days old, which is the case
            worth alerting

            on.
        consent_expires_at:
          type:
            - string
            - 'null'
          format: date-time
          description: >
            When the bank consent needs renewal, if the provider reports it.
            Once it passes,

            the connection stops returning new transactions until someone
            re-approves it.
        created_at:
          type: string
          format: date-time
          description: When the connection was first authorised.
        updated_at:
          type: string
          format: date-time
      example:
        object: bank
        id: 5d6e7f80-9a1b-4c2d-8e3f-4a5b6c7d8e9f
        name: ING Bank
        country_code: RO
        status: connected
        last_sync_at: '2026-09-03T06:00:00Z'
        consent_expires_at: '2026-11-30T00:00:00Z'
        created_at: '2024-01-01T10:00:00Z'
        updated_at: '2026-09-03T06:00:00Z'
    Error:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          required:
            - type
            - code
            - message
            - param
            - request_id
          properties:
            type:
              type: string
              enum:
                - invalid_request
                - authentication
                - not_found
                - rate_limit
                - server
            code:
              type: string
              description: >
                Stable machine-readable reason. Branch on this, not on
                `message`.

                Report-specific codes are `too_many_groups`, `period_too_long`,

                `as_of_in_future` and `invalid_expand`.
            message:
              type: string
              description: Human-readable explanation. Wording may change.
            param:
              type:
                - string
                - 'null'
              description: The query or path parameter at fault, when there is one.
            request_id:
              type: string
              description: Quote this when contacting support.
  parameters:
    limit:
      name: limit
      in: query
      description: Page size.
      schema:
        type: integer
        minimum: 1
        maximum: 500
        default: 100
    cursor:
      name: cursor
      in: query
      description: Opaque token from the previous page's `next_cursor`.
      schema:
        type: string
  responses:
    BadRequest:
      description: A parameter is invalid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              type: invalid_request
              code: invalid_parameter
              message: Parameter 'from' must be a date in YYYY-MM-DD format.
              param: from
              request_id: req_01J8ZT4Q7Y6M3K
    Unauthorized:
      description: The API key is missing, unknown or revoked.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              type: authentication
              code: unauthorized
              message: Invalid API key.
              param: null
              request_id: req_01J8ZT4Q7Y6M3K
    RateLimited:
      description: Too many requests. Wait for the number of seconds in `Retry-After`.
      headers:
        Retry-After:
          schema:
            type: integer
          description: Seconds to wait before retrying.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              type: rate_limit
              code: rate_limited
              message: Rate limit exceeded. Retry after 12 seconds.
              param: null
              request_id: req_01J8ZT4Q7Y6M3K
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: >-
        A workspace API key created in ThinkOut settings. One key reads one
        workspace.

````