> ## 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.

# 取引履歴

> 任意のSolanaアドレスの人が読みやすい取引履歴を取得し、フィルタリング、時間とスロット範囲、およびページネーションを行います。

<Warning>
  Enhanced Transactions APIはメンテナンスモードのレガシープロダクトです。動作はしますが、新しいパーサータイプや機能は追加されません。新しいビルドには、トランザクション履歴とバックフィルには[`getTransactionsForAddress`](/ja/rpc/gettransactionsforaddress)を、人が読みやすいウォレットデータの取得には[Wallet API](/ja/wallet-api/overview)を使用してください。
</Warning>

## 概要

Transaction Historyエンドポイントは、任意のSolanaアドレスの人が読みやすい取引履歴を返します。生のインストラクションデータやアカウントリストを扱う代わりに、構造化された情報を取得できます。

* 取引で何が起こったか（転送、スワップ、NFT活動）。
* 関与したアカウント。
* 転送されたSOLまたはトークンの量。
* 関連するメタデータ（トークンミントアドレス、トークン名、トークンシンボルなど）。

\[`GET`]リクエストを\[`/v0/addresses/{address}/transactions`]に送信します。このエンドポイントは[`getTransactionsForAddress`](/ja/rpc/gettransactionsforaddress)RPCメソッドによって駆動されています。

## 使用タイミング

* アドレスの取引履歴をユーザーに表示する（ウォレット、ポートフォリオトラッカー、エクスプローラ）。
* 自分のデコーダーを作成することなく、事前解析済みの人が読みやすい履歴が必要。
* 取引タイプ、時間範囲、またはスロット範囲で履歴をフィルタリングする必要がある。
* ウォレットの完全なトークン履歴、関連するトークンアカウント（ATA）を含む必要がある—下記参照。

新しいビルドには、サーバーサイドフィルタリングとトークンアカウントのルックアップが備わったモダンなHeliusネイティブパスである[`getTransactionsForAddress`](/ja/rpc/gettransactionsforaddress)を使用してください。

## クイックスタート

