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

# 批量操作

> 在一次批量请求中获取数百个 Solana 钱包或代币的 PnL 汇总与持仓——构建投资组合看板、筛选器与一键加载的多钱包概览页面。

当您已经知道想要哪些钱包或代币的数据时,请使用批量端点。它们专为面板、扫描器、数据流水线和批量历史加载而设计。

## 何时使用批量端点

批量端点专为需要**一次性获取多个实体**持仓数据的场景设计:

<CardGroup cols={3}>
  <Card title="投资组合追踪器">
    一次调用获取一个钱包跨 50+ 代币的持仓
  </Card>

  <Card title="代币面板">
    获取 200 个钱包在特定代币上的表现
  </Card>

  <Card title="排行榜丰富">
    查找排行榜结果中的特定 wallet+token 对
  </Card>
</CardGroup>

有两种批量端点:

* **持仓批量**返回代币级持仓行,并支持 `pnlMode`。
* **钱包摘要批量**返回钱包级摘要和钱包标签,最多 100 个钱包。它不接受 `pnlMode`。

***

## 一个钱包,多个代币

当您有一个钱包并希望一次性检查多个代币时,请使用[钱包批量持仓](/cn/data-api/pnl-v2/get-wallet-batch-positions)。

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST "https://data.solanatracker.io/v2/pnl/wallets/{wallet}/positions/batch" \
    -H "x-api-key: YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "tokens": [
        "38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump",
        "84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump",
        "CMx7yon2cLzHcXqgHsKJhuU3MmME6noWLQk2rAycBAGS"
      ]
    }'
  ```

  ```javascript JavaScript theme={null}
  const wallet = "CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o";
  const tokens = [
    "38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump",
    "84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump"
  ];

  const res = await fetch(
    `https://data.solanatracker.io/v2/pnl/wallets/${wallet}/positions/batch`,
    {
      method: "POST",
      headers: {
        "x-api-key": "YOUR_API_KEY",
        "Content-Type": "application/json"
      },
      body: JSON.stringify({ tokens })
    }
  );
  const { positions, notFound } = await res.json();

  positions.forEach(p => {
    console.log(`${p.meta.symbol}: $${p.pnl.total.toFixed(2)} PnL`);
  });
  if (notFound.length) {
    console.log(`Not traded: ${notFound.join(", ")}`);
  }
  ```

  ```python Python theme={null}
  import requests

  wallet = "CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o"
  tokens = [
      "38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump",
      "84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump"
  ]

  res = requests.post(
      f"https://data.solanatracker.io/v2/pnl/wallets/{wallet}/positions/batch",
      json={"tokens": tokens},
      headers={"x-api-key": "YOUR_API_KEY"}
  )
  data = res.json()

  for p in data["positions"]:
      print(f"{p['meta']['symbol']}: ${p['pnl']['total']:.2f}")
  ```
</CodeGroup>

**限制:** 每次请求 100 个代币。钱包从未交易过的代币出现在 `notFound` 数组中。缺失项列在那里;它们不是请求错误。

***

## 多个钱包摘要

当您只需要钱包级摘要和标签,而不是每个代币的持仓时,请使用 `POST /v2/pnl/wallets/batch`。请求最多接受 100 个唯一钱包地址。无效地址在 `invalid` 中返回,没有 PnL 摘要的钱包在 `notFound` 中返回,超过 100 个唯一有效钱包的请求会包含一个 `truncated` 对象。

```bash theme={null}
curl -X POST "https://data.solanatracker.io/v2/pnl/wallets/batch" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "wallets": [
      "CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o",
      "vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36NKPTg"
    ]
  }'
