> ## Documentation Index
> Fetch the complete documentation index at: https://companyname-a7d5b98e-v2-pagination.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# How to paginate TON Center v2 results

export const Aside = ({type = "note", title = "", icon = "", iconType = "regular", children}) => {
  const asideVariants = ["note", "tip", "caution", "danger"];
  const asideComponents = {
    note: {
      outerStyle: "border-sky-500/20 bg-sky-50/50 dark:border-sky-500/30 dark:bg-sky-500/10",
      innerStyle: "text-sky-900 dark:text-sky-200",
      calloutType: "note",
      icon: <svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor" xmlns="http://www.w3.org/2000/svg" className="w-4 h-4 text-sky-500" aria-label="Note">
          <path fill-rule="evenodd" clip-rule="evenodd" d="M7 1.3C10.14 1.3 12.7 3.86 12.7 7C12.7 10.14 10.14 12.7 7 12.7C5.48908 12.6974 4.0408 12.096 2.97241 11.0276C1.90403 9.9592 1.30264 8.51092 1.3 7C1.3 3.86 3.86 1.3 7 1.3ZM7 0C3.14 0 0 3.14 0 7C0 10.86 3.14 14 7 14C10.86 14 14 10.86 14 7C14 3.14 10.86 0 7 0ZM8 3H6V8H8V3ZM8 9H6V11H8V9Z"></path>
        </svg>
    },
    tip: {
      outerStyle: "border-emerald-500/20 bg-emerald-50/50 dark:border-emerald-500/30 dark:bg-emerald-500/10",
      innerStyle: "text-emerald-900 dark:text-emerald-200",
      calloutType: "tip",
      icon: <svg width="11" height="14" viewBox="0 0 11 14" fill="currentColor" xmlns="http://www.w3.org/2000/svg" className="text-emerald-600 dark:text-emerald-400/80 w-3.5 h-auto" aria-label="Tip">
          <path d="M3.12794 12.4232C3.12794 12.5954 3.1776 12.7634 3.27244 12.907L3.74114 13.6095C3.88471 13.8248 4.21067 14 4.46964 14H6.15606C6.41415 14 6.74017 13.825 6.88373 13.6095L7.3508 12.9073C7.43114 12.7859 7.49705 12.569 7.49705 12.4232L7.50055 11.3513H3.12521L3.12794 12.4232ZM5.31288 0C2.52414 0.00875889 0.5 2.26889 0.5 4.78826C0.5 6.00188 0.949566 7.10829 1.69119 7.95492C2.14321 8.47011 2.84901 9.54727 3.11919 10.4557C3.12005 10.4625 3.12175 10.4698 3.12261 10.4771H7.50342C7.50427 10.4698 7.50598 10.463 7.50684 10.4557C7.77688 9.54727 8.48281 8.47011 8.93484 7.95492C9.67728 7.13181 10.1258 6.02703 10.1258 4.78826C10.1258 2.15486 7.9709 0.000106649 5.31288 0ZM7.94902 7.11267C7.52078 7.60079 6.99082 8.37878 6.6077 9.18794H4.02051C3.63739 8.37878 3.10743 7.60079 2.67947 7.11294C2.11997 6.47551 1.8126 5.63599 1.8126 4.78826C1.8126 3.09829 3.12794 1.31944 5.28827 1.3126C7.2435 1.3126 8.81315 2.88226 8.81315 4.78826C8.81315 5.63599 8.50688 6.47551 7.94902 7.11267ZM4.87534 2.18767C3.66939 2.18767 2.68767 3.16939 2.68767 4.37534C2.68767 4.61719 2.88336 4.81288 3.12521 4.81288C3.36705 4.81288 3.56274 4.61599 3.56274 4.37534C3.56274 3.6515 4.1515 3.06274 4.87534 3.06274C5.11719 3.06274 5.31288 2.86727 5.31288 2.62548C5.31288 2.38369 5.11599 2.18767 4.87534 2.18767Z"></path>
        </svg>
    },
    caution: {
      outerStyle: "border-amber-500/20 bg-amber-50/50 dark:border-amber-500/30 dark:bg-amber-500/10",
      innerStyle: "text-amber-900 dark:text-amber-200",
      calloutType: "warning",
      icon: <svg className="flex-none w-5 h-5 text-amber-400 dark:text-amber-300/80" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" aria-label="Warning">
          <path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"></path>
        </svg>
    },
    danger: {
      outerStyle: "border-red-500/20 bg-red-50/50 dark:border-red-500/30 dark:bg-red-500/10",
      innerStyle: "text-red-900 dark:text-red-200",
      calloutType: "danger",
      icon: <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor" className="text-red-600 dark:text-red-400/80 w-4 h-4" aria-label="Danger">
          <path d="M17.1 292c-12.9-22.3-12.9-49.7 0-72L105.4 67.1c12.9-22.3 36.6-36 62.4-36l176.6 0c25.7 0 49.5 13.7 62.4 36L494.9 220c12.9 22.3 12.9 49.7 0 72L406.6 444.9c-12.9 22.3-36.6 36-62.4 36l-176.6 0c-25.7 0-49.5-13.7-62.4-36L17.1 292zm41.6-48c-4.3 7.4-4.3 16.6 0 24l88.3 152.9c4.3 7.4 12.2 12 20.8 12l176.6 0c8.6 0 16.5-4.6 20.8-12L453.4 268c4.3-7.4 4.3-16.6 0-24L365.1 91.1c-4.3-7.4-12.2-12-20.8-12l-176.6 0c-8.6 0-16.5 4.6-20.8 12L58.6 244zM256 128c13.3 0 24 10.7 24 24l0 112c0 13.3-10.7 24-24 24s-24-10.7-24-24l0-112c0-13.3 10.7-24 24-24zM224 352a32 32 0 1 1 64 0 32 32 0 1 1 -64 0z"></path>
        </svg>
    }
  };
  let variant = type;
  let gotInvalidVariant = false;
  if (!asideVariants.includes(type)) {
    gotInvalidVariant = true;
    variant = "danger";
  }
  const iconVariants = ["regular", "solid", "light", "thin", "sharp-solid", "duotone", "brands"];
  if (!iconVariants.includes(iconType)) {
    iconType = "regular";
  }
  return <>
      <div className={`callout my-4 px-5 py-4 overflow-hidden rounded-2xl flex gap-3 border ${asideComponents[variant].outerStyle}`} data-callout-type={asideComponents[variant].calloutType}>
        <div className="mt-0.5 w-4" data-component-part="callout-icon">
          {}
          {icon === "" ? asideComponents[variant].icon : <Icon icon={icon} iconType={iconType} size={14} />}
        </div>
        <div className={`text-sm prose min-w-0 w-full ${asideComponents[variant].innerStyle}`} data-component-part="callout-content">
          {gotInvalidVariant ? <p>
              <span className="font-bold">
                Invalid <code>type</code> passed!
              </span>
              <br />
              <span className="font-bold">Received: </span>
              {type}
              <br />
              <span className="font-bold">Expected one of: </span>
              {asideVariants.join(", ")}
            </p> : <>
              {title && <p className="font-bold">{title}</p>}
              {children}
            </>}
        </div>
      </div>
    </>;
};

