> ## 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ウォレットのトランザクション履歴を取得する方法

> 各トランザクションの残高変化を含む、任意のSolanaウォレットの完全なトランザクション履歴を取得します。ポートフォリオトラッカー、会計ツール、分析プラットフォームに最適です。

<Note>
  ウォレットAPIはベータ版です。エンドポイントとレスポンス形式が変更される可能性があります。
</Note>

## 概要

トランザクション履歴エンドポイントは、Enhanced Transactions APIを使用してSolanaウォレットの完全なトランザクション履歴を取得します。各トランザクションの残高変化を含む、人間が読める形式の解析済みトランザクションが、新しいものから古いものへと逆年代順で返されます。

このエンドポイントは、リクエストごとに最大100件のトランザクションを返すため、ページネーションは手動で行います。次のページを取得するには`before`パラメータを`pagination.nextCursor`と共に使用し、より多くの結果が利用可能な場合は`pagination.hasMore`を確認してください。各リクエストは単一のAPIコールで、100クレジットが消費されます。

`tokenAccounts`パラメータは、ウォレットが所有するトークンアカウントを含むトランザクションを含むかどうかを制御します：

* `balanceChanged`（推奨）：トークンアカウントの残高を変えたトランザクションを含め、スパムをフィルタリングします。
* `none`：直接的なウォレットのやり取りのみ。
* `all`：スパムを含むすべてのトークンアカウントのトランザクション。

<Warning>
  `tokenAccounts`フィルタはトークン残高メタデータの`owner`フィールドに依存しており、このフィールドはスロット111,491,819（2022年12月頃）以前には利用できませんでした。このスロット以前にアクティブなトークンアカウントに関与するトランザクションが欠けている可能性があります。解決策については、[getTransactionsForAddressチュートリアル](/ja/rpc/gettransactionsforaddress#limitations-and-edge-cases)をご覧ください。
</Warning>

## 使用タイミング

トランザクション履歴APIが必要な場合の使用法：

* **トランザクションフィードの表示**：ユーザーに完全なトランザクション履歴を表示します。
* **PnLの計算**：すべてのトランザクションの利益と損失を追跡します。
* **税および会計**：税務申告のための完全なトランザクションレポートを生成します。
* **ポートフォリオ分析**：取引パターンと活動を分析します。
* **監査トレイル**：ウォレットアクティビティの完全な記録を維持します。
* **残高再構築**：過去のデータから現在の残高を再構築します。

## クイックスタート

### 基本的な履歴クエリ

残高変化のある最新トランザクションを取得する：

<Tabs>
  <Tab title="JavaScript">
    ```javascript theme={"system"}
    const getTransactionHistory = async (address) => {
      const url = `https://api.helius.xyz/v1/wallet/${address}/history?api-key=YOUR_API_KEY`;

      const response = await fetch(url);
      if (!response.ok) {
        throw new Error(`HTTP error! status: ${response.status}`);
      }

      const data = await response.json();

      console.log(`Found ${data.data.length} transactions`);

      // Display recent transactions
      data.data.forEach(tx => {
        const date = new Date(tx.timestamp * 1000).toLocaleString();
        const status = tx.error ? 'Failed' : 'Success';

        console.log(`\n${status} - ${date}`);
        console.log(`Signature: ${tx.signature.slice(0, 20)}...`);
        console.log(`Fee: ${tx.fee} SOL`);

        // Show balance changes
        tx.balanceChanges.forEach(change => {
          const sign = change.amount > 0 ? '+' : '';
          console.log(`  ${sign}${change.amount} ${change.mint === 'SOL' ? 'SOL' : change.mint.slice(0, 8)}...`);
        });
      });

      return data;
    };

    getTransactionHistory("86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY");
    ```
  </Tab>

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

    def get_transaction_history(address: str):
        url = f"https://api.helius.xyz/v1/wallet/{address}/history"
        headers = {"X-Api-Key": "YOUR_API_KEY"}

        response = requests.get(url, headers=headers)
        response.raise_for_status()

        data = response.json()

        print(f"Found {len(data['data'])} transactions")

        # Display recent transactions
        for tx in data['data']:
            date = datetime.fromtimestamp(tx['timestamp']).strftime('%Y-%m-%d %H:%M:%S')
            status = 'Failed' if tx.get('error') else 'Success'

            print(f"\n{status} - {date}")
            print(f"Signature: {tx['signature'][:20]}...")
            print(f"Fee: {tx['fee']} SOL")

            # Show balance changes
            for change in tx['balanceChanges']:
                sign = '+' if change['amount'] > 0 else ''
                mint_display = 'SOL' if change['mint'] == 'SOL' else change['mint'][:8] + '...'
                print(f"  {sign}{change['amount']} {mint_display}")

        return data

    get_transaction_history("86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY")
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={"system"}
    curl "https://api.helius.xyz/v1/wallet/86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY/history?api-key=YOUR_API_KEY"
    ```
  </Tab>