```

每个返回的钱包都镜像钱包摘要的形状:`wallet`、`identity`、`summary`、`tags` 和 `updatedAt`。

***

## 一个代币,多个钱包

使用[代币批量持仓](/cn/data-api/pnl-v2/get-token-batch-positions)比较多个钱包在同一代币上的表现。

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST "https://data.solanatracker.io/v2/pnl/tokens/{token}/positions/batch" \
    -H "x-api-key: YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "wallets": [
        "CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o",
        "vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36NKPTg"
      ]
    }'
  ```

  ```javascript JavaScript theme={null}
  const token = "38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump";
  const wallets = [
    "CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o",
    "vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36NKPTg"
  ];

  const res = await fetch(
    `https://data.solanatracker.io/v2/pnl/tokens/${token}/positions/batch`,
    {
      method: "POST",
      headers: {
        "x-api-key": "YOUR_API_KEY",
        "Content-Type": "application/json"
      },
      body: JSON.stringify({ wallets })
    }
  );
  const { positions, notFound } = await res.json();

  positions.forEach(p => {
    console.log(`${p.wallet}: $${p.pnl.token.total.toFixed(2)} on this token, ${p.counts.total} trades`);
  });
  ```
</CodeGroup>

**限制:** 每次请求 200 个钱包。

***

## 任意 wallet-token 对

当每对都不同时,[持仓批量查找](/cn/data-api/pnl-v2/get-position-batch-lookup)处理任意组合。

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST "https://data.solanatracker.io/v2/pnl/positions/batch" \
    -H "x-api-key: YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "pairs": [
        {
          "wallet": "CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o",
          "token": "38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump"
        },
        {
          "wallet": "CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o",
          "token": "84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump"
        }
      ]
    }'
  ```

  ```javascript JavaScript theme={null}
  const pairs = [
    { wallet: "CyaE1...", token: "38Pgz..." },
    { wallet: "CyaE1...", token: "84cAE..." },
    { wallet: "vines...", token: "38Pgz..." }
  ];

  const res = await fetch("https://data.solanatracker.io/v2/pnl/positions/batch", {
    method: "POST",
    headers: {
      "x-api-key": "YOUR_API_KEY",
      "Content-Type": "application/json"
    },
    body: JSON.stringify({ pairs })
  });
  const { positions, notFound } = await res.json();

  console.log(`Found ${positions.length} positions, ${notFound.length} not found`);
  ```
</CodeGroup>

**限制:** 每次请求 200 对。

***

## 使用哪个端点

| 您想要...             | 端点                                                     | 限制      |
| ------------------ | ------------------------------------------------------ | ------- |
| 一个钱包在 50 个代币上的 PnL | [钱包批量](/cn/data-api/pnl-v2/get-wallet-batch-positions) | 100 个代币 |
| 100 个钱包在一个代币上的 PnL | [代币批量](/cn/data-api/pnl-v2/get-token-batch-positions)  | 200 个钱包 |
| 特定 wallet+token 组合 | [对批量](/cn/data-api/pnl-v2/get-position-batch-lookup)   | 200 对   |
| 钱包摘要和标签            | `POST /v2/pnl/wallets/batch`                           | 100 个钱包 |

<Warning>
  未匹配的输入会在 `notFound` 数组中返回,而不会导致错误。请始终检查它。
</Warning>

## PnL 模式

所有三个**持仓**批量端点都接受 `?pnlMode=strict|adjusted|raw` 作为查询参数。默认为 `strict`。钱包摘要批量端点不接受 `pnlMode`。每个模式的作用请参阅[要点](/cn/guides/pnl-v2/overview#essentials)。

```bash theme={null}
curl -X POST "https://data.solanatracker.io/v2/pnl/positions/batch?pnlMode=adjusted" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "pairs": [ ... ] }'
```

<CardGroup cols={2}>
  <Card title="排行榜" href="/cn/guides/pnl-v2/leaderboards">
    构建钱包候选列表以批量丰富。
  </Card>

  <Card title="钱包分析" href="/cn/guides/pnl-v2/wallet-analysis">
    从批量结果中深入分析单一钱包。
  </Card>
</CardGroup>