The v2 API uses cursor-based pagination to retrieve large result sets in batches. Instead of specifying a page number, the identifier of the last record received is passed to the API, which returns the next batch starting from that point. Because the cursor points at an existing record instead of a page number, new data inserted at the head of the list does not shift already-seen pages.

Three endpoints support pagination:

| Endpoint                                                                                                 | Cursor parameters         | End of results signal                       |
| -------------------------------------------------------------------------------------------------------- | ------------------------- | ------------------------------------------- |
| [`getTransactions`](/ecosystem/api/toncenter/v2/accounts/list-account-transactions)                      | `lt` + `hash`             | Response returns fewer results than `limit` |
| [`getBlockTransactions`](/ecosystem/api/toncenter/v2/blocks/list-block-transactions)                     | `after_lt` + `after_hash` | `incomplete` field is `false`               |
| [`getBlockTransactionsExt`](/ecosystem/api/toncenter/v2/blocks/list-block-transactions-extended-details) | `after_lt` + `after_hash` | `incomplete` field is `false`               |

All other v2 endpoints return single objects or fixed results and do not support pagination.

<Aside type="caution" title="URL encoding">
  Transaction hashes are base64-encoded and may contain `+`, `/`, and `=` characters. These must be URL-encoded when passed as query parameters: `+` → `%2B`, `/` → `%2F`, `=` → `%3D`. Most HTTP libraries handle this automatically. When constructing URLs manually, encode `+`, `/`, and `=` explicitly or the cursor will not match the server-side value.
