> ## 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 — устаревший продукт в режиме технического обслуживания. Он по-прежнему работает, и эти страницы остаются доступными, но новые типы парсеров и функции больше не добавляются. Его преемник — [Parsed Events](/docs/ru/parsed-events), который декодирует инструкции с помощью каталога IDL и доступен на всех тарифах по цене 10 кредитов за запрос. В [руководстве по миграции](/docs/ru/parsed-events/guides/migrate-from-enhanced-transactions) переход описан пошагово. Для истории транзакций и восстановления пропущенных данных также можно использовать [`getTransactionsForAddress`](/docs/ru/rpc/gettransactionsforaddress), а для удобочитаемых данных кошелька — [Wallet API](/docs/ru/wallet-api/overview).
</Warning>

## Обзор

Эндпоинт Transaction History возвращает удобочитаемую историю транзакций для любого адреса Solana. Вместо необработанных данных инструкций и списков учетных записей вы получаете структурированную информацию о следующем:

* Что произошло в транзакции: переводы, свопы, операции с NFT.
* Какие учетные записи участвовали.
* Сколько SOL или токенов было переведено.
* Связанные метаданные: адреса выпуска токенов, названия и символы токенов и многое другое.

Отправьте запрос `GET` на `/v0/addresses/{address}/transactions`. Этот эндпоинт использует метод RPC [`getTransactionsForAddress`](/docs/ru/rpc/gettransactionsforaddress).

## Когда это использовать

* Вы показываете пользователям историю транзакций адреса в кошельках, трекерах портфелей или обозревателях.
* Вам нужна заранее разобранная и удобочитаемая история без написания собственного декодера.
* Вам нужно фильтровать историю по типу транзакции, диапазону времени или диапазону слотов.
* Вам нужна полная история токенов кошелька, включая связанные учетные записи токенов (ATA), — см. ниже.

Для новых проектов [`getTransactionsForAddress`](/docs/ru/rpc/gettransactionsforaddress) — современный нативный для Helius способ с серверной фильтрацией и поиском учетных записей токенов.

## Быстрый старт

<Steps>
  <Step title="Get your API key">
    Зарегистрируйтесь на [dashboard.helius.dev](https://dashboard.helius.dev) и скопируйте свой ключ API.
  </Step>

  <Step title="GET the address transactions endpoint">
    Получите историю транзакций для любого адреса 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="Filter and paginate">
    Сузьте результаты с помощью фильтра `type`, фильтров времени и слотов, описанных ниже, а затем постранично обработайте адреса с большим объемом данных с помощью курсоров подписей.
  </Step>
</Steps>

## Поддержка сетей

| Сеть | Поддерживается | Период хранения |
| - | - | - |
| Mainnet | Да | Без ограничений |
| Devnet | Да | 2 недели |
| Testnet | Нет | Н/Д |

## Параметры запроса

| Параметр | Описание | Значение по умолчанию | Пример |
| - | - | - | - |
| `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 года). Транзакции с учетными записями токенов, активными до этого слота, могут отсутствовать в результатах `balanceChanged` и `all`. Обходное решение с полным примером кода приведено в [руководстве по getTransactionsForAddress](/docs/ru/rpc/gettransactionsforaddress#ограничения-и-особые-случаи).
</Warning>

## Фильтры

### Фильтрация по типу транзакции

Получайте только транзакции определенных типов, например продажи NFT, переводы токенов или свопы:

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

Полный список поддерживаемых типов транзакций приведен в [справочнике Transaction History API](/docs/ru/api-reference/enhanced-transactions/gettransactionsbyaddress).

### Фильтрация по типу во время выполнения

<Note>
  Фильтрация по типу выполняется во время обработки: API последовательно ищет транзакции, пока не найдет не менее 50 совпадающих элементов. Если в пределах окна поиска совпадения не найдены, API возвращает ошибку с подписью, начиная с которой можно продолжить поиск. Это ожидаемое поведение, а не сбой.
</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="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');
  ```

  Основные моменты:

  * При использовании фильтров по типу API проверяет до 50 транзакций за один раз.
  * Если совпадения не найдены, используйте подпись из сообщения об ошибке, чтобы продолжить поиск.
  * При поиске в порядке убывания используйте `before-signature` (по умолчанию сначала возвращаются самые новые транзакции).
  * При поиске в порядке возрастания используйте `after-signature` (сначала возвращаются самые старые транзакции). Это обязательно для хронологического поиска.
  * Установите максимальное количество повторных попыток, чтобы предотвратить бесконечные циклы.
</Accordion>

## Примеры

Следующие сценарии охватывают диапазоны времени и слотов, порядок сортировки, ATA и комбинированные фильтры.

<Accordion title="Filter by time range">
  Получите транзакции за определенный период времени:

  <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">
  Получите транзакции в определенном диапазоне слотов:

  ```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">
  Получите транзакции в порядке возрастания, начиная с самых старых:

  ```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">
  Запросите полную историю кошелька, включая связанные адреса токенов (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">
  Сочетайте фильтрацию по типу с диапазоном времени и пользовательским порядком сортировки:

  ```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="/docs/ru/rpc/gettransactionsforaddress">
    Современная нативная для Helius замена для получения истории транзакций и восстановления пропущенных данных.
  </Card>

  <Card title="Wallet API" icon="wallet" href="/docs/ru/wallet-api/overview">
    Эндпоинты REST для удобочитаемых данных кошелька: балансов, истории и переводов.
  </Card>

  <Card title="Parse Transactions" icon="code" href="/docs/ru/enhanced-transactions/parse-transactions">
    Преобразуйте одну или несколько подписей транзакций в удобочитаемые данные.
  </Card>

  <Card title="Getting Data overview" icon="database" href="/docs/ru/getting-data">
    Сравните все варианты Helius для запросов данных Solana.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.