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

# List an indirect participant's transactions

> Returns the movements that actually settled on ONE indirect participant's `@pi_{ispb}` account, so that participant can reconcile its own books against this ledger. Each row carries the end-to-end id, the direction, the amount, the settlement status, the instant it was booked, and both parties as captured at settlement — the payee block being the indirect's own client on a credit.

Call it whenever you need the authoritative record rather than the notice: this plugin PUSHES a message to the indirect's delivery endpoint on every movement, and that push can die permanently (the retries are exhausted, or the endpoint answers 4xx, after which the notice is parked as INVALID and never retried). The money is booked correctly either way, so a movement whose notice failed is invisible to the indirect until it is read here. Sweeping this feed on a schedule is what closes that gap; it is also the only way to re-read a window after a local outage.

Read-only; nothing changes, and no notice is re-sent.

**amount is in CENTAVOS, as an integer** — 1050 is R$ 10,50. It is never a decimal, and never reais.

**since is REQUIRED**, as an RFC 3339 instant. The feed is always read over a bounded window: without a lower bound the query is an unbounded sweep of the money table whose answer is not reproducible between two calls, so a caller could not tell a slow response from a truncated one. The window is HALF-OPEN — `since` is inclusive, `until` is exclusive — so two adjacent sweeps neither double-count a movement nor leave one in the gap between them; passing the previous window's `until` as the next window's `since` is the correct way to walk forward. `until` is optional and, when absent, leaves the window open-ended.

**Rows come back OLDEST FIRST, ordered by (occurredAt, id), and the cursor is the ONLY correct way to page.** The order is stable to the row: two movements can be booked in the same instant, and without the id as a tie-break a page boundary falling between them would return one of them and drop the other silently — which for a reconciliation is worse than returning nothing. Pass the previous page's nextCursor back as `cursor`; a null nextCursor means that page was the last one in the window. Do NOT try to page by advancing `since` past the last row's occurredAt: that skips every other movement booked in that same instant. The cursor is opaque — its content is this service's business and is free to change. `limit` defaults to 25 and is CLAMPED to 100 (a larger value is silently reduced, not rejected), so do not read the page size you asked for as the page size you got.

Refusals: 404 PIX-0095 when no indirect with that id exists in this tenant — an id belonging to another tenant is deliberately indistinguishable from an unknown one, and no movement is ever read for it; 422 PIX-0098 when `indirectId` is not a valid UUID, when `since` is absent or is not an RFC 3339 instant, when `until` is not an RFC 3339 instant or is not strictly after `since`, or when `cursor` is not a token this service issued (a cursor is refused rather than silently treated as the start of the window, which would replay settled movements as if they were new).



## OpenAPI

````yaml /en/openapi/v3-current/pix.yaml get /v1/indirects/{indirectId}/transactions
openapi: 3.1.0
info:
  description: Brazilian PIX Direct (DICT + SPI) plugin API.
  title: plugin-br-pix-jd
  version: 1.0.0
servers: []
security:
  - BearerAuth: []