</Aside>

## `getTransactions`

Returns the transaction history of a given account. Results are ordered by logical time in descending order (newest first).

Pagination uses `lt` and `hash` as a cursor pair. Both must be provided together. These values come from the last transaction in the previous response.

### Pagination parameters

All pagination parameters are optional. They are omitted for the first request and included on subsequent pages.

| Parameter | Type    | Description                                                                    |
| --------- | ------- | ------------------------------------------------------------------------------ |
| `lt`      | integer | Logical time of the transaction to start from. Must be sent with `hash`.       |
| `hash`    | string  | Hash of the transaction to start from (base64 or hex). Must be sent with `lt`. |
| `to_lt`   | integer | Logical time to stop at (returns transactions from `lt` down to `to_lt`).      |
| `limit`   | integer | Maximum number of transactions to return.                                      |

<Aside type="note" title="Full parameter list">
  This table only lists pagination-related parameters. See the [`getTransactions` reference](/ecosystem/api/toncenter/v2/accounts/list-account-transactions) for all available parameters.
</Aside>

### Paginate through transactions

<Steps>
  <Step title="Fetch the first page">
    Send a request with only `address` and `limit`. No cursor parameters are needed for the first page.

    ```bash theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
    curl "https://toncenter.com/api/v2/getTransactions?address=EQDtFpEwcFAEcRe5mLVh2N6C0x-_hJEM7W61_JLnSF74p4q2&limit=5"
    ```

    Response (abbreviated):

    ```json theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
    {
      "ok": true,
      "result": [
        {
          "transaction_id": { "lt": "66822814000007", "hash": "CRBa2CODN76LJVnhlJQj4YK72XyKZr1wxoE3geVvjzM=" },
          "utime": 1770840795
        },
        {
          "transaction_id": { "lt": "66822814000003", "hash": "xG97UIir0GIv8rUtbhjgwzYKjZCNY/tepayx0wpba6Y=" },
          "utime": 1770840795
        },
        {
          "transaction_id": { "lt": "66807630000007", "hash": "UgUsErhclkJ+6rfeYl64aBGlAnLBfzQs+0hKtsquFA0=" },
          "utime": 1770804654
        },
        {
          "transaction_id": { "lt": "66807630000003", "hash": "TKpxufc9Fq4UG9zFA0EvsiMTM/CAEb/Mbh6WsinnMnQ=" },
          "utime": 1770804654
        },
        {
          "transaction_id": { "lt": "66784070000010", "hash": "jYTMpoesWRQ9gs9sbiYcRu+raNOU1Jd3bqCC9V/ntFU=" },
          "utime": 1770748952
        }
      ]
    }
    ```
  </Step>

  <Step title="Extract the cursor from the last transaction">
    Take the `lt` and `hash` from the last transaction in the response. In this case:

    * `lt`: `66784070000010`
    * `hash`: `jYTMpoesWRQ9gs9sbiYcRu+raNOU1Jd3bqCC9V/ntFU=`
  </Step>

  <Step title="Fetch the next page">
    Pass the extracted `lt` and `hash` as query parameters to get the next batch.

    ```bash theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
    curl "https://toncenter.com/api/v2/getTransactions?address=EQDtFpEwcFAEcRe5mLVh2N6C0x-_hJEM7W61_JLnSF74p4q2&limit=5&lt=66784070000010&hash=jYTMpoesWRQ9gs9sbiYcRu%2BraNOU1Jd3bqCC9V%2FntFU%3D"
    ```

    Response (abbreviated):

    ```json theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
    {
      "ok": true,
      "result": [
        {
          "transaction_id": { "lt": "66784070000010", "hash": "jYTMpoesWRQ9gs9sbiYcRu+raNOU1Jd3bqCC9V/ntFU=" },
          "utime": 1770748952
        },
        {
          "transaction_id": { "lt": "66776372000007", "hash": "rurBAd24NwH8DzD3TzEW6LpXyNh5RPw7S65288Wi/Lg=" },
          "utime": 1770730669
        },
        {
          "transaction_id": { "lt": "66776372000003", "hash": "FadeYZd6F5jZbnl+dVocps+ylGqf3IXoL2B3WC6B+dM=" },
          "utime": 1770730669
        },
        {
          "transaction_id": { "lt": "66773132000007", "hash": "GgHyA2ob2m06MyeA0qFHUB8J4s3xN882ETlmngV5//0=" },
          "utime": 1770722937
        },
        {
          "transaction_id": { "lt": "66773132000003", "hash": "QGFGNpXQJnB6YTEsTztMAShGiwkah7bL5i6n/O+EhDY=" },
          "utime": 1770722937
        }
      ]
    }
    ```

    <Aside type="caution" title="Inclusive cursor">
      The transaction passed as `lt`/`hash` is included as the first result in the next response. In the responses above, transaction `66784070000010` appears as the last item on page 1 and again as the first item on page 2. When implementing pagination, skip the first result on subsequent pages to avoid processing the same transaction twice.
    </Aside>
  </Step>

  <Step title="Repeat until the last page">
    Continue extracting the cursor from the last transaction and fetching the next page.

    All results have been retrieved when the response returns fewer transactions than the `limit`. Because the cursor is inclusive, a full subsequent page delivers `limit - 1` new transactions (the first item is the cursor duplicate), so a response containing only the cursor transaction (1 item) also counts as an end signal.
  </Step>
