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

# Riwayat Transaksi

> Ambil riwayat transaksi yang mudah dibaca untuk alamat Solana apa pun dengan pemfilteran, rentang waktu dan slot, serta paginasi.

<Warning>
  Enhanced Transactions API adalah produk lama dalam mode pemeliharaan. Produk ini masih berfungsi dan halaman-halaman ini tetap tersedia, tetapi tidak lagi menerima jenis parser atau pengembangan fitur baru. Penerusnya adalah [Parsed Events](/docs/id/parsed-events), yang mendekode instruksi melalui katalog IDL dan tersedia di semua paket dengan biaya 10 kredit per permintaan. [Panduan migrasi](/docs/id/parsed-events/guides/migrate-from-enhanced-transactions) membahas proses perpindahan langkah demi langkah. Anda juga dapat menggunakan [`getTransactionsForAddress`](/docs/id/rpc/gettransactionsforaddress) untuk riwayat transaksi dan backfill, serta [Wallet API](/docs/id/wallet-api/overview) untuk data dompet yang mudah dibaca.
</Warning>

## Ringkasan

Endpoint Riwayat Transaksi mengembalikan riwayat transaksi yang mudah dibaca untuk alamat Solana apa pun. Alih-alih menangani data instruksi mentah dan daftar akun, Anda mendapatkan informasi terstruktur tentang:

* Apa yang terjadi dalam transaksi (transfer, swap, aktivitas NFT).
* Akun mana yang terlibat.
* Berapa banyak SOL atau token yang ditransfer.
* Metadata terkait (alamat mint token, nama token, simbol token, dan lainnya).

Kirim permintaan `GET` ke `/v0/addresses/{address}/transactions`. Di balik layar, endpoint ini didukung oleh metode RPC [`getTransactionsForAddress`](/docs/id/rpc/gettransactionsforaddress).

## Kapan menggunakannya

* Anda menampilkan riwayat transaksi suatu alamat kepada pengguna (dompet, pelacak portofolio, penjelajah).
* Anda menginginkan riwayat yang telah diurai dan mudah dibaca tanpa perlu menulis dekoder sendiri.
* Anda perlu memfilter riwayat berdasarkan jenis transaksi, rentang waktu, atau rentang slot.
* Anda memerlukan riwayat token lengkap milik suatu dompet, termasuk akun token terkait (ATA) — lihat di bawah.

Untuk pengembangan baru, [`getTransactionsForAddress`](/docs/id/rpc/gettransactionsforaddress) adalah jalur modern bawaan Helius dengan pemfilteran sisi server dan pencarian akun token.

## Mulai cepat

