---
title: "Migration to v3 (legacy REST surface removal)"
description: "How to migrate off the deprecated REST surface that is removed in Bitrix24 JS SDK 3.0.0."
canonical_url: "https://bitrix24.github.io/b24jssdk/docs/getting-started/migration/v3"
last_updated: "2026-07-03"
---
# Migration to v3 (legacy REST surface removal)

> How to migrate off the deprecated REST surface that is removed in Bitrix24 JS SDK 3.0.0.

This guide lists everything that is **`@deprecated` in `2.0.0`** and **removed in `3.0.0`**, with the canonical replacement for each symbol.

> [!WARNING]
> The symbols below still ship in `2.0.0` — they keep working but emit a runtime deprecation warning on every call. They are **removed in `3.0.0`**. Migrate before upgrading to `3.0.0`.

> [!NOTE]
> Step-by-step `diff` examples for every method are in the [v0 → v1 guide](https://bitrix24.github.io/b24jssdk/raw/docs/getting-started/migration/v1.md) under "Deprecated" — this page is the at-a-glance removal checklist.

## What is removed in 3.0.0

### Legacy REST shortcuts on `AbstractB24`

These instance shortcuts ignore the `restApi:v2` / `restApi:v3` split and are replaced by the explicit action surface:

| Removed | Replacement |
| --- | --- |
| `b24.callMethod(method, params, start)` | `b24.actions.v{2,3}.call.make(options)` |
| `b24.callListMethod(method, params, progress, customKeyForResult)` | `b24.actions.v{2,3}.callList.make(options)` <sup> [1](#user-content-fn-idkey){ariaDescribedBy="[\"footnote-label\"]" dataFootnoteRef="" #user-content-fnref-idkey} </sup> |
| `b24.fetchListMethod(method, params, idKey, customKeyForResult)` | `b24.actions.v{2,3}.fetchList.make(options)` <sup> [1](#user-content-fn-idkey){ariaDescribedBy="[\"footnote-label\"]" dataFootnoteRef="" #user-content-fnref-idkey-2} </sup> |
| `b24.callBatch(calls, isHaltOnError, returnAjaxResult)` | `b24.actions.v{2,3}.batch.make(options)` |
| `b24.callBatchByChunk(calls, isHaltOnError)` | `b24.actions.v{2,3}.batchByChunk.make(options)` |

```diff
- await b24.callMethod('crm.deal.list', { filter: { '>id': 123 } }, 100)
+ await b24.actions.v2.call.make({
+   method: 'crm.deal.list',
+   params: { filter: { '>id': 123 }, start: 100 },
+   requestId: 'unique-request-id'
+ })
```

### `AbstractB24.batchSize`

> Maximum length for batch response.

The static const is removed. Inline the value `50` if you relied on it.

```diff
- if (size < AbstractB24.batchSize) {
+ if (size < 50) {
  // some code ...
}
```

### `AjaxResult` paging helpers

These are tied to the `restApi:v2` envelope fields `next` / `total`, which `restApi:v3` does not return:

| Removed | Replacement |
| --- | --- |
| `result.isMore()` | use the list helpers — they hide pagination entirely |
| `result.hasMore()` | use the list helpers |
| `result.getNext(http)` | use the list helpers |
| `result.fetchNext(http)` | use the list helpers |
| `result.getTotal()` | `restApi:v2`: use the list helpers; `restApi:v3` has no element-count yet (an `aggregate` action is planned) |

Replace manual paging with [`callList.make`](https://bitrix24.github.io/b24jssdk/raw/docs/working-with-the-rest-api/call-list-rest-api-ver2.md) (collect everything) or [`fetchList.make`](https://bitrix24.github.io/b24jssdk/raw/docs/working-with-the-rest-api/fetch-list-rest-api-ver2.md) (async generator):

```diff
- // legacy manual paging on the deprecated surface
- const res = await b24.callMethod('crm.deal.list', {})
- let list = res.getData().result
- while (res.isMore()) { res = await res.getNext(http); list.push(...res.getData().result) }
+ // the list helper iterates for you — `chunk` is the next array of items
+ for await (const chunk of b24.actions.v2.fetchList.make({ method: 'crm.deal.list' })) {
+   // handle chunk
+ }
```

### `LoggerBrowser` and `LoggerType`

Replaced by the universal [`Logger` / `LoggerFactory`](https://bitrix24.github.io/b24jssdk/raw/docs/working-with-the-rest-api/logger.md) system. The `LoggerType` enum is removed with no replacement — `LoggerFactory` manages levels itself, so just drop the import:

```diff
- import { LoggerBrowser, LoggerType } from '@bitrix24/b24jssdk'
+ import { LoggerFactory } from '@bitrix24/b24jssdk'

- const $logger = LoggerBrowser.build('MyApp', import.meta.env?.DEV === true)
+ const $logger = LoggerFactory.createForBrowser('MyApp', import.meta.env?.DEV === true)

- $logger.info('response', dataList)
+ $logger.info('response', { someInfo: dataList })
```

## How to find every call site

The deprecated symbols emit a `JSSDK_CORE_DEPRECATED_METHOD` warning at runtime, and `LoggerBrowser` logs `@deprecated: use Logger`. A quick static check:

```bash
grep -rnE 'callMethod|callListMethod|fetchListMethod|callBatch|callBatchByChunk|\.isMore\(|\.hasMore\(|\.getNext\(|\.fetchNext\(|\.getTotal\(|LoggerBrowser|LoggerType' src
```

```powershell
Get-ChildItem -Recurse src -Include *.ts,*.js |
  Select-String -Pattern 'callMethod|callListMethod|fetchListMethod|callBatch|callBatchByChunk|\.isMore\(|\.hasMore\(|\.getNext\(|\.fetchNext\(|\.getTotal\(|LoggerBrowser|LoggerType'
```

Once that returns nothing, you are ready for `3.0.0`.

<section className="[\"footnotes\"]" dataFootnotes="">

## Footnotes

1. Pass the correct `idKey` — `'ID'` for classic list methods, `'id'` for `crm.item.*` / `restApi:v3`. Omitting it can yield a silently empty result. [↩](#user-content-fnref-idkey){ariaLabel="Back to reference 1" className="[\"data-footnote-backref\"]" dataFootnoteBackref=""} [↩<sup>

2

</sup>](#user-content-fnref-idkey-2){ariaLabel="Back to reference 1-2" className="[\"data-footnote-backref\"]" dataFootnoteBackref=""}

</section>

## Sitemap

See the full [sitemap](/b24jssdk/sitemap.md) for all pages.