</Tabs>

### 全履歴のページネーション

ページネーションを使用してすべてのトランザクションを取得するには、`before`パラメータを使用：

<Tabs>
  <Tab title="JavaScript">
    ```javascript theme={"system"}
    const getAllTransactionHistory = async (address) => {
      let allTransactions = [];
      let before = null;

      do {
        const url = before
          ? `https://api.helius.xyz/v1/wallet/${address}/history?api-key=YOUR_API_KEY&before=${before}`
          : `https://api.helius.xyz/v1/wallet/${address}/history?api-key=YOUR_API_KEY`;

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

        allTransactions = allTransactions.concat(data.data);
        before = data.pagination.hasMore ? data.pagination.nextCursor : null;

        console.log(`Fetched ${allTransactions.length} transactions so far...`);

      } while (before);

      console.log(`\nTotal transactions: ${allTransactions.length}`);
      return allTransactions;
    };

    getAllTransactionHistory("86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY");
    ```
  </Tab>

  <Tab title="Python">
    ```python theme={"system"}
    def get_all_transaction_history(address: str):
        all_transactions = []
        before = None

        while True:
            url = f"https://api.helius.xyz/v1/wallet/{address}/history"
            params = {"api-key": "YOUR_API_KEY"}

            if before:
                params["before"] = before

            response = requests.get(url, params=params, headers={"X-Api-Key": "YOUR_API_KEY"})
            response.raise_for_status()

            data = response.json()
            all_transactions.extend(data['data'])

            print(f"Fetched {len(all_transactions)} transactions so far...")

            if not data['pagination']['hasMore']:
                break

            before = data['pagination']['nextCursor']

        print(f"\nTotal transactions: {len(all_transactions)}")
        return all_transactions

    get_all_transaction_history("86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY")
    ```
  </Tab>
</Tabs>

## クエリパラメータ

| パラメータ           | タイプ | デフォルト          | 説明                                                               |
| --------------- | --- | -------------- | ---------------------------------------------------------------- |
| `limit`         | 整数  | 100            | リクエストごとの最大トランザクション数（1-100）                                       |
| `before`        | 文字列 | -              | この署名前のトランザクションを取得（前のレスポンスから`pagination.nextCursor`を使用）           |
| `after`         | 文字列 | -              | この署名後のトランザクションを取得（昇順ページネーション用）                                   |
| `type`          | 文字列 | -              | トランザクションタイプでフィルタリング（例：SWAP, TRANSFER, NFT\_SALE, TOKEN\_MINT）    |
| `tokenAccounts` | 文字列 | balanceChanged | トークンアカウントを含むトランザクションをフィルタリング：`none`, `balanceChanged`（推奨）, `all` |

### 利用可能なトランザクションタイプ

`type`パラメータは以下のトランザクションタイプによるフィルタリングをサポートしています：

`SWAP`, `TRANSFER`, `NFT_SALE`, `NFT_BID`, `NFT_LISTING`, `NFT_MINT`, `NFT_CANCEL_LISTING`, `TOKEN_MINT`, `BURN`, `COMPRESSED_NFT_MINT`, `COMPRESSED_NFT_TRANSFER`, `COMPRESSED_NFT_BURN`, `CREATE_STORE`, `WHITELIST_CREATOR`, `ADD_TO_WHITELIST`, `REMOVE_FROM_WHITELIST`, `AUCTION_MANAGER_CLAIM_BID`, `EMPTY_PAYMENT_ACCOUNT`, `UPDATE_PRIMARY_SALE_METADATA`, `ADD_TOKEN_TO_VAULT`, `ACTIVATE_VAULT`, `INIT_VAULT`, `INIT_BANK`, `INIT_STAKE`, `MERGE_STAKE`, `SPLIT_STAKE`, `CREATE_AUCTION_MANAGER`, `START_AUCTION`, `CREATE_AUCTION_MANAGER_V2`, `UPDATE_EXTERNAL_PRICE_ACCOUNT`, `EXECUTE_TRANSACTION`

### フィルタ例

<Tabs>
  <Tab title="タイプでフィルタリング">
    ```javascript theme={"system"}
    // Get only SWAP transactions
    const url = `https://api.helius.xyz/v1/wallet/${address}/history?api-key=YOUR_API_KEY&type=SWAP`;
    ```
  </Tab>

  <Tab title="トークンアカウントフィルタ">
    ```javascript theme={"system"}
    // Exclude spam by only including transactions that changed token balances
    const url = `https://api.helius.xyz/v1/wallet/${address}/history?api-key=YOUR_API_KEY&tokenAccounts=balanceChanged`;

    // Only show direct wallet interactions
    const url = `https://api.helius.xyz/v1/wallet/${address}/history?api-key=YOUR_API_KEY&tokenAccounts=none`;
    ```
  </Tab>

  <Tab title="フィルタを組み合わせる">
    ```javascript theme={"system"}
    // Get only NFT sales that changed balances
    const url = `https://api.helius.xyz/v1/wallet/${address}/history?api-key=YOUR_API_KEY&type=NFT_SALE&tokenAccounts=balanceChanged`;
    ```
  </Tab>
</Tabs>

## レスポンス形式

```json theme={"system"}
{
  "data": [
    {
      "signature": "5wHu1qwD7Jsj3xqWjdSEJmYr3Q5f5RjXqjqQJ7jqEj7jqEj7jqEj7jqEj7jqEj7jqE",
      "timestamp": 1704067200,
      "slot": 250000000,
      "fee": 0.000005,
      "feePayer": "86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY",
      "error": null,
      "balanceChanges": [
        {
          "mint": "So11111111111111111111111111111111111111111",
          "amount": -0.05,
          "decimals": 9
        },
        {
          "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
          "amount": 50.0,
          "decimals": 6
        }
      ]
    }
  ],
  "pagination": {
    "hasMore": true,
    "nextCursor": "5wHu1qwD7Jsj3xqWjdSEJmYr3Q5f5RjXqjqQJ7jqEj7jqEj7jqEj7jqEj7jqEj7jqE"
  }
}
```

### フィールドノート

* **`timestamp`**: Unix秒。完全に処理されていない非常に最近のトランザクションの場合、`null`かもしれません。
* **`error`**: 成功したトランザクションの場合は`null`。失敗した場合はエラー値。失敗したトランザクションでも手数料が発生します。
* **`balanceChanges`**: トランザクションでウォレットの保有がどのように変化したか — 正の`amount`は受け取ったトークンを示し、負の`amount`は送信または消費したトークンを示します。
* **`mint`** (`balanceChanges`内): トークンミントアドレス、またはネイティブSOLのための`"SOL"`。
* **`amount`** (`balanceChanges`内): **人間が読める形式**、すでに`decimals`で除算済みです — `-0.05`は－0.05 SOLを意味し、－0.05ラマポーツではありません。このエンドポイントには生の`amountRaw`フィールドは含まれていません。

#### 残高変化の例

```javascript theme={"system"}
// Swap: Sold 0.05 SOL, received 5 USDC
{
  "balanceChanges": [
    { "mint": "SOL", "amount": -0.05, "decimals": 9 },
    { "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", "amount": 5.0, "decimals": 6 }
  ]
}