<Steps>
  <Step title="Get your API key">
    Daftar di [dashboard.helius.dev](https://dashboard.helius.dev) dan salin kunci API Anda.
  </Step>

  <Step title="GET the address transactions endpoint">
    Ambil riwayat transaksi untuk alamat Solana apa pun.

    <Tabs>
      <Tab title="JavaScript">
        ```javascript theme={"system"}
        const fetchWalletTransactions = async () => {
          const walletAddress = "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K"; // Replace with target wallet
          const url = `https://mainnet.helius-rpc.com/v0/addresses/${walletAddress}/transactions?api-key=YOUR_API_KEY`;

          const response = await fetch(url);
          const transactions = await response.json();
          console.log("Wallet transactions:", transactions);
        };

        fetchWalletTransactions();
        ```
      </Tab>

      <Tab title="Python">
        ```python theme={"system"}
        import requests

        def fetch_wallet_transactions():
            wallet_address = "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K"  # Replace with target wallet
            url = f"https://mainnet.helius-rpc.com/v0/addresses/{wallet_address}/transactions?api-key=YOUR_API_KEY"

            response = requests.get(url)
            transactions = response.json()
            print("Wallet transactions:", transactions)

        fetch_wallet_transactions()
        ```
      </Tab>
    </Tabs>
  </Step>

  <Step title="Filter and paginate">
    Persempit hasil dengan filter `type`, waktu, dan slot di bawah ini, lalu telusuri alamat dengan volume tinggi per halaman menggunakan kursor tanda tangan.
  </Step>
</Steps>

## Dukungan jaringan

| Jaringan | Didukung | Periode retensi |
| -------- | -------- | --------------- |
| Mainnet  | Ya       | Tidak terbatas  |
| Devnet   | Ya       | 2 minggu        |
| Testnet  | Tidak    | T/A             |

## Parameter permintaan

| Parameter          | Deskripsi                                                                   | Default     | Contoh                           |
| ------------------ | --------------------------------------------------------------------------- | ----------- | -------------------------------- |
| `limit`            | Jumlah transaksi yang akan dikembalikan (1-100)                             | 10          | `&limit=25`                      |
| `before-signature` | Ambil transaksi sebelum tanda tangan ini (gunakan dengan `sort-order=desc`) | -           | `&before-signature=sig123...`    |
| `after-signature`  | Ambil transaksi setelah tanda tangan ini (gunakan dengan `sort-order=asc`)  | -           | `&after-signature=sig456...`     |
| `type`             | Filter berdasarkan jenis transaksi                                          | -           | `&type=NFT_SALE`                 |
| `sort-order`       | Urutan hasil                                                                | `desc`      | `&sort-order=asc`                |
| `token-accounts`   | Filter transaksi untuk akun token terkait                                   | `none`      | `&token-accounts=balanceChanged` |
| `commitment`       | Tingkat komitmen                                                            | `finalized` | `&commitment=confirmed`          |

### Pemfilteran berbasis waktu

| Parameter  | Deskripsi                                          | Contoh                 |
| ---------- | -------------------------------------------------- | ---------------------- |
| `gt-time`  | Transaksi setelah stempel waktu Unix ini           | `&gt-time=1656442333`  |
| `gte-time` | Transaksi pada atau setelah stempel waktu Unix ini | `&gte-time=1656442333` |
| `lt-time`  | Transaksi sebelum stempel waktu Unix ini           | `&lt-time=1656442333`  |
| `lte-time` | Transaksi pada atau sebelum stempel waktu Unix ini | `&lte-time=1656442333` |

### Pemfilteran berbasis slot

| Parameter  | Deskripsi                            | Contoh                |
| ---------- | ------------------------------------ | --------------------- |
| `gt-slot`  | Transaksi setelah slot ini           | `&gt-slot=148277128`  |
| `gte-slot` | Transaksi pada atau setelah slot ini | `&gte-slot=148277128` |
| `lt-slot`  | Transaksi sebelum slot ini           | `&lt-slot=148277128`  |
| `lte-slot` | Transaksi pada atau sebelum slot ini | `&lte-slot=148277128` |

Catatan pemfilteran:

* Parameter waktu menggunakan stempel waktu Unix (detik sejak epoch); parameter slot menggunakan nomor slot Solana.
* Anda tidak dapat menggabungkan filter berbasis waktu dan berbasis slot dalam permintaan yang sama.
* Gunakan `sort-order=asc` untuk urutan naik (terlama terlebih dahulu) atau `sort-order=desc` untuk urutan turun (terbaru terlebih dahulu).
* Gunakan filter waktu atau slot untuk mempersempit ruang pencarian saat Anda mengetahui perkiraan periodenya, dan pasangkan dengan `limit` untuk mengontrol ukuran halaman.

## Akun token terkait

Di Solana, dompet tidak menyimpan token secara langsung. Sebaliknya, dompet memiliki akun token, dan akun token tersebut menyimpan token. Ketika seseorang mengirimkan USDC kepada Anda, token tersebut masuk ke akun token USDC Anda, bukan ke alamat dompet utama Anda.

Endpoint ini unik karena dapat melakukan kueri atas **riwayat token lengkap** suatu dompet, termasuk akun token terkait (ATA). Metode RPC native seperti `getSignaturesForAddress` tidak menyertakan ATA.

Filter `token-accounts` mengontrol perilaku ini:

* **`none`** (default) — hanya mengembalikan transaksi yang secara langsung merujuk alamat dompet. Gunakan ini jika Anda hanya memerlukan interaksi dompet langsung.
* **`balanceChanged`** (disarankan) — mengembalikan transaksi yang merujuk alamat dompet atau mengubah saldo akun token milik dompet. Opsi ini menyaring spam dan operasi yang tidak terkait seperti pemungutan biaya atau delegasi, sehingga memberi Anda tampilan yang bersih atas aktivitas dompet yang relevan.
* **`all`** — mengembalikan semua transaksi yang merujuk alamat dompet atau akun token apa pun milik dompet.

<Warning>
  Filter `token-accounts` bergantung pada kolom `owner` dalam metadata saldo token, yang belum tersedia sebelum slot 111.491.819 (\~Desember 2022). Transaksi yang melibatkan akun token yang aktif sebelum slot ini mungkin tidak ada dalam hasil `balanceChanged` dan `all`. Lihat [tutorial getTransactionsForAddress](/docs/id/rpc/gettransactionsforaddress#batasan-dan-kasus-khusus) untuk solusi alternatif beserta contoh kode lengkap.
</Warning>

## Filter

### Filter berdasarkan jenis transaksi

Dapatkan hanya jenis transaksi tertentu, seperti penjualan NFT, transfer token, atau swap:

<Tabs>
  <Tab title="NFT Sales">
    ```javascript theme={"system"}
    const fetchNftSales = async () => {
      const tokenAddress = "GjUG1BATg5V4bdAr1csKys1XK9fmrbntgb1iV7rAkn94"; // NFT mint address
      const url = `https://mainnet.helius-rpc.com/v0/addresses/${tokenAddress}/transactions?api-key=YOUR_API_KEY&type=NFT_SALE`;

      const response = await fetch(url);
      const nftSales = await response.json();
      console.log("NFT sale transactions:", nftSales);
    };
    ```
  </Tab>

  <Tab title="Token Transfers">
    ```javascript theme={"system"}
    const fetchTokenTransfers = async () => {
      const walletAddress = "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K"; // Wallet address
      const url = `https://mainnet.helius-rpc.com/v0/addresses/${walletAddress}/transactions?api-key=YOUR_API_KEY&type=TRANSFER`;

      const response = await fetch(url);
      const transfers = await response.json();
      console.log("Transfer transactions:", transfers);
    };
    ```
  </Tab>

  <Tab title="Swaps">
    ```javascript theme={"system"}
    const fetchSwapTransactions = async () => {
      const walletAddress = "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K"; // Wallet address
      const url = `https://mainnet.helius-rpc.com/v0/addresses/${walletAddress}/transactions?api-key=YOUR_API_KEY&type=SWAP`;

      const response = await fetch(url);
      const swaps = await response.json();
      console.log("Swap transactions:", swaps);
    };
    ```
  </Tab>
</Tabs>

Untuk daftar lengkap jenis transaksi yang didukung, lihat [referensi Transaction History API](/docs/id/api-reference/enhanced-transactions/gettransactionsbyaddress).

### Pemfilteran jenis saat runtime

<Note>
  Pemfilteran jenis dilakukan saat runtime: API mencari transaksi secara berurutan hingga menemukan setidaknya 50 item yang cocok. Jika tidak menemukan kecocokan dalam jendela pencarian, API mengembalikan kesalahan dengan tanda tangan untuk melanjutkan pencarian. Ini adalah perilaku yang diharapkan, bukan kegagalan.
</Note>

Jika tidak ada transaksi yang cocok dalam jendela pencarian saat ini, API mengembalikan respons kesalahan seperti berikut:

```json theme={"system"}
{
  "error": "Failed to find events within the search period. To continue search, query the API again with the `before-signature` parameter set to 2UKbsu95YzxGjUGYRg2znozmmVADVgmnhHqzDxq8Xfb3V5bf2NHUkaXGPrUpQnRFVHVKbawdQXtm4xJt9njMDHvg."
}
```

Untuk melanjutkan, gunakan tanda tangan dari pesan kesalahan dengan parameter yang sesuai (`before-signature` untuk urutan turun, `after-signature` untuk urutan naik) pada permintaan berikutnya.

<Accordion title="Continuation loop for type filters (full example)">
  ```javascript theme={"system"}
  const fetchFilteredTransactions = async (sortOrder = 'desc') => {
    const walletAddress = "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K";
    const transactionType = "NFT_SALE";
    let continuationSignature = null;
    let allFilteredTransactions = [];
    let maxRetries = 10; // Prevent infinite loops
    let retryCount = 0;

    // Determine which parameter to use based on sort order
    const continuationParam = sortOrder === 'asc' ? 'after-signature' : 'before-signature';

    while (retryCount < maxRetries) {
      // Build URL with optional continuation parameter
      let url = `https://mainnet.helius-rpc.com/v0/addresses/${walletAddress}/transactions?api-key=YOUR_API_KEY&type=${transactionType}&sort-order=${sortOrder}`;

      if (continuationSignature) {
        url += `&${continuationParam}=${continuationSignature}`;
      }

      try {
        const response = await fetch(url);
        const data = await response.json();

        // Check if we received an error about search period
        if (data.error && data.error.includes("Failed to find events within the search period")) {
          // Extract the signature from the error message
          const signatureMatch = data.error.match(/parameter set to ([A-Za-z0-9]+)/);

          if (signatureMatch && signatureMatch[1]) {
            console.log(`No results in this period. Continuing search from: ${signatureMatch[1]}`);
            continuationSignature = signatureMatch[1];
            retryCount++;
            continue; // Continue searching with new signature
          } else {
            console.log("No more transactions to search");
            break;
          }
        }

        // Check if we received transactions
        if (Array.isArray(data) && data.length > 0) {
          console.log(`Found ${data.length} ${transactionType} transactions`);
          allFilteredTransactions = [...allFilteredTransactions, ...data];

          // Set continuation signature for next page
          continuationSignature = data[data.length - 1].signature;
          retryCount = 0; // Reset retry count since we found results
        } else {
          console.log("No more transactions found");
          break;
        }

      } catch (error) {
        console.error("Error fetching transactions:", error);
        break;
      }
    }

    console.log(`Total ${transactionType} transactions found: ${allFilteredTransactions.length}`);
    return allFilteredTransactions;
  };

  // Usage examples:
  // Descending order (newest first) - uses 'before-signature' parameter
  fetchFilteredTransactions('desc');

  // Ascending order (oldest first) - uses 'after-signature' parameter
  fetchFilteredTransactions('asc');
  ```

  Poin penting:

  * API menelusuri hingga 50 transaksi sekaligus saat menggunakan filter jenis.
  * Jika tidak ditemukan kecocokan, gunakan tanda tangan dari pesan kesalahan untuk melanjutkan pencarian.
  * Gunakan `before-signature` saat mencari dalam urutan turun (default, terbaru terlebih dahulu).
  * Gunakan `after-signature` saat mencari dalam urutan naik (terlama terlebih dahulu) — wajib untuk pencarian kronologis.
  * Terapkan batas maksimum percobaan ulang untuk mencegah perulangan tanpa batas.
</Accordion>

## Contoh

Skenario berikut mencakup rentang waktu dan slot, urutan, ATA, serta filter gabungan.

<Accordion title="Filter by time range">
  Dapatkan transaksi dalam rentang waktu tertentu:

  <Tabs>
    <Tab title="Last 24 Hours">
      ```javascript theme={"system"}
      const fetchRecentTransactions = async () => {
        const walletAddress = "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K";
        const now = Math.floor(Date.now() / 1000);
        const oneDayAgo = now - (24 * 60 * 60);

        const url = `https://mainnet.helius-rpc.com/v0/addresses/${walletAddress}/transactions?api-key=YOUR_API_KEY&gte-time=${oneDayAgo}&lte-time=${now}`;

        const response = await fetch(url);
        const transactions = await response.json();
        console.log("Transactions from last 24 hours:", transactions);
      };
      ```
    </Tab>

    <Tab title="Specific Date Range">
      ```javascript theme={"system"}
      const fetchTransactionsByDateRange = async () => {
        const walletAddress = "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K";

        // January 1, 2024 to January 31, 2024
        const startTime = Math.floor(new Date('2024-01-01').getTime() / 1000);
        const endTime = Math.floor(new Date('2024-01-31').getTime() / 1000);

        const url = `https://mainnet.helius-rpc.com/v0/addresses/${walletAddress}/transactions?api-key=YOUR_API_KEY&gte-time=${startTime}&lte-time=${endTime}`;

        const response = await fetch(url);
        const transactions = await response.json();
        console.log("Transactions in January 2024:", transactions);
      };
      ```
    </Tab>
  </Tabs>
</Accordion>

<Accordion title="Filter by slot range">
  Dapatkan transaksi dalam rentang slot tertentu:

  ```javascript theme={"system"}
  const fetchTransactionsBySlotRange = async () => {
    const walletAddress = "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K";
    const startSlot = 148000000;
    const endSlot = 148100000;

    const url = `https://mainnet.helius-rpc.com/v0/addresses/${walletAddress}/transactions?api-key=YOUR_API_KEY&gte-slot=${startSlot}&lte-slot=${endSlot}`;

    const response = await fetch(url);
    const transactions = await response.json();
    console.log(`Transactions between slots ${startSlot} and ${endSlot}:`, transactions);
  };
  ```
</Accordion>

<Accordion title="Change sort order">
  Dapatkan transaksi dalam urutan naik (terlama terlebih dahulu):

  ```javascript theme={"system"}
  const fetchOldestTransactions = async () => {
    const walletAddress = "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K";
    const url = `https://mainnet.helius-rpc.com/v0/addresses/${walletAddress}/transactions?api-key=YOUR_API_KEY&sort-order=asc&limit=10`;

    const response = await fetch(url);
    const transactions = await response.json();
    console.log("10 oldest transactions:", transactions);
  };
  ```
</Accordion>

<Accordion title="Include transfers for related token accounts">
  Kueri riwayat lengkap suatu dompet, termasuk alamat token terkait (ATA):

  ```javascript theme={"system"}
  const fetchTransactionsWithATA = async () => {
    const walletAddress = "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K";

    const url = `https://mainnet.helius-rpc.com/v0/addresses/${walletAddress}/transactions?api-key=YOUR_API_KEY&token-accounts=balanceChanged&sort-order=desc&limit=50`;

    const response = await fetch(url);
    const transactions = await response.json();
    console.log("Most recent transactions (including ATA transfers)", transactions);
  };
  ```
</Accordion>

<Accordion title="Combine multiple filters">
  Gabungkan pemfilteran jenis dengan rentang waktu dan urutan khusus:

  ```javascript theme={"system"}
  const fetchFilteredTransactionsAdvanced = async () => {
    const walletAddress = "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K";

    // Get NFT sales from the last 7 days, oldest first
    const now = Math.floor(Date.now() / 1000);
    const sevenDaysAgo = now - (7 * 24 * 60 * 60);

    const url = `https://mainnet.helius-rpc.com/v0/addresses/${walletAddress}/transactions?api-key=YOUR_API_KEY&type=NFT_SALE&gte-time=${sevenDaysAgo}&sort-order=asc&limit=50`;

    const response = await fetch(url);
    const transactions = await response.json();
    console.log("NFT sales from last 7 days (oldest first):", transactions);
  };
  ```
</Accordion>

## Paginasi

Untuk alamat dengan volume tinggi, telusuri hasil per halaman menggunakan tanda tangan terakhir di setiap batch sebagai kursor:

```javascript theme={"system"}
const fetchAllTransactions = async () => {
  const walletAddress = "2k5AXX4guW9XwRQ1AKCpAuUqgWDpQpwFfpVFh3hnm2Ha"; // Replace with target wallet
  const baseUrl = `https://mainnet.helius-rpc.com/v0/addresses/${walletAddress}/transactions?api-key=YOUR_API_KEY`;
  let url = baseUrl;
  let lastSignature = null;
  let allTransactions = [];

  while (true) {
    if (lastSignature) {
      url = baseUrl + `&before-signature=${lastSignature}`;
    }

    const response = await fetch(url);

    // Check response status
    if (!response.ok) {
      console.error(`API error: ${response.status}`);
      break;
    }

    const transactions = await response.json();

    if (transactions && transactions.length > 0) {
      console.log(`Fetched batch of ${transactions.length} transactions`);
      allTransactions = [...allTransactions, ...transactions];
      lastSignature = transactions[transactions.length - 1].signature;
    } else {
      console.log(`Finished! Total transactions: ${allTransactions.length}`);
      break;
    }
  }

  return allTransactions;
};
```

Untuk melakukan paginasi dalam rentang waktu, pertahankan filter waktu pada setiap permintaan dan majukan kursor `before-signature` pada setiap perulangan:

```javascript theme={"system"}
const fetchAllTransactionsInTimeRange = async () => {
  const walletAddress = "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K";
  const startTime = Math.floor(new Date('2024-01-01').getTime() / 1000);
  const endTime = Math.floor(new Date('2024-01-31').getTime() / 1000);

  let beforeSignature = null;
  let allTransactions = [];

  while (true) {
    let url = `https://mainnet.helius-rpc.com/v0/addresses/${walletAddress}/transactions?api-key=YOUR_API_KEY&gte-time=${startTime}&lte-time=${endTime}&limit=100`;

    if (beforeSignature) {
      url += `&before-signature=${beforeSignature}`;
    }

    const response = await fetch(url);
    const transactions = await response.json();

    if (!Array.isArray(transactions) || transactions.length === 0) {
      break;
    }

    allTransactions = [...allTransactions, ...transactions];
    beforeSignature = transactions[transactions.length - 1].signature;

    console.log(`Fetched ${transactions.length} transactions, total: ${allTransactions.length}`);
  }

  console.log(`Total transactions in time range: ${allTransactions.length}`);
  return allTransactions;
};
```

## Langkah berikutnya

<CardGroup cols={2}>
  <Card title="getTransactionsForAddress" icon="clock-rotate-left" href="/docs/id/rpc/gettransactionsforaddress">
    Pengganti modern bawaan Helius untuk riwayat transaksi dan backfill.
  </Card>

  <Card title="Wallet API" icon="wallet" href="/docs/id/wallet-api/overview">
    Endpoint REST untuk data dompet yang mudah dibaca: saldo, riwayat, dan transfer.
  </Card>

  <Card title="Parse Transactions" icon="code" href="/docs/id/enhanced-transactions/parse-transactions">
    Uraikan satu atau beberapa tanda tangan transaksi menjadi data yang mudah dibaca.
  </Card>

  <Card title="Getting Data overview" icon="database" href="/docs/id/getting-data">
    Bandingkan setiap opsi Helius untuk melakukan kueri data Solana.
  </Card>
</CardGroup>