paths:
  /v1/indirects/{indirectId}/transactions:
    get:
      tags:
        - Indirects
      summary: List an indirect participant's transactions
      description: >-
        Returns the movements that actually settled on ONE indirect
        participant's `@pi_{ispb}` account, so that participant can reconcile
        its own books against this ledger. Each row carries the end-to-end id,
        the direction, the amount, the settlement status, the instant it was
        booked, and both parties as captured at settlement — the payee block
        being the indirect's own client on a credit.


        Call it whenever you need the authoritative record rather than the
        notice: this plugin PUSHES a message to the indirect's delivery endpoint
        on every movement, and that push can die permanently (the retries are
        exhausted, or the endpoint answers 4xx, after which the notice is parked
        as INVALID and never retried). The money is booked correctly either way,
        so a movement whose notice failed is invisible to the indirect until it
        is read here. Sweeping this feed on a schedule is what closes that gap;
        it is also the only way to re-read a window after a local outage.


        Read-only; nothing changes, and no notice is re-sent.


        **amount is in CENTAVOS, as an integer** — 1050 is R$ 10,50. It is never
        a decimal, and never reais.


        **since is REQUIRED**, as an RFC 3339 instant. The feed is always read
        over a bounded window: without a lower bound the query is an unbounded
        sweep of the money table whose answer is not reproducible between two
        calls, so a caller could not tell a slow response from a truncated one.
        The window is HALF-OPEN — `since` is inclusive, `until` is exclusive —
        so two adjacent sweeps neither double-count a movement nor leave one in
        the gap between them; passing the previous window's `until` as the next
        window's `since` is the correct way to walk forward. `until` is optional
        and, when absent, leaves the window open-ended.


        **Rows come back OLDEST FIRST, ordered by (occurredAt, id), and the
        cursor is the ONLY correct way to page.** The order is stable to the
        row: two movements can be booked in the same instant, and without the id
        as a tie-break a page boundary falling between them would return one of
        them and drop the other silently — which for a reconciliation is worse
        than returning nothing. Pass the previous page's nextCursor back as
        `cursor`; a null nextCursor means that page was the last one in the
        window. Do NOT try to page by advancing `since` past the last row's
        occurredAt: that skips every other movement booked in that same instant.
        The cursor is opaque — its content is this service's business and is
        free to change. `limit` defaults to 25 and is CLAMPED to 100 (a larger
        value is silently reduced, not rejected), so do not read the page size
        you asked for as the page size you got.


        Refusals: 404 PIX-0095 when no indirect with that id exists in this
        tenant — an id belonging to another tenant is deliberately
        indistinguishable from an unknown one, and no movement is ever read for
        it; 422 PIX-0098 when `indirectId` is not a valid UUID, when `since` is
        absent or is not an RFC 3339 instant, when `until` is not an RFC 3339
        instant or is not strictly after `since`, or when `cursor` is not a
        token this service issued (a cursor is refused rather than silently
        treated as the start of the window, which would replay settled movements
        as if they were new).
      operationId: listIndirectTransactions
      parameters:
        - description: The indirect participant id.
          in: path
          name: indirectId
          required: true
          schema:
            description: The indirect participant id.
            examples:
              - 018f2b7c-0000-7000-8000-000000000000
            type: string
        - description: >-
            Window start, INCLUSIVE, as an RFC 3339 instant. Required: the feed
            is never read unbounded.
          explode: false
          in: query
          name: since
          required: true
          schema:
            description: >-
              Window start, INCLUSIVE, as an RFC 3339 instant. Required: the
              feed is never read unbounded.
            examples:
              - '2026-09-01T00:00:00Z'
            type: string
        - description: >-
            Window end, EXCLUSIVE, as an RFC 3339 instant. Absent leaves the
            window open-ended.
          explode: false
          in: query
          name: until
          schema:
            description: >-
              Window end, EXCLUSIVE, as an RFC 3339 instant. Absent leaves the
              window open-ended.
            examples:
              - '2026-09-02T00:00:00Z'
            type: string
        - description: Opaque cursor from the previous page's nextCursor.
          explode: false
          in: query
          name: cursor
          schema:
            description: Opaque cursor from the previous page's nextCursor.
            type: string
        - description: Page size (default 25, clamped to 100).
          explode: false
          in: query
          name: limit
          schema:
            description: Page size (default 25, clamped to 100).
            examples:
              - 25
            format: int64
            type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IndirectTransactionPage'
          description: OK
        '422':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Detail'
          description: Unprocessable Entity
        '500':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Detail'
          description: Internal Server Error
        default:
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Detail'
          description: Error