// Simple transfer: Sent 10 USDC
{
  "balanceChanges": [
    { "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", "amount": -10.0, "decimals": 6 }
  ]
}
```

## ユースケース

### 総取引量の計算

すべての転送を合計して取引量を得る：

```javascript theme={"system"}
const calculateTradingVolume = async (address, tokenMint) => {
  const transactions = await getAllTransactionHistory(address);

  let totalVolume = 0;

  transactions.forEach(tx => {
    tx.balanceChanges.forEach(change => {
      if (change.mint === tokenMint) {
        totalVolume += Math.abs(change.amount);
      }
    });
  });

  console.log(`Total ${tokenMint} volume: ${totalVolume}`);
  return totalVolume;
};

// Example: Calculate total USDC volume
calculateTradingVolume(
  "86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY",
  "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" // USDC
);
```

### 税務報告書の作成

税務申告用のトランザクションレポートを作成する：

```javascript theme={"system"}
const generateTaxReport = async (address, year) => {
  const transactions = await getAllTransactionHistory(address);

  const startDate = new Date(`${year}-01-01`).getTime() / 1000;
  // Set to end of December 31st (23:59:59.999) to include all transactions from that day
  const endDate = new Date(`${year}-12-31T23:59:59.999Z`).getTime() / 1000;

  const taxableTransactions = transactions
    .filter(tx => tx.timestamp >= startDate && tx.timestamp <= endDate)
    .map(tx => ({
      date: new Date(tx.timestamp * 1000).toISOString(),
      signature: tx.signature,
      fee: tx.fee,
      balanceChanges: tx.balanceChanges,
      explorerUrl: `https://orbmarkets.io/tx/${tx.signature}`
    }));

  console.log(`Found ${taxableTransactions.length} transactions in ${year}`);

  // Export as JSON
  const report = {
    address,
    year,
    transactionCount: taxableTransactions.length,
    transactions: taxableTransactions
  };

  console.log(JSON.stringify(report, null, 2));
  return report;
};

