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

# List modules

> **Scope:** any one of `read`, `entries:write`.



## OpenAPI

````yaml /openapi.json get /v1/account-modules
openapi: 3.0.3
info:
  title: PanoQore API
  version: v1
  description: >-
    The REST form of the panoqore.v1 contract, limited to what an API key can
    call. Generated from the contract: do not edit by hand.


    Bodies are JSON in lowerCamelCase. A field at its zero value (empty string,
    `0`, `false`, empty list) is left out of responses. 64-bit integers and
    money are strings.
servers:
  - url: https://api.panoqore.example
    description: 'Live. PLACEHOLDER: the production host has not been set'
  - url: https://api.sandbox.panoqore.example
    description: 'Sandbox. PLACEHOLDER: the sandbox host has not been set'
  - url: http://localhost:8080
    description: A server on your own machine
security:
  - bearerAuth: []
tags:
  - name: Accounts
    description: Accounts, their balances and their history.
  - name: Entries
    description: 'Balanced journal entries: post, hold pending, reverse.'
  - name: Holds
    description: Reservations on an account with no counterparty yet.
  - name: Named accounts
    description: >-
      Partner account numbers bound to wallets, and the credits reported to
      them.
  - name: Lending
    description: >-
      Lending turns loan events into balanced entries on the Lending module's
      accounts. PanoQore holds no loan terms: schedules, interest, allocation
      and credit decisions stay with the product, which tells the ledger what
      happened. Loans are told apart by the product's loan_ref, which is opaque
      and carries no PII.
  - name: Fees
    description: >-
      Fees charges a tenant's schedules as extra postings. A schedule applies
      only to an entry that names it in fee_schedule: the first debit leg pays,
      and the fee is credited to the schedule's income account.
  - name: FX
    description: Rates, quotes and conversions.
  - name: Reconciliation
    description: Partner statements, breaks and the daily control.
  - name: Reporting
    description: Periods, exports and the trial balance.
  - name: Webhooks
    description: >-
      Outbound webhooks: the same CloudEvents the event stream shows, posted to
      a tenant's HTTPS endpoints. Each delivery carries Qore-Signature: t=<unix
      seconds>,v1=<hex HMAC-SHA256 of "<t>.<body>">, made with the endpoint's
      signing secret. A delivery that is not answered 2xx within 10 seconds is
      retried: eight tries over 24 hours, then it waits for a replay. Delivery
      is at least once; drop duplicates by the event id. Managing endpoints
      needs the manage scope (tenant admins) or webhooks:manage (an API key).
  - name: Approvals
    description: >-
      Maker-checker for every change to money. One workflow for adjustments,
      reversals, freezes, limit changes, FX rates, integration-mode changes,
      named-account changes and live API keys.
  - name: Events
    description: >-
      The append-only, hash-chained event log. The same rows feed Kafka through
      the outbox.
  - name: Chart of accounts
    description: >-
      The tenant's chart of accounts: one ledger per currency or token, built
      from account modules, with internal accounts created from templates.
      Customer wallets are opened through Ledger.CreateAccount.
  - name: Tenant
    description: The tenant and what it is connected to.
  - name: Identity
    description: Who a credential is.
paths:
  /v1/account-modules:
    get:
      tags:
        - Chart of accounts
      summary: List modules
      description: '**Scope:** any one of `read`, `entries:write`.'
      operationId: Charts_ListModules
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListModulesResponse'
        '401':
          $ref: '#/components/responses/Error'
        '403':
          $ref: '#/components/responses/Error'
        '503':
          $ref: '#/components/responses/Error'
components:
  schemas:
    ListModulesResponse:
      type: object
      properties:
        modules:
          type: array
          items:
            $ref: '#/components/schemas/AccountModule'
    AccountModule:
      type: object
      properties:
        id:
          type: string
          description: base, wallets, fx, remit, custody …
        name:
          type: string
        description:
          type: string
        version:
          type: integer
          format: int32
        changelog:
          type: string
        required:
          type: boolean
        dependsOn:
          type: array
          items:
            type: string
        templates:
          type: array
          items:
            $ref: '#/components/schemas/AccountTemplate'
        enabled:
          type: boolean
        group:
          type: string
          description: 'catalogue heading: Required, Money you hold, Payments …'
    Error:
      type: object
      description: Every refusal on a `/v1` path has this shape. Branch on `error.code`.
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
            - message
            - details
          properties:
            code:
              type: string
              description: Stable and safe to branch on.
              example: INSUFFICIENT_FUNDS
            message:
              type: string
              description: For people. It can change.
            details:
              type: object
              additionalProperties:
                type: string
              description: Context for this code. Empty when there is none.
            request_id:
              type: string
              description: >-
                Quote it when you ask about a failure. Absent on
                `INVALID_REQUEST`, which is refused before a handler runs.
    AccountTemplate:
      type: object
      properties:
        codePattern:
          type: string
          description: AST:SET:{CCY}:{PARTNER}
        name:
          type: string
        type:
          $ref: '#/components/schemas/AccountType'
        normalSide:
          $ref: '#/components/schemas/PostingSide'
        reportingLine:
          type: string
          description: '"Cash and balances with banks"'
        partyKind:
          type: string
          description: bank | psp | custody | any | "" when the template takes no party
    AccountType:
      type: string
      enum:
        - ASSET
        - LIABILITY
        - EQUITY
        - INCOME
        - EXPENSE
    PostingSide:
      type: string
      enum:
        - DEBIT
        - CREDIT
  responses:
    Error:
      description: Refused. See `error.code`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: An API key, `pk_live_…` or `pk_test_…`.

````

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