</Steps>

<Accordion title="Full pagination script">
  ```javascript theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
  // Replace with a account address you want to paginate, for example:
  // const address = "EQDtFpEwcFAEcRe5mLVh2N6C0x-_hJEM7W61_JLnSF74p4q2";
  const ADDRESS = "<ACCOUNT_ADDRESS>";
  const LIMIT = 5;

  async function main() {
    let allTransactions = [];
    let lt = undefined;
    let hash = undefined;
    let page = 0;

    while (true) {
      page++;
      const params = new URLSearchParams({ address, limit: String(LIMIT) });
      if (lt && hash) {
        params.set("lt", lt);
        params.set("hash", hash);
      }

      const res = await fetch(
        `https://toncenter.com/api/v2/getTransactions?${params}`
      );
      const { result } = await res.json();

      console.log(
        lt
          ? `\n--- Page ${page} (cursor: lt=${lt}) ---`
          : `\n--- Page ${page} (no cursor) ---`
      );

      for (let i = 0; i < result.length; i++) {
        const tx = result[i];
        if (i === 0 && lt && hash) {
          console.log(
            `  [skipped] lt: ${tx.transaction_id.lt}  hash: ${tx.transaction_id.hash} (duplicate)`
          );
        } else {
          console.log(
            `  lt: ${tx.transaction_id.lt}  hash: ${tx.transaction_id.hash}`
          );
        }
      }

      const isLastPage = result.length < LIMIT;

      if (lt && hash) {
        result.shift();
      }

      allTransactions.push(...result);

      if (isLastPage) break;

      const last = result[result.length - 1];
      lt = last.transaction_id.lt;
      hash = last.transaction_id.hash;
    }

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

  main();
  ```

  Output:

  ```
  --- Page 1 (no cursor) ---
    lt: 67064337000004  hash: KkpVTX9RwiZcug8KQuOFUF8+eNoxuHVuIFpGQqufCWU=
    lt: 67011337000003  hash: b5fhFby+j8gg936W+XEsAEhboQW0zPcOHOHgyqXkTwI=
    lt: 66986300000006  hash: lT/wWTiJIdEF8A2Rox9CRdQRzlUgnIDGeUfEHQ8jGZQ=
    lt: 66927779000007  hash: 07QaeBRRA62+RJPgetgSraYLH5i9G5QhC2dUvKAsAiI=
    lt: 66927779000003  hash: 8d7sSor1NqbGNdX1JEGl1d4rX3lb7CeC3DZjhe7V7z4=

  --- Page 2 (cursor: lt=66927779000003) ---
    [skipped] lt: 66927779000003  hash: 8d7sSor1NqbGNdX1JEGl1d4rX3lb7CeC3DZjhe7V7z4= (duplicate)
    lt: 66926353000007  hash: szM1I5/MU1uJGgeScS7uxNF6V/FsLkokCpul88ZEau8=
    lt: 66905979000007  hash: UpvmmLyIskTyb+ht0AER1lI5kKhVclz8Gr8k1qTtBUs=
    lt: 66905979000003  hash: RBXO0z9nKYhpdzxszf3zv/7K9ec3uMI7wF/wAsKnu08=
    lt: 66905973000007  hash: PD6rHCJB1O+CVAoT7zAf2W4Ux5NHD++BstZR3Qcq2w0=

  Total unique transactions: 9
  ```
</Accordion>

### Fetching a specific range

Use `to_lt` to stop pagination at a specific logical time instead of iterating through the entire history:

```bash theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
curl "https://toncenter.com/api/v2/getTransactions?address=EQDtFpEwcFAEcRe5mLVh2N6C0x-_hJEM7W61_JLnSF74p4q2&limit=20&lt=66822814000007&to_lt=66784070000010"
```

This returns only transactions between the two logical times, so a sync job can re-fetch a bounded window rather than walking the full history.

## `getBlockTransactions`

Returns a list of short transaction identifiers for all transactions in a given block.

Pagination uses `after_lt` and `after_hash` as a cursor pair. Both must be provided together. The response includes an `incomplete` field that indicates whether more transactions remain in the block.

### Pagination parameters

All pagination parameters are optional. They are omitted for the first request and included on subsequent pages.

| Parameter    | Type    | Description                                                                  |
| ------------ | ------- | ---------------------------------------------------------------------------- |
| `after_lt`   | integer | Return transactions after this logical time. Must be sent with `after_hash`. |
| `after_hash` | string  | Return transactions after this hash. Must be sent with `after_lt`.           |
| `count`      | integer | Maximum number of transactions to return per request.                        |

<Aside type="note" title="Full parameter list">
  This table only lists pagination-related parameters. See the [`getBlockTransactions` reference](/ecosystem/api/toncenter/v2/blocks/list-block-transactions) for all available parameters.
</Aside>

### Paginate through block transactions

<Steps>
  <Step title="Fetch the first page">
    Send a request with the block identifiers (`workchain`, `shard`, `seqno`) and `count`. No cursor parameters are needed for the first page.

    ```bash theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
    curl "https://toncenter.com/api/v2/getBlockTransactions?workchain=-1&shard=-9223372036854775808&seqno=57442406&count=3"
    ```

    Response:

    ```json theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
    {
      "ok": true,
      "result": {
        "@type": "blocks.transactions",
        "id": {
          "@type": "ton.blockIdExt",
          "workchain": -1,
          "shard": "-9223372036854775808",
          "seqno": 57442406,
          "root_hash": "pHQ5p6kF4hrkedOr5btZ4RvoTSES5X0Sfi5nBY88UOM=",
          "file_hash": "A7rLPEIXoyZXiJLsxS+wgJgFicQg05vcircegwE5YC8="
        },
        "req_count": 3,
        "incomplete": true,
        "transactions": [
          {
            "@type": "blocks.shortTxId",
            "account": "-1:3333333333333333333333333333333333333333333333333333333333333333",
            "lt": "67098924000001",
            "hash": "4HIgukW2DrYLGAm8fviPr83e/pNuY3Ys4kLwt+93248="
          },
          {
            "@type": "blocks.shortTxId",
            "account": "-1:3333333333333333333333333333333333333333333333333333333333333333",
            "lt": "67098924000002",
            "hash": "dveSZ4S5kWt+gi32AEdDW5X5ie3U36gQW+Gls1ZjOVg="
          },
          {
            "@type": "blocks.shortTxId",
            "account": "-1:3333333333333333333333333333333333333333333333333333333333333333",
            "lt": "67098924000005",
            "hash": "hYMkXXLa8SUI7BumkwtWnwge+nH9KB5B/0ICBqdyaKQ="
          }
        ]
      }
    }
    ```

    The `incomplete` field is `true`, meaning there are more transactions in this block.
  </Step>

  <Step title="Extract the cursor from the last transaction">
    Take the `lt` and `hash` from the last transaction in the response. In this case:

    * `lt`: `67098924000005`
    * `hash`: `hYMkXXLa8SUI7BumkwtWnwge+nH9KB5B/0ICBqdyaKQ=`
  </Step>

  <Step title="Fetch the next page">
    Pass the extracted values as `after_lt` and `after_hash` to get the next batch.

    ```bash theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
    curl "https://toncenter.com/api/v2/getBlockTransactions?workchain=-1&shard=-9223372036854775808&seqno=57442406&count=3&after_lt=67098924000005&after_hash=hYMkXXLa8SUI7BumkwtWnwge%2BnH9KB5B%2F0ICBqdyaKQ%3D"
    ```

    Response:

    ```json theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
    {
      "ok": true,
      "result": {
        "@type": "blocks.transactions",
        "id": {
          "@type": "ton.blockIdExt",
          "workchain": -1,
          "shard": "-9223372036854775808",
          "seqno": 57442406,
          "root_hash": "pHQ5p6kF4hrkedOr5btZ4RvoTSES5X0Sfi5nBY88UOM=",
          "file_hash": "A7rLPEIXoyZXiJLsxS+wgJgFicQg05vcircegwE5YC8="
        },
        "req_count": 3,
        "incomplete": false,
        "transactions": [
          {
            "@type": "blocks.shortTxId",
            "account": "-1:feecb1590c59de3f75d2d1a81b95227aa929b943c19e404fbc8eea50dd2bd8f0",
            "lt": "67098924000001",
            "hash": "3ZnfwA3+/49AJDJrRzs4TgfgnCWkhpFSUL6IZ+MsdGM="
          }
        ]
      }
    }
    ```

    The `incomplete` field is now `false`, meaning all transactions in this block have been retrieved. Total: 3 + 1 = 4 transactions.
  </Step>
</Steps>

<Aside type="note" title="Exclusive cursor">
  The cursor for `getBlockTransactions` is exclusive. The transaction passed as `after_lt`/`after_hash` is not included in the next response. No deduplication is needed.
</Aside>

<Accordion title="Full pagination script">
  ```javascript theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
  async function main() {
    const workchain = -1;
    const shard = "-9223372036854775808";
    const seqno = 57442406;

    console.log(`Block: workchain=${workchain} shard=${shard} seqno=${seqno}\n`);

    let allTransactions = [];
    let afterLt = undefined;
    let afterHash = undefined;
    let page = 0;

    while (true) {
      page++;
      const params = new URLSearchParams({
        workchain: String(workchain),
        shard: shard,
        seqno: String(seqno),
        count: "3",
      });
      if (afterLt && afterHash) {
        params.set("after_lt", afterLt);
        params.set("after_hash", afterHash);
      }

      const res = await fetch(
        `https://toncenter.com/api/v2/getBlockTransactions?${params}`
      );
      const { result } = await res.json();
      const txs = result.transactions || [];

      console.log(
        afterLt
          ? `--- Page ${page} (cursor: after_lt=${afterLt}) ---`
          : `--- Page ${page} (no cursor) ---`
      );

      for (const tx of txs) {
        console.log(
          `  account: ${tx.account}  lt: ${tx.lt}  hash: ${tx.hash}`
        );
      }

      allTransactions.push(...txs);

      if (!result.incomplete) break;

      const last = txs[txs.length - 1];
      afterLt = last.lt;
      afterHash = last.hash;
    }

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

  main();
  ```

  Output:

  ```
  Block: workchain=-1 shard=-9223372036854775808 seqno=57442406

  --- Page 1 (no cursor) ---
    account: -1:3333333333333333333333333333333333333333333333333333333333333333  lt: 67098924000001  hash: 4HIgukW2DrYLGAm8fviPr83e/pNuY3Ys4kLwt+93248=
    account: -1:3333333333333333333333333333333333333333333333333333333333333333  lt: 67098924000002  hash: dveSZ4S5kWt+gi32AEdDW5X5ie3U36gQW+Gls1ZjOVg=
    account: -1:3333333333333333333333333333333333333333333333333333333333333333  lt: 67098924000005  hash: hYMkXXLa8SUI7BumkwtWnwge+nH9KB5B/0ICBqdyaKQ=

  --- Page 2 (cursor: after_lt=67098924000005) ---
    account: -1:feecb1590c59de3f75d2d1a81b95227aa929b943c19e404fbc8eea50dd2bd8f0  lt: 67098924000001  hash: 3ZnfwA3+/49AJDJrRzs4TgfgnCWkhpFSUL6IZ+MsdGM=

  Total transactions in block: 4
  ```
</Accordion>

## `getBlockTransactionsExt`

Returns full transaction details for all transactions in a given block. Pagination works the same way as [`getBlockTransactions`](#getblocktransactions), using `after_lt` and `after_hash` as cursors with the `incomplete` field as the end of results signal. The only difference is that this endpoint returns complete transaction objects instead of short identifiers.

### Pagination parameters

Pagination parameters are identical to [`getBlockTransactions`](#getblocktransactions). See the [`getBlockTransactionsExt` reference](/ecosystem/api/toncenter/v2/blocks/list-block-transactions-extended-details) for all available parameters.

### Paginate through extended block transactions

<Steps>
  <Step title="Fetch the first page">
    ```bash theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
    curl "https://toncenter.com/api/v2/getBlockTransactionsExt?workchain=-1&shard=-9223372036854775808&seqno=57442406&count=3"
    ```

    Response (abbreviated):

    ```json theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
    {
      "ok": true,
      "result": {
        "@type": "blocks.transactionsExt",
        "id": {
          "@type": "ton.blockIdExt",
          "workchain": -1,
          "shard": "-9223372036854775808",
          "seqno": 57442406,
          "root_hash": "pHQ5p6kF4hrkedOr5btZ4RvoTSES5X0Sfi5nBY88UOM=",
          "file_hash": "A7rLPEIXoyZXiJLsxS+wgJgFicQg05vcircegwE5YC8="
        },
        "req_count": 3,
        "incomplete": true,
        "transactions": [
          {
            "@type": "raw.transactionExt",
            "address": { "account_address": "Ef8zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzM0vF" },
            "utime": 1771491922,
            "transaction_id": { "lt": "67098924000001", "hash": "4HIgukW2DrYLGAm8fviPr83e/pNuY3Ys4kLwt+93248=" },
            "fee": "0",
            "in_msg": null,
            "out_msgs": []
          },
          {
            "@type": "raw.transactionExt",
            "address": { "account_address": "Ef8zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzM0vF" },
            "utime": 1771491922,
            "transaction_id": { "lt": "67098924000002", "hash": "dveSZ4S5kWt+gi32AEdDW5X5ie3U36gQW+Gls1ZjOVg=" },
            "fee": "0",
            "in_msg": { "source": "Ef8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAU", "value": "3094985186" },
            "out_msgs": []
          },
          {
            "@type": "raw.transactionExt",
            "address": { "account_address": "Ef8zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzM0vF" },
            "utime": 1771491922,
            "transaction_id": { "lt": "67098924000005", "hash": "hYMkXXLa8SUI7BumkwtWnwge+nH9KB5B/0ICBqdyaKQ=" },
            "fee": "0",
            "in_msg": { "source": "Ef9bgW4Vqf9_dfCfj5JzEcWVcJLG0wFUyn_PRoYJDzw1i4In", "value": "821183560232225" },
            "out_msgs": [{ "destination": "Ef9bgW4Vqf9_dfCfj5JzEcWVcJLG0wFUyn_PRoYJDzw1i4In", "value": "1000000000" }]
          }
        ]
      }
    }
    ```
  </Step>

  <Step title="Extract the cursor from the last transaction">
    Take the `lt` and `hash` from the last transaction's `transaction_id`. In this case:

    * `lt`: `67098924000005`
    * `hash`: `hYMkXXLa8SUI7BumkwtWnwge+nH9KB5B/0ICBqdyaKQ=`
  </Step>

  <Step title="Fetch the next page">
    ```bash theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
    curl "https://toncenter.com/api/v2/getBlockTransactionsExt?workchain=-1&shard=-9223372036854775808&seqno=57442406&count=3&after_lt=67098924000005&after_hash=hYMkXXLa8SUI7BumkwtWnwge%2BnH9KB5B%2F0ICBqdyaKQ%3D"
    ```

    Response (abbreviated):

    ```json theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
    {
      "ok": true,
      "result": {
        "@type": "blocks.transactionsExt",
        "id": {
          "@type": "ton.blockIdExt",
          "workchain": -1,
          "shard": "-9223372036854775808",
          "seqno": 57442406,
          "root_hash": "pHQ5p6kF4hrkedOr5btZ4RvoTSES5X0Sfi5nBY88UOM=",
          "file_hash": "A7rLPEIXoyZXiJLsxS+wgJgFicQg05vcircegwE5YC8="
        },
        "req_count": 3,
        "incomplete": false,
        "transactions": [
          {
            "@type": "raw.transactionExt",
            "address": { "account_address": "Ef_-7LFZDFneP3XS0agblSJ6qSm5Q8GeQE-8jupQ3SvY8Bh7" },
            "utime": 1771491922,
            "transaction_id": { "lt": "67098924000001", "hash": "3ZnfwA3+/49AJDJrRzs4TgfgnCWkhpFSUL6IZ+MsdGM=" },
            "fee": "81240283",
            "in_msg": { "source": "", "value": "0" },
            "out_msgs": [{ "destination": "Ef9bgW4Vqf9_dfCfj5JzEcWVcJLG0wFUyn_PRoYJDzw1i4In", "value": "1300000000" }]
          }
        ]
      }
    }
    ```

    The `incomplete` field is `false`. All transactions in this block have been retrieved.
  </Step>
</Steps>

<Aside type="note" title="Exclusive cursor">
  The cursor for `getBlockTransactionsExt` is exclusive. The transaction passed as `after_lt`/`after_hash` is not included in the next response. No deduplication is needed.
</Aside>

<Accordion title="Full pagination script">
  ```javascript theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
  async function main() {
    const workchain = -1;
    const shard = "-9223372036854775808";
    const seqno = 57442406;

    console.log(`Block: workchain=${workchain} shard=${shard} seqno=${seqno}\n`);

    let allTransactions = [];
    let afterLt = undefined;
    let afterHash = undefined;
    let page = 0;

    while (true) {
      page++;
      const params = new URLSearchParams({
        workchain: String(workchain),
        shard: shard,
        seqno: String(seqno),
        count: "3",
      });
      if (afterLt && afterHash) {
        params.set("after_lt", afterLt);
        params.set("after_hash", afterHash);
      }

      const res = await fetch(
        `https://toncenter.com/api/v2/getBlockTransactionsExt?${params}`
      );
      const { result } = await res.json();
      const txs = result.transactions || [];

      console.log(
        afterLt
          ? `--- Page ${page} (cursor: after_lt=${afterLt}) ---`
          : `--- Page ${page} (no cursor) ---`
      );

      for (const tx of txs) {
        console.log(
          `  account: ${tx.address.account_address}  lt: ${tx.transaction_id.lt}  hash: ${tx.transaction_id.hash}  fee: ${tx.fee}`
        );
      }

      allTransactions.push(...txs);

      if (!result.incomplete) break;

      const last = txs[txs.length - 1];
      afterLt = last.transaction_id.lt;
      afterHash = last.transaction_id.hash;
    }

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

  main();
  ```

  Output:

  ```
  Block: workchain=-1 shard=-9223372036854775808 seqno=57442406

  --- Page 1 (no cursor) ---
    account: Ef8zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzM0vF  lt: 67098924000001  hash: 4HIgukW2DrYLGAm8fviPr83e/pNuY3Ys4kLwt+93248=  fee: 0
    account: Ef8zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzM0vF  lt: 67098924000002  hash: dveSZ4S5kWt+gi32AEdDW5X5ie3U36gQW+Gls1ZjOVg=  fee: 0
    account: Ef8zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzM0vF  lt: 67098924000005  hash: hYMkXXLa8SUI7BumkwtWnwge+nH9KB5B/0ICBqdyaKQ=  fee: 0

  --- Page 2 (cursor: after_lt=67098924000005) ---
    account: Ef_-7LFZDFneP3XS0agblSJ6qSm5Q8GeQE-8jupQ3SvY8Bh7  lt: 67098924000001  hash: 3ZnfwA3+/49AJDJrRzs4TgfgnCWkhpFSUL6IZ+MsdGM=  fee: 81240283

  Total transactions in block: 4
  ```
</Accordion>