<Steps>
  <Step title="APIキーを取得">
    [dashboard.helius.dev](https://dashboard.helius.dev)でサインアップしてAPIキーをコピーします。
  </Step>

  <Step title="アドレストランザクションエンドポイントを取得">
    任意のSolanaアドレスの取引履歴を取得します。

    <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="フィルタリングとページネーション">
    以下の\[`type`]、時間、スロットフィルタで結果を絞り、高ボリュームアドレスをシグネチャカーソルでページ送りします。
  </Step>
</Steps>

## ネットワークサポート

| ネットワーク | サポート | 保存期間 |
| ------ | ---- | ---- |
| メインネット | はい   | 無制限  |
| 開発ネット  | はい   | 2週間  |
| テストネット | いいえ  | 該当なし |

## リクエストパラメータ

| パラメータ              | 説明                                        | デフォルト       | 例                                |
| ------------------ | ----------------------------------------- | ----------- | -------------------------------- |
| `limit`            | 返す取引数 (1-100)                             | 10          | `&limit=25`                      |
| `before-signature` | このシグネチャより前の取引を取得（\[`sort-order=desc`]と使用） | -           | `&before-signature=sig123...`    |
| `after-signature`  | このシグネチャより後の取引を取得（\[`sort-order=asc`]と使用）  | -           | `&after-signature=sig456...`     |
| `type`             | 取引タイプでフィルタ                                | -           | `&type=NFT_SALE`                 |
| `sort-order`       | 結果のソート順序                                  | `desc`      | `&sort-order=asc`                |
| `token-accounts`   | 関連トークンアカウントの取引をフィルタ                       | `none`      | `&token-accounts=balanceChanged` |
| `commitment`       | コミットメントレベル                                | `finalized` | `&commitment=confirmed`          |

### 時間に基づくフィルタリング

| パラメータ      | 説明                       | 例                      |
| ---------- | ------------------------ | ---------------------- |
| `gt-time`  | このUnixタイムスタンプ後のトランザクション  | `&gt-time=1656442333`  |
| `gte-time` | このUnixタイムスタンプ以降のトランザクション | `&gte-time=1656442333` |
| `lt-time`  | このUnixタイムスタンプ前のトランザクション  | `&lt-time=1656442333`  |
| `lte-time` | このUnixタイムスタンプ以前のトランザクション | `&lte-time=1656442333` |

### スロットに基づくフィルタリング

| パラメータ      | 説明                | 例                     |
| ---------- | ----------------- | --------------------- |
| `gt-slot`  | このスロット後のトランザクション  | `&gt-slot=148277128`  |
| `gte-slot` | このスロット以降のトランザクション | `&gte-slot=148277128` |
| `lt-slot`  | このスロット前のトランザクション  | `&lt-slot=148277128`  |
| `lte-slot` | このスロット以前のトランザクション | `&lte-slot=148277128` |

フィルタリングの注意:

* 時間パラメーターはUnixタイムスタンプ（エポック以降の秒数）を使用し、スロットパラメーターはSolanaスロット番号を使用します。
* 同一リクエストで時間ベースとスロットベースのフィルタを組み合わせることはできません。
* 昇順には\[`sort-order=asc`]、降順には\[`sort-order=desc`]を使用します。
* おおよその期間を知っているときは時間またはスロットフィルタを使用し、\[`limit`]と組み合わせてページサイズを制御します。

## 関連トークンアカウント

Solanaでは、ウォレットはトークンを直接保持しません。代わりにウォレットはトークンアカウントを所有し、そのトークンアカウントがトークンを保持します。例えば、USDCが送られてくると、それはウォレットのメインアドレスではなくUSDCトークンアカウントに入ります。

このエンドポイントは、ウォレットの**完全なトークン履歴**をクエリできる点がユニークであり、関連するトークンアカウント（ATA）を含みます。ネイティブRPCメソッドのような\[`getSignaturesForAddress`]にはATAが含まれていません。

\[`token-accounts`]フィルタはこの動作を管理します。

* **\[`none`]**（デフォルト）—ウォレットアドレスを直接参照する取引のみを返します。ウォレットの直接インタラクションのみを気にする場合に使用します。
* **\[`balanceChanged`]**（推奨）—ウォレットアドレスを参照するかウォレットが所有するトークンアカウントの残高を変更する取引を返します。スパムや関連性のない操作（手数料の徴収や委任など）を除外し、意味のあるウォレット活動をクリーンに表示します。
* **\[`all`]**—ウォレットアドレスまたはウォレットが所有するトークンアカウントを参照するすべての取引を返します。

<Warning>
  \[`token-accounts`]フィルタはトークンバランスメタデータの\[`owner`]フィールドに依存しており、スロット111,491,819（\~2022年12月）以前には利用できませんでした。このスロット前にアクティブなトークンアカウントを含むトランザクションは、\[`balanceChanged`]と\[`all`]結果から欠落する可能性があります。[getTransactionsForAddressのチュートリアル](/ja/rpc/gettransactionsforaddress#limitations-and-edge-cases)に、完全なコード例を伴う回避策があります。
</Warning>

## フィルター

### トランザクションタイプでフィルター

NFT販売、トークン転送、スワップなど、特定の取引タイプのみを取得します。

<Tabs>
  <Tab title="NFT販売">
    ```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="トークン転送">
    ```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="スワップ">
    ```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>

サポートされている取引タイプの完全なリストについては、[Transaction History APIリファレンス](/ja/api-reference/enhanced-transactions/gettransactionsbyaddress)を参照してください。

### ランタイムタイプフィルタリング

<Note>
  タイプフィルタリングはランタイムで行われます：APIは順にトランザクションを検索し、少なくとも50件のマッチングアイテムを見つけるまで続けます。検索ウィンドウ内で一致が見つからない場合、検索を続けるためのシグネチャを伴うエラーを返します。これは期待される動作であり、失敗ではありません。
</Note>

現在の検索ウィンドウ内で一致するトランザクションが見つからない場合、APIは次のようなエラーレスポンスを返します。

```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."
}
```

続行するには、エラーメッセージからのシグネチャを使用し、次回のリクエストで適切なパラメータ（降順には\[`before-signature`]、昇順には\[`after-signature`]）を使用してください。

<Accordion title="タイプフィルターの継続ループ（完全な例）">
  ```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');
  ```

  キーとなるポイント：

  * タイプフィルタを使用すると、APIは一度に最大50件のトランザクションを検索します。
  * 一致が見つからなかった場合、次回の検索を続行するためにエラーメッセージからのシグネチャを使用します。
  * 降順で検索する場合は\[`before-signature`]を使用します（デフォルト、新しい順）。
  * 昇順で検索する場合は\[`after-signature`]を使用します（古い順）—年代順の検索には必須です。
  * 無限ループを防ぐために最大リトライ制限を実装します。
</Accordion>

## 例

以下のシナリオは、時間とスロットの範囲、ソート順序、ATA、および複合フィルターをカバーします。

<Accordion title="時間範囲でフィルタ">
  特定の時間ウィンドウ内のトランザクションを取得します。

  <Tabs>
    <Tab title="過去24時間">
      ```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="特定の日付範囲">
      ```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="スロット範囲でフィルタ">
  特定のスロット範囲内のトランザクションを取得します。

  ```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="ソート順序を変更">
  昇順（古い順）でトランザクションを取得します。

  ```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="関連トークンアカウントの転送を含む">
  関連トークンアドレス（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="複数のフィルタを組み合わせる">
  時間範囲とカスタムソート順序でタイプフィルタリングを組み合わせます。

  ```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>

## ページネーション

高ボリュームのアドレスでは、各バッチの最後のシグネチャをカーソルとして使用して結果をページングします。

```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;
};
```

時間範囲内でページネーションを行うには、各リクエストで時間フィルタを維持し、各ループで\[`before-signature`]カーソルを進めます。

```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;
};
```

## 次のステップ

<CardGroup cols={2}>
  <Card title="getTransactionsForAddress" icon="clock-rotate-left" href="/ja/rpc/gettransactionsforaddress">
    トランザクション履歴とバックフィルのモダンなHeliusネイティブ代替品。
  </Card>

  <Card title="Wallet API" icon="wallet" href="/ja/wallet-api/overview">
    RESTエンドポイントで人が読みやすいウォレットデータを提供：残高、履歴、転送。
  </Card>

  <Card title="Parse Transactions" icon="code" href="/ja/enhanced-transactions/parse-transactions">
    1つ以上の取引シグネチャを解析して人が読みやすいデータに変換します。
  </Card>

  <Card title="Getting Data overview" icon="database" href="/ja/getting-data">
    SolanaデータをクエリするためのHeliusオプションすべてを比較。
  </Card>
</CardGroup>
