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

# Track transactions

> List, filter, and poll transactions; link out to the explorer; and download notarized receipts.

Everything the sandbox does on-chain is recorded as a
[transaction](/concepts/transactions). This guide covers the read side:
history, filters, polling patterns, and receipts.

## List with filters

```bash theme={null}
curl -s "$BASE/transactions?page=1&pageSize=20&type=PRIVATE_TRANSFER&status=CONFIRMED&walletId=$WALLET" \
  -H "Authorization: Bearer $KEY"
```

| Query param | Values                                                    |
| ----------- | --------------------------------------------------------- |
| `page`      | 1-based page number (default `1`).                        |
| `pageSize`  | Items per page (default `20`, max `100`).                 |
| `type`      | `FUND`, `MINT`, `TRANSFER`, `PRIVATE_TRANSFER`, `REDEEM`. |
| `status`    | `PENDING`, `CONFIRMED`, `SETTLING`, `SETTLED`, `FAILED`.  |
| `walletId`  | Restrict to one wallet.                                   |

```json theme={null}
{
  "ok": true,
  "data": {
    "items": [ { "id": "cktxn0003…", "type": "PRIVATE_TRANSFER", "status": "CONFIRMED", "…": "…" } ],
    "page": 1,
    "pageSize": 20,
    "total": 42
  }
}
```

## Poll a single transaction

Reading a transaction is also what advances it: in-flight rows are
reconciled on read (receipt lookups, redeem settlement). Poll until the status
is terminal:

```bash theme={null}
poll() {
  local tx="$1"
  while :; do
    local status
    status=$(curl -s "$BASE/transactions/$tx" -H "Authorization: Bearer $KEY" \
      | jq -r .data.transaction.status)
    printf '%s\n' "$status"
    case "$status" in CONFIRMED|SETTLED|FAILED) break;; esac
    sleep 5
  done
}
poll "cktxn0004…"
```

Guidelines:

* **A modest interval (3–10 s) is plenty.** Reads count against the
  120-reads/min [rate limit](/security/rate-limits), and Sepolia blocks land
  every \~12 s anyway.
* **Terminal states are** `CONFIRMED`, `SETTLED`, and `FAILED`. `PENDING` and
  `SETTLING` always warrant another poll.
* **`FAILED` carries context** in the `error` field; the row is kept for your
  audit trail.

## Deep-link to the explorer

Every transaction with a hash includes an `explorerUrl`, a direct Sepolia
Etherscan link. For redeems, `settlementTxHash` identifies the payout leg
(construct its URL the same way if you need it).

<Note>
  For `PRIVATE_TRANSFER` rows, the explorer shows the transfer but **not the
  amount**; that's the point. Your own transaction row keeps the plaintext
  `amount` because you're a party to it.
</Note>

## Download a receipt

Once a transaction has reached the chain, produce a notarized
[.nota receipt](/concepts/nota-files):

```bash theme={null}
curl -s "$BASE/transactions/$TX/nota" -H "Authorization: Bearer $KEY" \
  | jq -r .data.nota > receipt.nota
```

Receipts for transactions that can't yet be represented return `400`; retry
after the transaction confirms.

## In the dashboard

The **Transactions** page mirrors all of this: filterable history, detail
views with both legs, explorer links, and one-click receipt downloads. Handy
for eyeballing what your integration just did.
