# List transactions

> The key's transactions, newest first, a page at a time.

Source: https://useroutegate.com/docs/api/public/listPublicTransactions

`GET /api/v1/transactions`

Only the key's mode is listed. Follow `page.next_cursor` while `page.has_more` is `true`, keeping the other filters the same. See [pagination](/docs/concepts/pagination).

Authenticate with a bearer API key: `rg_test_` in test mode, `rg_live_` in live.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `status` | query | string | no | One of `created`, `queued`, `processing`, `pending`, `successful`, `failed`, `reversed`, `refunded`. |
| `destination` | query | string | no | Filter by recipient phone number or destination. |
| `network` | query | string | no | Filter by telecom network code (e.g. mtn, airtel, glo, 9mobile) A network code from [List networks](/docs/api/public/listNetworks). |
| `service` | query | string | no | Filter by service type (e.g. airtime, data) A service code from [List services](/docs/api/public/listServices). |
| `from` | query | string (date-time) | no | Filter items created on or after this timestamp (RFC 3339) |
| `to` | query | string (date-time) | no | Filter items created on or before this timestamp (RFC 3339) |
| `search` | query | string | no | Search by reference, client reference, or destination. |
| `cursor` | query | string | no | `page.next_cursor` from the previous page. See [pagination](/docs/concepts/pagination). |
| `limit` | query | integer | no | Items per page, 1 to 100. Default 25. |

## Request

```bash
curl -X GET "https://api.useroutegate.com/api/v1/transactions?status=successful&limit=25" \
  -H "Authorization: Bearer $ROUTEGATE_API_KEY"
```

## Response

`200`

```json
{
  "success": true,
  "code": "OK",
  "message": "OK",
  "data": {
    "items": [
      {
        "id": "01a0d8df-a6b8-7c3e-9f21-4b6d8e0a2c57",
        "reference": "txn_01a0d8dfa6b87d10a3e54c2b9f86d1e4",
        "client_reference": "ord-00042",
        "mode": "test",
        "status": "successful",
        "product_code": "MTN-VTU",
        "network": "mtn",
        "service": "airtime",
        "destination": "+234********78",
        "amount_kobo": 10000,
        "price_kobo": 10000,
        "metadata": {
          "data_type": "airtime",
          "plan_name": "MTN Airtime",
          "product_id": "00000000-0000-7000-8000-000000001301",
          "route": "provider"
        },
        "created_at": "2026-09-25T14:02:11Z",
        "completed_at": "2026-09-25T14:02:14Z"
      }
    ],
    "page": {
      "next_cursor": "MTc5MDM0NDkzMTAwMDAwMDAwMC4wMWEwZDhkZi1hNmI4LTdjM2UtOWYyMS00YjZkOGUwYTJjNTc",
      "has_more": true
    }
  }
}
```

## Error

`400` `VALIDATION_FAILED`: The cursor was not one this API issued. Pass `next_cursor` back exactly as it came. Every code is in [errors](/docs/concepts/errors).

```json
{
  "success": false,
  "data": {
    "errors": [
      {
        "field": "cursor",
        "message": "malformed"
      }
    ]
  },
  "message": "Invalid cursor",
  "code": "VALIDATION_FAILED"
}
```

## Give this to your coding agent

Read `https://useroutegate.com/docs/api/public/listPublicTransactions.md` and implement this call. Follow `page.next_cursor` while `page.has_more` is true. Amounts are integers in kobo.
