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

# List Payments

> Returns your Router payments (newest first, capped at 1000) across every agent and delegation —
the unified audit trail. Filter by `delegationId` and by `from`/`to` (ISO-8601, inclusive on
`createdAt`). `format=csv` returns a CSV file download instead of the JSON array.



## OpenAPI

````yaml GET /router/payments
openapi: 3.1.0
info:
  title: Nevermined API
  description: >-
    API for managing AI agents, payment plans, and x402 payments in the
    Nevermined ecosystem.


    ## Prerequisites


    You need a Nevermined API Key to authenticate. Get one at
    [nevermined.app](https://nevermined.app) under **Settings > API Keys**.


    See the [5-Minute Setup Guide](/docs/integrate/quickstart/5-minute-setup)
    for detailed instructions.
  license:
    name: MIT
  version: 1.0.0
servers:
  - url: https://api.sandbox.nevermined.app/api/v1
    description: Sandbox (Testing) - Base Sepolia
  - url: https://api.live.nevermined.app/api/v1
    description: Live (Production) - Base Mainnet
security:
  - bearerAuth: []
tags:
  - name: Protocol - Agents
    description: Endpoints for registering and managing AI agents
  - name: Protocol - Plans
    description: Endpoints for creating and managing payment plans
  - name: Protocol - Credits
    description: Endpoints for minting and redeeming credits
  - name: Protocol - Access
    description: Endpoints for access tokens and request validation
  - name: X402 - Permissions
    description: Endpoints for x402 delegated permissions
paths:
  /router/payments:
    get:
      tags:
        - Router
      summary: List / export the buyer’s unified payment record across all agents
      description: >-
        Returns your Router payments (newest first, capped at 1000) across every
        agent and delegation —

        the unified audit trail. Filter by `delegationId` and by `from`/`to`
        (ISO-8601, inclusive on

        `createdAt`). `format=csv` returns a CSV file download instead of the
        JSON array.
      operationId: listRouterPayments
      parameters:
        - name: delegationId
          required: false
          in: query
          description: Only payments spent against this delegation id.
          schema:
            type: string
        - name: from
          required: false
          in: query
          description: ISO-8601 lower bound on createdAt (inclusive).
          schema:
            example: '2026-07-01T00:00:00Z'
            type: string
        - name: to
          required: false
          in: query
          description: ISO-8601 upper bound on createdAt (inclusive).
          schema:
            example: '2026-07-31T23:59:59Z'
            type: string
        - name: format
          required: false
          in: query
          description: >-
            Response format. Defaults to JSON; `csv` returns a downloadable
            file.
          schema:
            enum:
              - json
              - csv
            type: string
      responses:
        '200':
          description: The payment record — a JSON array (or a CSV file when `format=csv`).
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/RouterPaymentRecordDto'
            text/csv:
              schema:
                type: string
                description: >-
                  CSV export of the same records, served as a file download
                  (`Content-Disposition: attachment;
                  filename="router-payments.csv"`). Columns carry the JSON field
                  names; new ones are always appended at the end — `assetSymbol`
                  and `assetDecimals` are the most recent — so a consumer
                  reading by column index is unaffected when the record grows.
        '400':
          description: '`from`/`to` are not valid ISO-8601 timestamps (BCK.ROUTER.0001).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RouterErrorResponseDto'
        '401':
          description: Missing/invalid Nevermined API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RouterErrorResponseDto'
components:
  schemas:
    RouterPaymentRecordDto:
      type: object
      properties:
        id:
          type: string
          example: b1f9c2e4-3d5a-4c7e-9f21-6a8b0c4d2e13
        createdAt:
          type: string
          example: '2026-07-01T09:00:55.605Z'
        status:
          type: string
          enum:
            - Issued
            - Settled
            - Failed
          example: Settled
        protocol:
          type: string
          example: x402
        network:
          type: string
          example: base-sepolia
        asset:
          type: string
          example: USDC
          nullable: true
          description: >-
            The settlement asset AS PERSISTED AT MINT, which differs per rail: a
            symbol for x402 (`USDC`/`EURC`), the ERC-20 contract ADDRESS from
            the challenge for MPP-tempo, and an ISO currency code for
            MPP-stripe. Prefer `assetSymbol`/`assetDecimals` below for display —
            they normalise all three. Kept as-is for consumers that already
            parse it.
        assetSymbol:
          type: string
          description: >-
            Ticker to display for `asset`, resolved from the asset address on
            this row’s chain — `USDC`, `EURC`, `USDC.e`, `pathUSD`. `null` when
            the asset is not one we recognise there; render the (truncated)
            `asset` instead, never a guess.
          example: USDC.e
          nullable: true
        assetDecimals:
          type: number
          description: >-
            Decimal scale of `amount` for this asset, so a client never has to
            assume one. `null` when the asset is unrecognised — treat `amount`
            as raw atomic units rather than defaulting the scale, which would
            render a wrong NUMBER rather than a wrong label.
          example: 6
          nullable: true
        amount:
          type: string
          description: Amount in the asset’s smallest unit.
          example: '1000'
        merchantAddress:
          type: string
          description: >-
            The merchant's pay-to identifier: a 0x address for the crypto rails
            (x402 / MPP-tempo), or the seller's Stripe network business profile
            id (profile_…) for the MPP-stripe / SPT card rail.
          example: '0x209693Bc6afc0C5328bA36FaF03C514EF312287C'
        txHash:
          type: string
          nullable: true
          example: 0xfc8af37b...
        delegationId:
          type: string
          example: 5e7481c3-...
        requestId:
          type: string
          nullable: true
        resourceUrl:
          type: string
          nullable: true
          example: https://agent.example/resource
        buyer:
          type: string
          description: >-
            The buyer identity that funded the payment: the on-chain payer EOA
            (0x…) for the crypto rails (x402 / MPP-tempo), or the Stripe
            customer id (cus_…) for the MPP-stripe / SPT card rail.
          example: 0x8D6A5233...
        feeAtomic:
          type: string
          description: >-
            Nevermined’s routing fee for this payment, in the settlement asset’s
            smallest unit. `0` when no fee applied; `null` on rows that predate
            the fee.
          example: '0'
          nullable: true
        feeBps:
          type: number
          description: >-
            Fee rate applied, in basis points over 10,000. `null` on rows that
            predate the fee.
          example: 0
          nullable: true
        feeCents:
          type: string
          description: >-
            Cents the fee added to the delegation-cap reserve. Note `amount` on
            this record is the MERCHANT leg in atomic units, so the combined cap
            charge is not derivable from this resource alone — it is recorded as
            `amountCents` on `GET /delegation/{delegationId}/transactions`, with
            this fee broken out in that row’s `providerMetadata`.
          example: '0'
          nullable: true
        feeStatus:
          type: string
          description: Fee lifecycle, independent of the payment `status`.
          enum:
            - None
            - Accrued
            - Submitted
            - Settled
            - Failed
            - Released
          example: None
          nullable: true
        feeTxHash:
          type: string
          description: >-
            Settlement reference for the FEE leg — distinct from `txHash`, which
            is the MERCHANT leg’s. The two legs are independent movements that
            settle separately, so reconcile them separately. Reported verbatim
            by the facilitator (third-party text, not validated to a `0x`
            shape). `null` until the fee actually settles.
          example: 0x9c4d6f1e...
          nullable: true
        feeNonce:
          type: string
          description: >-
            EIP-3009 nonce of the fee leg, recorded when the leg is submitted.
            This is the only key that ties an on-chain transfer back to this
            payment: `authorizationState(buyer, feeNonce)` answers definitively
            whether the leg was consumed, which is how a `Submitted` fee is
            resolved. `null` until the leg is submitted. Not spendable on its
            own — the signed authorization is deliberately never stored.
          example: 0x7b1e2c...
          nullable: true
      required:
        - id
        - createdAt
        - status
        - protocol
        - network
        - amount
        - merchantAddress
        - delegationId
        - buyer
    RouterErrorResponseDto:
      type: object
      properties:
        code:
          type: string
          description: >-
            Router error code. `BCK.ROUTER.0001` invalid request / no fundable
            option / bad 402 (400); `BCK.ROUTER.0002` requestId already used —
            idempotency conflict (409); `BCK.ROUTER.0003` delegation budget
            exceeded, expired, or inactive (402); `BCK.ROUTER.0004` payment
            record not found (404); `BCK.ROUTER.0005` payment not in a
            settleable state (409). Framework-level `BCK.HTTP.*` codes (e.g.
            `BCK.HTTP.400` request validation, `BCK.HTTP.429` throttling) may
            also appear — see the base `code` field.
          example: BCK.ROUTER.0003
        httpStatus:
          type: number
          description: HTTP status code
          example: 500
        message:
          type: string
          description: Error message for Router operations.
          example: delegation budget exceeded, expired, or inactive
          examples:
            - >-
              delegationId is required — create one via POST
              /api/v1/delegation/create
            - 'no fundable option; offered: [...]'
            - >-
              upstream pay-to address is not in this delegation's allowed
              recipients
            - delegation budget exceeded, expired, or inactive
            - payment already settled with a different txHash
        details:
          type: string
          description: >-
            Throw-site detail string supplementing the canonical message. Only
            set when the call site supplied an opts.message; absent otherwise.
          example: Hash JWT is not signed by the node account
        error:
          type: string
          description: >-
            RFC 6749 §5.2 / RFC 8628 §3.5 top-level OAuth error string. Present
            only on the OAuth device-polling responses from `POST /oauth/token`
            (`authorization_pending`, `slow_down`, `expired_token`,
            `access_denied`), so a standards-compliant OAuth/device client can
            branch on it directly instead of on the Nevermined `code`. Absent on
            every other error.
          example: authorization_pending
        hint:
          type: string
          description: >-
            Actionable remediation hint, sourced from the catalogue or supplied
            at the throw site. Tells the caller what to fix or where to look.
          example: >-
            Verify the wallet has sufficient balance and that the plan is
            active.
        docsUrl:
          type: string
          description: Permalink to the docs page describing this error code.
          example: >-
            https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008
        category:
          type: string
          description: >-
            Coarse classification of the failure, useful for client-side
            branching without parsing the message.
          enum:
            - validation
            - auth
            - business
            - integration
            - internal
          example: integration
        retryable:
          type: boolean
          description: >-
            Whether the failure is transient and the same call can be retried
            with identical inputs. Absent when the catalogue does not assert
            either way.
          example: true
        correlationId:
          type: string
          description: >-
            Request-scoped correlation id stamped by the global filter. Echoed
            in the x-correlation-id response header. Quote this when reporting
            issues.
          example: a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9
        uuid:
          type: string
          description: >-
            Per-error UUID generated at construction. Useful for log
            correlation.
          example: e-550e8400-e29b-41d4-a716-446655440000
        date:
          type: string
          description: ISO timestamp at which the error was constructed.
          example: '2026-05-09T12:34:56.789Z'
          format: date-time
        params:
          type: string
          description: >-
            JSON-stringified contextual parameters supplied at the throw site
            (e.g. IDs, state). Always a string in the wire format — parse with
            JSON.parse if needed.
          example: '{"planId":"43298432984329","reason":"Invalid configuration"}'
      required:
        - code
        - httpStatus
        - message
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Your Nevermined API Key (starts with 'nvm:'). Get one at
        [nevermined.app](https://nevermined.app) under **Settings > API Keys**.

````

## Related topics

- [Payment ledger](/docs/products/router/ledger.md)
- [List Payment Methods](/docs/api-reference/payment-methods/list-payment-methods.md)
- [API Reference](/docs/api-reference/openclaw-plugin/commands.md)
- [Building a Paid AI Agent with OpenClaw and Nevermined](/docs/api-reference/openclaw-plugin/guide.md)
- [X402 Protocol](/docs/api-reference/typescript/x402.md)