components:
  schemas:
    IndirectTransactionPage:
      additionalProperties: false
      properties:
        items:
          description: The movements on this page, oldest first.
          items:
            $ref: '#/components/schemas/IndirectTransaction'
          type:
            - array
            - 'null'
        nextCursor:
          description: >-
            Opaque cursor for the next page, or null when the window has been
            walked to its end.
          type:
            - string
            - 'null'
      required:
        - items
        - nextCursor
      type: object
    Detail:
      additionalProperties: false
      properties:
        code:
          description: >-
            Stable, machine-readable domain error code scoped to the emitting
            service (format: <SERVICE>-NNNN).
          examples:
            - ERR-0001
          type: string
        detail:
          description: >-
            A human-readable explanation specific to this occurrence of the
            problem.
          examples:
            - Property foo is required but is missing.
          type: string
        errors:
          description: Optional list of individual error details
          items:
            $ref: '#/components/schemas/ErrorDetail'
          type:
            - array
            - 'null'
        instance:
          description: >-
            A URI reference that identifies the specific occurrence of the
            problem.
          examples:
            - https://example.com/error-log/abc123
          format: uri
          type: string
        status:
          description: HTTP status code
          examples:
            - 400
          format: int64
          type: integer
        title:
          description: >-
            A short, human-readable summary of the problem type. This value
            should not change between occurrences of the error.
          examples:
            - Bad Request
          type: string
        type:
          default: about:blank
          description: A URI reference to human-readable documentation for the error.
          examples:
            - https://example.com/errors/example
          format: uri
          type: string
        upstream:
          $ref: '#/components/schemas/Upstream'
          description: >-
            RFC 9457 extension member: the error a proxied third-party provider
            reported. Absent unless the emitting service explicitly surfaced
            one.
      type: object
    IndirectTransaction:
      additionalProperties: false
      properties:
        amount:
          description: Movement amount, in centavos (integer). 1050 is R$ 10,50.
          examples:
            - 1050
          format: int64
          type: integer
        conciliationId:
          description: >-
            The QR conciliation id (txid), when the movement came from a QR
            code.
          examples:
            - CONC0001
          type: string
        direction:
          description: >-
            CREDIT when the money entered the indirect's account, DEBIT when it
            left.
          enum:
            - CREDIT
            - DEBIT
          examples:
            - CREDIT
          type: string
        endToEndId:
          description: The SPI end-to-end id of the movement.
          examples:
            - E12345678202609011200000000000001
          type: string
        occurredAt:
          description: >-
            When the movement was booked (UTC). It is the feed's primary sort
            key.
          format: date-time
          type: string
        payee:
          $ref: '#/components/schemas/IndirectTransactionParty'
          description: The receiving side — the indirect's own client on a credit.
        payer:
          $ref: '#/components/schemas/IndirectTransactionParty'
          description: The paying side.
        status:
          description: Settlement status of the movement.
          examples:
            - EXECUTED
          type: string
      required:
        - endToEndId
        - direction
        - amount
        - status
        - occurredAt
        - payer
        - payee
      type: object
    ErrorDetail:
      additionalProperties: false
      properties:
        location:
          description: >-
            Where the error occurred, e.g. 'body.items[3].tags' or
            'path.thing-id'
          type: string
        message:
          description: Error message text
          type: string
        value:
          description: The value at the given location
      type: object
    Upstream:
      additionalProperties: false
      properties:
        code:
          description: The upstream provider's own error code, verbatim.
          examples:
            - E4001
          type: string
        message:
          description: >-
            The upstream provider's own error message, verbatim (bounded, never
            its raw response body).
          examples:
            - account not found at provider
          type: string
      type: object
    IndirectTransactionParty:
      additionalProperties: false
      properties:
        accountDigit:
          description: Party account check digit.
          examples:
            - '5'
          type: string
        accountNumber:
          description: Party account number.
          examples:
            - '9990001'
          type: string
        bankId:
          description: Party institution's ISPB.
          examples:
            - '12345678'
          type: string
        branch:
          description: Party branch (agência).
          examples:
            - '0001'
          type: string
        document:
          description: Party CPF/CNPJ.
          examples:
            - '12345678901'
          type: string
        key:
          description: PIX key the movement addressed, when it used one.
          examples:
            - payee@example.com
          type: string
        keyType:
          description: PIX key type (CPF, CNPJ, EMAIL, PHONE, RANDOM).
          examples:
            - EMAIL
          type: string
        name:
          description: Party name as captured at settlement.
          examples:
            - Acme Ltda
          type: string
      type: object
  securitySchemes:
    BearerAuth:
      bearerFormat: JWT
      description: JWT bearer token issued by the identity provider.
      scheme: bearer
      type: http

````