---
title: "Aggregated agent wallet transactions"
method: GET
path: "/v1/agent-wallets/expenses/transactions"
tags: ["Agent Wallets"]
---

# Aggregated agent wallet transactions

`GET /v1/agent-wallets/expenses/transactions`

## Request

- Base URL: `https://api.prod.keyban.io`
- URL: `https://api.prod.keyban.io/v1/agent-wallets/expenses/transactions`
- Auth: one of:
  - API key in header `X-Api-Key`
  - `bearer` (a scheme the document does not define)

Canonical USDC transfers across an application's agent wallets, newest first. Any other asset, native coin included, is left out: an airdropped lookalike token never shows up in the history. A payment Keyban covered from its welcome offer leaves the Keyban sponsor wallet and is listed with `sponsored: true`. The welcome offer itself is listed once at its grant date as a `sponsor-grant` row, with no amount and left out of the totals, on the offer network and only when neither `direction` nor `destination` narrows the list.

## Query parameters

- `applicationId` string, uuid, required
- `agentId` string, uuid
- `ownerId` string, uuid
- `destination` string
- `direction` 'out' | 'in'
- `currentPage` integer
- `pageSize` integer

## Response `200`

- PaginatedAggregatedTransactionDto
  - `data` union[], required: Array of items for the current page
    - union
      - object
        - `kind` 'transfer', required: An on-chain USDC transfer of an agent wallet.
        - `id` string, required: Stable row identifier for this transfer, unique within the aggregated list (derived from the transaction hash and the in-scope agent wallet).
        - `date` string, date-time, required: When the transfer occurred (RFC 3339), from the on-chain transaction date.
        - `txHash` string, required: Hash of the on-chain transaction carrying this transfer. Use it to look up the transaction in a block explorer for the agent network.
        - `direction` 'out' | 'in', required: "out" when the in-scope agent wallet is the sender (outgoing spend), "in" when it is the recipient (incoming funds).
        - `counterparty` string, required: Address of the other party to the transfer: the recipient when direction is "out", the sender when direction is "in".
        - `resource` string, nullable, required: For an outgoing x402 payment, the resource it unlocked — seller host + path, no query/fragment — correlated from the matching policy intent on (payTo, amount) around the consumption time, or through its EIP-3009 nonce for a payment Keyban covered. Null when no x402 intent matches (plain transfer, incoming funds, or pre-correlation history).
        - `service` object, nullable, required: Provider behind `resource` (name, and the gateway that resold it), from the x402 catalogue. Null when unknown or for a non-x402 transfer.
          - `name` string, required: Provider name.
          - `via` string, nullable, required: Gateway that resold the provider, null when paid directly.
        - `amountRef` string, nullable, required: For an outgoing x402 payment, its value in the application display currency priced at authorization time, as a decimal integer string in centi-units (e.g. "1180" = 11.80). Correlated from the matching policy intent. Null when no x402 intent matches (no historical fiat snapshot). This is the x402-correlation-specific value (a historical fiat snapshot at authorization, nullable) and must NOT be conflated with `walletPolicyIntentSchema.amountRef`, which is the policy budget reference amount (non-nullable).
        - `intentId` string, nullable, required: UUID of the policy intent this outgoing x402 payment was correlated to, so a transaction can be deep-linked back from the intent. Null when no x402 intent matches.
        - `decidedBy` string, nullable, required: Account (email) of the human who approved the correlated intent. Null when the spending rules approved it automatically, or when no intent matches (`intentId` null).
        - `decidedAt` string, date-time, nullable, required: When the correlated intent was decided (RFC 3339). Also set when the spending rules approved it automatically, so it can be non-null while `decidedBy` is null. Null when no intent matches (`intentId` null).
        - `value` string, required: Raw transfer amount as a decimal string in the asset smallest unit (e.g. 6-decimals base units for USDC).
        - `decimals` integer, nullable, required: Number of decimals of the transferred asset, used to convert value to a human amount (value / 10^decimals). Null for assets without a known contract (e.g. the native coin or an unrecognised token).
        - `tokenSymbol` string, nullable, required: Display symbol of the transferred asset (e.g. "USDC"). Null when the asset is unknown or has no symbol.
        - `tokenAddress` string, nullable, required: Contract address of the transferred token — the ERC-20 that `tokenSymbol` refers to. Null for the native coin or an asset with no known contract.
        - `success` boolean, required: True when the on-chain transaction succeeded; false for a reverted or failed transfer.
        - `sponsored` boolean, required: True when Keyban paid this x402 payment from its welcome offer: the transfer leaves the Keyban sponsor wallet, not the agent wallet.
        - `agent` object, required
          - `id` string, uuid, required: UUID of the agent wallet involved in this transfer (the in-scope side).
          - `label` string, required: Human-readable label of the agent wallet, as set by its owner.
          - `network` 'EthereumAnvil' | 'BaseSepolia' | 'BaseMainnet' | 'XdcApothem' | 'XdcMainnet' | 'StellarQuickstart' | 'StellarTestnet' | 'StellarMainnet', required: Blockchain network the agent wallet operates on.
          - `owner` object, nullable, required: Human accountable for the wallet (the "responsable"). Null for legacy wallets created before an owner was recorded.
            - `id` string, required: Id of the wallet owner (responsable) — a better-auth user id.
            - `name` string, required: Display name of the owner.
            - `email` string, required: Email of the owner.
      - object
        - `kind` 'sponsor-grant', required: The Keyban welcome offer of the organization: an information row, with no amount moved and left out of every spend total.
        - `id` string, required: Stable row identifier of the offer.
        - `date` string, date-time, required: When the offer was granted (RFC 3339).
        - `sponsorGrant` object, required: State of the offer when the list was read.
          - `network` 'EthereumAnvil' | 'BaseSepolia' | 'BaseMainnet' | 'XdcApothem' | 'XdcMainnet' | 'StellarQuickstart' | 'StellarTestnet' | 'StellarMainnet', required: Network on which Keyban covers the payments
          - `amount` string, required: Amount offered, in USDC base units (6 decimals)
          - `remaining` string, required: Amount still covered, in USDC base units (6 decimals)
          - `expiresAt` string, date-time, required: When what remains stops being covered
          - `status` 'active' | 'exhausted' | 'expired', required: active, exhausted (fully spent) or expired
  - `total` integer, required: Total count of items matching the query

---

[API](https://skmtc.dev/keyban/apis/keyban-rest-apis.md) · [All operations](https://skmtc.dev/keyban/apis/keyban-rest-apis/llms.txt) · [OpenAPI document](https://skmtc.dev/keyban/apis/keyban-rest-apis/revisions/0bb79a1da961?raw)