generateTaxReport("86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY", 2024);
```

### 失敗したトランザクションの追跡

エラーを理解するためにすべての失敗したトランザクションを見つける：

```javascript theme={"system"}
const getFailedTransactions = async (address) => {
  const data = await getTransactionHistory(address);

  const failed = data.data.filter(tx => tx.error !== null);

  console.log(`Found ${failed.length} failed transactions`);

  failed.forEach(tx => {
    const date = new Date(tx.timestamp * 1000).toLocaleString();
    console.log(`\n${date}`);
    console.log(`Signature: ${tx.signature}`);
    console.log(`Error: ${tx.error}`);
    console.log(`Fee Paid: ${tx.fee} SOL`);
  });

  return failed;
};
```

### 過去の残高を再構築する

特定の時点での残高を計算する：

```javascript theme={"system"}
const getHistoricalBalance = async (address, targetTimestamp) => {
  const transactions = await getAllTransactionHistory(address);

  // Filter to transactions before target date
  const relevantTxs = transactions.filter(tx => tx.timestamp <= targetTimestamp);

  // Sum all balance changes
  const balances = {};

  relevantTxs.forEach(tx => {
    tx.balanceChanges.forEach(change => {
      if (!balances[change.mint]) {
        balances[change.mint] = 0;
      }
      balances[change.mint] += change.amount;
    });
  });

  console.log(`Historical balances as of ${new Date(targetTimestamp * 1000).toLocaleString()}:`);
  Object.entries(balances).forEach(([mint, balance]) => {
    console.log(`${mint}: ${balance}`);
  });

  return balances;
};

// Example: Get balances on Jan 1, 2024
getHistoricalBalance(
  "86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY",
  new Date("2024-01-01").getTime() / 1000
);
```

単一トークンの特定時点の正確な残高については、[Historical Balance](/ja/wallet-api/balance-at)エンドポイントを使用してオンチェーンのポストバランスから直接読み取ります。

### トランザクション手数料の分析

支払った手数料を合計する：

```javascript theme={"system"}
const analyzeFees = async (address) => {
  const transactions = await getAllTransactionHistory(address);

  const totalFees = transactions.reduce((sum, tx) => sum + tx.fee, 0);
  const avgFee = totalFees / transactions.length;

  const successfulTxs = transactions.filter(tx => !tx.error);
  const failedTxs = transactions.filter(tx => tx.error);

  const wastedFees = failedTxs.reduce((sum, tx) => sum + tx.fee, 0);

  console.log(`Total Transactions: ${transactions.length}`);
  console.log(`Successful: ${successfulTxs.length}`);
  console.log(`Failed: ${failedTxs.length}`);
  console.log(`Total Fees Paid: ${totalFees.toFixed(6)} SOL`);
  console.log(`Average Fee: ${avgFee.toFixed(6)} SOL`);
  console.log(`Wasted on Failed Txs: ${wastedFees.toFixed(6)} SOL`);

  return {
    totalFees,
    avgFee,
    wastedFees,
    successRate: (successfulTxs.length / transactions.length) * 100
  };
};
```

## ベストプラクティス

* **全履歴のページネーションを使用する。** 一部のウォレットには何百万ものトランザクションが存在します。すべてを取得する際は必ずページネーションを使用してください。
* **履歴データをキャッシュする。** 履歴トランザクションは変更されません。ローカルにキャッシュし、新しいトランザクションのみを取得します。
* **失敗したトランザクションを処理する。** 成功したものと失敗したものを区別するため、`error`フィールドをチェックしてください。失敗したトランザクションでも手数料が発生します。
* **日時フィルタリングにはタイムスタンプを使用する。** タイムスタンプはUnix秒で表されています。表示やフィルタリングのためにローカル日付に変換してください。

## 一般的なエラー

| エラーコード | 説明             | 解決策                                     |
| ------ | -------------- | --------------------------------------- |
| 400    | 無効なウォレットアドレス形式 | アドレスが有効なbase58 Solanaアドレスであることを確認してください |
| 401    | APIキーが欠落または無効  | APIキーがリクエストに含まれていることを確認してください           |
| 429    | レート制限を超過しました   | リクエスト頻度を減らすか、プランをアップグレードしてください          |

## 次のステップ

<CardGroup cols={3}>
  <Card title="トークン転送" icon="arrow-right-arrow-left" href="/ja/wallet-api/transfers">
    送信者/受信者情報を伴う転送のみのビュー — フル履歴よりもシンプルです。
  </Card>

  <Card title="ウォレットAPIの概要" icon="wallet" href="/ja/wallet-api/overview">
    すべてのウォレットAPIエンドポイントと共通の規約。
  </Card>

  <Card title="APIリファレンス" icon="code" href="/ja/api-reference/wallet-api/history">
    トランザクション履歴のリクエストとレスポンススキーマ。
  </Card>
</CardGroup>
