[{"data":1,"prerenderedAt":2198},["ShallowReactive",2],{"navigation":3,"-docs-getting-started-migration-within-2x":508,"-docs-getting-started-migration-within-2x-description":2188},[4],{"title":5,"path":6,"stem":7,"children":8,"page":47},"Docs","\u002Fdocs","docs",[9,83,393,400],{"title":10,"path":11,"stem":12,"children":13,"restApiVersion":15,"category":15,"description":15,"badge":15},"Get Started","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started\u002F1.index",[14,17,48,68],{"title":10,"path":11,"stem":12,"restApiVersion":15,"category":15,"description":16,"badge":15},null,"Quick start guide for working with the SDK for Bitrix24 REST API",{"title":18,"path":19,"stem":20,"children":21,"page":47},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F1.getting-started\u002F2.installation",[22,27,32,37,42],{"title":23,"path":24,"stem":25,"restApiVersion":15,"category":15,"description":26,"badge":15},"Vue","\u002Fdocs\u002Fgetting-started\u002Finstallation\u002Fvue","docs\u002F1.getting-started\u002F2.installation\u002F1.vue","Guide for installing Bitrix24 JS SDK in Vue applications.",{"title":28,"path":29,"stem":30,"restApiVersion":15,"category":15,"description":31,"badge":15},"Nuxt","\u002Fdocs\u002Fgetting-started\u002Finstallation\u002Fnuxt","docs\u002F1.getting-started\u002F2.installation\u002F2.nuxt","Guide for installing Bitrix24 JS SDK in Nuxt applications.",{"title":33,"path":34,"stem":35,"restApiVersion":15,"category":15,"description":36,"badge":15},"React","\u002Fdocs\u002Fgetting-started\u002Finstallation\u002Freact","docs\u002F1.getting-started\u002F2.installation\u002F3.react","Guide for installing Bitrix24 JS SDK in React applications.",{"title":38,"path":39,"stem":40,"restApiVersion":15,"category":15,"description":41,"badge":15},"Node.js","\u002Fdocs\u002Fgetting-started\u002Finstallation\u002Fnodejs","docs\u002F1.getting-started\u002F2.installation\u002F4.nodejs","Guide for installing Bitrix24 JS SDK in Node.js applications.",{"title":43,"path":44,"stem":45,"restApiVersion":15,"category":15,"description":46,"badge":15},"UMD","\u002Fdocs\u002Fgetting-started\u002Finstallation\u002Fumd","docs\u002F1.getting-started\u002F2.installation\u002F5.umd","Guide for using UMD version Bitrix24 JS SDK in you applications.",false,{"title":49,"restApiVersion":15,"category":15,"description":15,"badge":15,"shadow":47,"path":50,"stem":51,"children":52,"page":47},"Migration","\u002Fdocs\u002Fgetting-started\u002Fmigration","docs\u002F1.getting-started\u002F3.migration",[53,58,63],{"title":54,"path":55,"stem":56,"restApiVersion":15,"category":15,"description":57,"badge":15},"v0 to v1","\u002Fdocs\u002Fgetting-started\u002Fmigration\u002Fv1","docs\u002F1.getting-started\u002F3.migration\u002F1.v1","A comprehensive guide to migrate your application from Bitrix24 JS SDK v0 to Bitrix24 JS SDK v1.",{"title":59,"path":60,"stem":61,"restApiVersion":15,"category":15,"description":62,"badge":15},"v2 to v3","\u002Fdocs\u002Fgetting-started\u002Fmigration\u002Fv3","docs\u002F1.getting-started\u002F3.migration\u002F2.v3","How to migrate off the deprecated REST surface that is removed in Bitrix24 JS SDK 3.0.0.",{"title":64,"path":65,"stem":66,"restApiVersion":15,"category":15,"description":67,"badge":15},"Inside 2.x","\u002Fdocs\u002Fgetting-started\u002Fmigration\u002Fwithin-2x","docs\u002F1.getting-started\u002F3.migration\u002F3.within-2x","Changes within the 2.x line that need a change on your side even though no API was removed — what breaks, how to tell, and what to do.",{"title":69,"restApiVersion":15,"category":15,"description":15,"badge":15,"path":70,"stem":71,"children":72,"page":47},"AI Tools","\u002Fdocs\u002Fgetting-started\u002Fai","docs\u002F1.getting-started\u002F7.ai",[73,78],{"title":74,"path":75,"stem":76,"restApiVersion":15,"category":15,"description":77,"badge":15},"Skills","\u002Fdocs\u002Fgetting-started\u002Fai\u002Fskills","docs\u002F1.getting-started\u002F7.ai\u002F1.skills","Task-focused skill files for AI coding agents working with @bitrix24\u002Fb24jssdk.",{"title":79,"path":80,"stem":81,"restApiVersion":15,"category":15,"description":82,"badge":15},"LLMs.txt","\u002Fdocs\u002Fgetting-started\u002Fai\u002Fllms-txt","docs\u002F1.getting-started\u002F7.ai\u002F2.llms-txt","How to get AI tools like Cursor, Windsurf, GitHub Copilot, ChatGPT, and Claude to understand Bitrix24 JS SDK methods, tools, and best practices.",{"title":84,"path":85,"stem":86,"children":87,"restApiVersion":15,"category":15,"description":15,"badge":15},"Working with the REST API","\u002Fdocs\u002Fworking-with-the-rest-api","docs\u002F2.working-with-the-rest-api\u002F0.index",[88,91,98,103,108,112,117,121,126,131,135,140,145,150,155,160,165,170,175,180,184,189,194,199,205,210,215,220,225,230,235,240,245,250,256,261,266,272,277,282,287,292,298,304,309,314,320,325,330,335,340,345,351,358,363,368,373,378,383,388],{"title":89,"path":85,"stem":86,"restApiVersion":15,"category":15,"description":90,"badge":15},"Introduction","Overview of SDK capabilities for working with Bitrix24 REST API",{"title":92,"path":93,"stem":94,"restApiVersion":95,"category":96,"description":97,"badge":15},"Call","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fcall-rest-api-ver2","docs\u002F2.working-with-the-rest-api\u002F1.call-rest-api-ver2","rest-api-ver2","actions","A method for making Bitrix24 REST API version 2 calls.",{"title":92,"path":99,"stem":100,"restApiVersion":101,"category":96,"description":102,"badge":15},"\u002Fdocs\u002Fworking-with-the-rest-api\u002Fcall-rest-api-ver3","docs\u002F2.working-with-the-rest-api\u002F1.call-rest-api-ver3","rest-api-ver3","Method for making Bitrix24 REST API version 3 calls.",{"title":104,"path":105,"stem":106,"restApiVersion":95,"category":96,"description":107,"badge":15},"CallList","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fcall-list-rest-api-ver2","docs\u002F2.working-with-the-rest-api\u002F2.call-list-rest-api-ver2","Method for quickly retrieving all data from list methods of Bitrix24 REST API version 2.",{"title":104,"path":109,"stem":110,"restApiVersion":101,"category":96,"description":111,"badge":15},"\u002Fdocs\u002Fworking-with-the-rest-api\u002Fcall-list-rest-api-ver3","docs\u002F2.working-with-the-rest-api\u002F2.call-list-rest-api-ver3","Method for quickly retrieving all data from list methods of Bitrix24 REST API version 3.",{"title":113,"path":114,"stem":115,"restApiVersion":95,"category":96,"description":116,"badge":15},"FetchList","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ffetch-list-rest-api-ver2","docs\u002F2.working-with-the-rest-api\u002F2.fetch-list-rest-api-ver2","Returns an AsyncGenerator that allows processing data from list methods of Bitrix24 REST API version 2 as it is received without loading the entire array into memory at once. This is especially useful when working with very large volumes of data.",{"title":113,"path":118,"stem":119,"restApiVersion":101,"category":96,"description":120,"badge":15},"\u002Fdocs\u002Fworking-with-the-rest-api\u002Ffetch-list-rest-api-ver3","docs\u002F2.working-with-the-rest-api\u002F2.fetch-list-rest-api-ver3","Returns an AsyncGenerator that allows processing data from list methods of Bitrix24 REST API version 3 as it is received without loading the entire array into memory at once. This is especially useful when working with very large volumes of data.",{"title":122,"path":123,"stem":124,"restApiVersion":15,"category":122,"description":125,"badge":15},"B24Hook","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fhook","docs\u002F2.working-with-the-rest-api\u002F20.hook","Server-side entry point for talking to the Bitrix24 REST API through an inbound webhook (permanent token).",{"title":127,"path":128,"stem":129,"restApiVersion":95,"category":96,"description":130,"badge":15},"Batch","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fbatch-rest-api-ver2","docs\u002F2.working-with-the-rest-api\u002F3.batch-rest-api-ver2","Method for executing batch requests to Bitrix24 REST API version 2. Allows executing up to 50 commands in a single API call.",{"title":127,"path":132,"stem":133,"restApiVersion":101,"category":96,"description":134,"badge":15},"\u002Fdocs\u002Fworking-with-the-rest-api\u002Fbatch-rest-api-ver3","docs\u002F2.working-with-the-rest-api\u002F3.batch-rest-api-ver3","Method for executing batch requests to Bitrix24 REST API version 3. The SDK sends up to 50 commands in a single API call.",{"title":89,"path":136,"stem":137,"restApiVersion":15,"category":138,"description":139,"badge":15},"\u002Fdocs\u002Fworking-with-the-rest-api\u002Fframe","docs\u002F2.working-with-the-rest-api\u002F30.frame","B24Frame","Designed for managing Bitrix24 applications running inside a placement iframe. Inherits from AbstractB24 and exposes managers for authentication, parent-window messaging, sliders, dialogs, placements, and options.",{"title":141,"path":142,"stem":143,"restApiVersion":15,"category":138,"description":144,"badge":15},"Initialization","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fframe-initialize-b24-frame","docs\u002F2.working-with-the-rest-api\u002F30.frame-initialize-b24-frame","Function is designed to initialize a B24Frame",{"title":146,"path":147,"stem":148,"restApiVersion":15,"category":138,"description":149,"badge":15},"Auth","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fframe-auth","docs\u002F2.working-with-the-rest-api\u002F31.frame-auth","Designed for managing authentication in Bitrix24 applications. It handles authentication data received from the parent window and provides methods for updating and retrieving this data.",{"title":151,"path":152,"stem":153,"restApiVersion":15,"category":138,"description":154,"badge":15},"Dialog","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fframe-dialog","docs\u002F2.working-with-the-rest-api\u002F31.frame-dialog","Wraps the BX24 system dialogs (user picker, access permission picker, CRM entity picker) so they can be opened from inside a Bitrix24 application iframe.",{"title":156,"path":157,"stem":158,"restApiVersion":15,"category":138,"description":159,"badge":15},"Options","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fframe-options","docs\u002F2.working-with-the-rest-api\u002F31.frame-options","Used for managing application and user settings in the Bitrix24 application. It allows initializing data, getting, and setting options through messages to the parent window.",{"title":161,"path":162,"stem":163,"restApiVersion":15,"category":138,"description":164,"badge":15},"Parent","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fframe-parent","docs\u002F2.working-with-the-rest-api\u002F31.frame-parent","Provides methods for managing the parent application window in Bitrix24, including resizing the window, managing scroll, initiating calls, and opening the messenger.",{"title":166,"path":167,"stem":168,"restApiVersion":15,"category":138,"description":169,"badge":15},"Placement","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fframe-placement","docs\u002F2.working-with-the-rest-api\u002F31.frame-placement","Used for managing the placement of widgets in the Bitrix24 application.",{"title":171,"path":172,"stem":173,"restApiVersion":15,"category":138,"description":174,"badge":15},"Slider","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fframe-slider","docs\u002F2.working-with-the-rest-api\u002F31.frame-slider","Provides methods for working with sliders in the Bitrix24 application. It allows opening and closing sliders, as well as managing their content.",{"title":176,"path":177,"stem":178,"restApiVersion":95,"category":96,"description":179,"badge":15},"BatchByChunk","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fbatch-by-chunk-rest-api-ver2","docs\u002F2.working-with-the-rest-api\u002F4.batch-by-chunk-rest-api-ver2","Method for executing batch requests with automatic chunking for any number of commands. Automatically splits large command sets into batches of 50 and executes them sequentially. Use only arrays of tuples or arrays of objects.",{"title":176,"path":181,"stem":182,"restApiVersion":101,"category":96,"description":183,"badge":15},"\u002Fdocs\u002Fworking-with-the-rest-api\u002Fbatch-by-chunk-rest-api-ver3","docs\u002F2.working-with-the-rest-api\u002F4.batch-by-chunk-rest-api-ver3","Method for executing batch requests to Bitrix24 REST API version 3 with automatic chunking for any number of commands. Automatically splits large command sets into batches of 50 and executes them sequentially. Use only arrays of tuples or arrays of objects.",{"title":185,"path":186,"stem":187,"restApiVersion":15,"category":185,"description":188,"badge":15},"B24OAuth","\u002Fdocs\u002Fworking-with-the-rest-api\u002Foauth","docs\u002F2.working-with-the-rest-api\u002F40.oauth","Server-side entry point for talking to the Bitrix24 REST API with an OAuth 2.0 access token (and automatic refresh).",{"title":190,"path":191,"stem":192,"restApiVersion":15,"category":15,"description":193,"badge":15},"Choosing the method","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fchoosing-the-right-method","docs\u002F2.working-with-the-rest-api\u002F5.choosing-the-right-method","Decision guide for picking between Call, CallList, FetchList, Batch and BatchByChunk in REST API v2 and v3.",{"title":195,"path":196,"stem":197,"restApiVersion":15,"category":15,"description":198,"badge":15},"Filtering","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ffiltering","docs\u002F2.working-with-the-rest-api\u002F5.filtering","Reference for building filter parameters in Bitrix24 REST API v2 (prefix operators) and v3 (array-of-triples), including date formatting and the order-stripping rule.",{"title":200,"path":201,"stem":202,"restApiVersion":15,"category":203,"description":204,"badge":15},"B24HelperManager","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fhelper","docs\u002F2.working-with-the-rest-api\u002F50.helper","Helper","Aggregate manager that loads profile, app, payment, license, currency, and options data with one batched REST call, plus wires the Pull client.",{"title":206,"path":207,"stem":208,"restApiVersion":15,"category":203,"description":209,"badge":15},"useB24Helper","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fhelper-use-b24-helper","docs\u002F2.working-with-the-rest-api\u002F51.helper-use-b24-helper","Closure-based composable that owns a single B24HelperManager instance and exposes lifecycle helpers (init \u002F destroy \u002F Pull client glue).",{"title":211,"path":212,"stem":213,"restApiVersion":15,"category":203,"description":214,"badge":15},"ProfileManager","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fhelper-profile-manager","docs\u002F2.working-with-the-rest-api\u002F52.helper-profile-manager","Parsed `profile` REST response: id, name, last name, gender, photo, time zone, admin flag.",{"title":216,"path":217,"stem":218,"restApiVersion":15,"category":203,"description":219,"badge":15},"AppManager","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fhelper-app-manager","docs\u002F2.working-with-the-rest-api\u002F53.helper-app-manager","Parsed `app.info` REST response: app id, code, version, status, install flag.",{"title":221,"path":222,"stem":223,"restApiVersion":15,"category":203,"description":224,"badge":15},"PaymentManager","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fhelper-payment-manager","docs\u002F2.working-with-the-rest-api\u002F54.helper-payment-manager","Payment status of a Bitrix24 application — extracted from `app.info`.",{"title":226,"path":227,"stem":228,"restApiVersion":15,"category":203,"description":229,"badge":15},"LicenseManager","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fhelper-license-manager","docs\u002F2.working-with-the-rest-api\u002F55.helper-license-manager","Bitrix24 license info from `app.info` — and an automatic restriction-manager retune for the matching tariff plan.",{"title":231,"path":232,"stem":233,"restApiVersion":15,"category":203,"description":234,"badge":15},"CurrencyManager","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fhelper-currency-manager","docs\u002F2.working-with-the-rest-api\u002F56.helper-currency-manager","Currency catalogue cached in memory — base currency, per-currency formatters, and number-to-string formatter.",{"title":236,"path":237,"stem":238,"restApiVersion":15,"category":203,"description":239,"badge":15},"OptionsManager","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fhelper-options-manager","docs\u002F2.working-with-the-rest-api\u002F57.helper-options-manager","Typed access to `app.option.get` \u002F `user.option.get`, plus a save() that batches `*.option.set` with an optional Pull notification.",{"title":241,"path":242,"stem":243,"restApiVersion":15,"category":15,"description":244,"badge":15},"Errors","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ferrors","docs\u002F2.working-with-the-rest-api\u002F6.errors","Reference for SdkError and AjaxError codes raised by the SDK, plus the Bitrix24 REST error codes that surface through them.",{"title":246,"path":247,"stem":248,"restApiVersion":15,"category":246,"description":249,"badge":15},"Pull","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fpull","docs\u002F2.working-with-the-rest-api\u002F60.pull","Real-time message stream from Bitrix24 to your application — WebSocket primary, long-polling fallback. Frame-only.",{"title":251,"path":252,"stem":253,"restApiVersion":15,"category":254,"description":255,"badge":15},"Logger","\u002Fdocs\u002Fworking-with-the-rest-api\u002Flogger","docs\u002F2.working-with-the-rest-api\u002F66.logger","logger","Logger inspired by PHP Monolog, provides a structured logging system with support for channels, handlers, processors, and formatters. Implementation follows PSR-3 principles and the chain of responsibility pattern.",{"title":257,"path":258,"stem":259,"restApiVersion":15,"category":254,"description":260,"badge":15},"Telegram","\u002Fdocs\u002Fworking-with-the-rest-api\u002Flogger-telegram","docs\u002F2.working-with-the-rest-api\u002F66.logger-telegram","Sending logs to Telegram",{"title":262,"path":263,"stem":264,"restApiVersion":15,"category":15,"description":265,"badge":15},"Discovering v3 methods","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fdiscovering-v3-methods","docs\u002F2.working-with-the-rest-api\u002F7.discovering-v3-methods","Use rest.documentation.openapi to fetch the portal's own machine-readable list of every available REST API v3 method — the source of truth the SDK relies on instead of a hardcoded allowlist. Especially useful for AI agents and codegen.",{"title":267,"path":268,"stem":269,"restApiVersion":15,"category":270,"description":271,"badge":15},"AjaxResult","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fcore-ajax-result","docs\u002F2.working-with-the-rest-api\u002F70.core-ajax-result","Core","Specialised Result returned by every REST helper. Provides `isMore() \u002F getNext() \u002F getTotal() \u002F getStatus()` for paged responses, and immutable data.",{"title":273,"path":274,"stem":275,"restApiVersion":15,"category":270,"description":276,"badge":15},"Http","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fcore-http","docs\u002F2.working-with-the-rest-api\u002F70.core-http","Low-level transport interface returned by `b24.getHttpClient(version)`. Direct access to the axios-based clients, restriction params, statistics, and reset.",{"title":278,"path":279,"stem":280,"restApiVersion":15,"category":270,"description":281,"badge":15},"B24LangList","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fcore-lang-list","docs\u002F2.working-with-the-rest-api\u002F70.core-lang-list","Enum of Bitrix24 cloud interface languages plus the BCP-47 locale map.",{"title":283,"path":284,"stem":285,"restApiVersion":15,"category":270,"description":286,"badge":15},"RequestIdGenerator","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fcore-request-id-generator","docs\u002F2.working-with-the-rest-api\u002F70.core-request-id-generator","Default `IRequestIdGenerator` implementation. Generates UUID v7 request ids and exposes the header \u002F query parameter names used by the SDK.",{"title":288,"path":289,"stem":290,"restApiVersion":15,"category":270,"description":291,"badge":15},"Result","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fcore-result","docs\u002F2.working-with-the-rest-api\u002F70.core-result","Generic operation result with success flag, data, and an error map. Analogue of \\\\Bitrix\\\\Main\\\\Result from the Bitrix Framework.",{"title":293,"path":294,"stem":295,"restApiVersion":15,"category":296,"description":297,"badge":15},"Limiters","\u002Fdocs\u002Fworking-with-the-rest-api\u002Flimiters","docs\u002F2.working-with-the-rest-api\u002F77.limiters","limiters","The restrictions system provides a comprehensive mechanism for managing request frequency, operation execution time, and adaptive delays.",{"title":299,"path":300,"stem":301,"restApiVersion":15,"category":302,"description":303,"badge":15},"Logging & Redaction","\u002Fdocs\u002Fworking-with-the-rest-api\u002Flogging","docs\u002F2.working-with-the-rest-api\u002F78.logging","logging","What the SDK redacts automatically before any request information enters the logger or an AjaxError, what it does not redact, and how to wire a custom logger via setLogger(...) without re-introducing credential leaks.",{"title":305,"path":306,"stem":307,"restApiVersion":15,"category":15,"description":308,"badge":15},"Security","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fsecurity","docs\u002F2.working-with-the-rest-api\u002F79.security","Two hardening patterns for any server that receives Bitrix24 outbound events or OAuth install\u002Funinstall callbacks: reply 200 before you verify, and compare application_token in constant time.",{"title":310,"path":311,"stem":312,"restApiVersion":15,"category":15,"description":313,"badge":15},"Discovering entity fields","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fdiscovering-entity-fields","docs\u002F2.working-with-the-rest-api\u002F8.discovering-entity-fields","Ask the portal which fields an entity has, what type each one is, and whether it can be filtered, sorted or written — instead of guessing them or downloading the whole OpenAPI document. Also states the v3 camelCase field-name rule.",{"title":315,"path":316,"stem":317,"restApiVersion":15,"category":318,"description":319,"badge":15},"Browser","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ftools-browser","docs\u002F2.working-with-the-rest-api\u002F80.tools-browser","tools","Cheap user-agent \u002F platform \u002F capability detector. Useful for runtime branches in front-end code.",{"title":321,"path":322,"stem":323,"restApiVersion":15,"category":318,"description":324,"badge":15},"Environment","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ftools-environment","docs\u002F2.working-with-the-rest-api\u002F80.tools-environment","Runtime environment detection — `getEnvironment()`, `isBrowserLikeRuntime()` and the `Environment` enum for branching between browser, worker and Node.js code paths.",{"title":326,"path":327,"stem":328,"restApiVersion":15,"category":318,"description":329,"badge":15},"Object helpers","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ftools-object-helpers","docs\u002F2.working-with-the-rest-api\u002F80.tools-object-helpers","Tiny, dependency-free object and enum helpers — `pick`, `omit`, `getEnumValue`, and the `isArrayOfArray` type guard.",{"title":331,"path":332,"stem":333,"restApiVersion":15,"category":318,"description":334,"badge":15},"Text","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ftools-text","docs\u002F2.working-with-the-rest-api\u002F80.tools-text","Text and date utilities — UUID v4 \u002F v7, encode \u002F decode HTML entities, type conversions, case helpers, Luxon-backed `toDateTime` \u002F `toB24Format`, number formatting, and query-string builder.",{"title":336,"path":337,"stem":338,"restApiVersion":15,"category":318,"description":339,"badge":15},"Type","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ftools-type","docs\u002F2.working-with-the-rest-api\u002F80.tools-type","Runtime type guards — strings, numbers, plain objects, arrays, DOM nodes, Blobs, FormData, JSON-RPC message shapes.",{"title":341,"path":342,"stem":343,"restApiVersion":15,"category":318,"description":344,"badge":15},"useFormatter","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ftools-use-formatters","docs\u002F2.working-with-the-rest-api\u002F80.tools-use-formatters","Composable that returns shared `FormatterNumbers` and `FormatterIban` instances pre-configured with country specifications.",{"title":346,"path":347,"stem":348,"restApiVersion":15,"category":349,"description":350,"badge":15},"Common","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ftypes-common","docs\u002F2.working-with-the-rest-api\u002F90.types-common","Types","Foundational building blocks used across the SDK — scalar string aliases, field-metadata shapes (Fields, MultiField, UserFieldType), and the DataType enum.",{"title":352,"path":353,"stem":354,"children":355,"restApiVersion":15,"category":349,"description":357,"badge":15},"Types overview","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ftypes-index","docs\u002F2.working-with-the-rest-api\u002F90.types-index",[356],{"title":352,"path":353,"stem":354,"restApiVersion":15,"category":349,"description":357,"badge":15},"Navigable map of every types\u002F* module in the SDK — which have a dedicated page, which are surfaced through another page, and which are follow-ups.",{"title":359,"path":360,"stem":361,"restApiVersion":15,"category":349,"description":362,"badge":15},"IResult","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ftypes-iresult","docs\u002F2.working-with-the-rest-api\u002F90.types-iresult","Generic operation-result interface. Implemented by `Result\u003CT>` and (transitively) by `AjaxResult\u003CT>`.",{"title":364,"path":365,"stem":366,"restApiVersion":15,"category":349,"description":367,"badge":15},"Payloads","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ftypes-payloads","docs\u002F2.working-with-the-rest-api\u002F90.types-payloads","The REST response envelope — PayloadTime, GetPayload, ListPayload, BatchPayload, SuccessPayload, and the Payload union, with a note on the v2 vs v3 envelope status.",{"title":369,"path":370,"stem":371,"restApiVersion":15,"category":349,"description":372,"badge":15},"TypeB24","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ftypes-type-b24","docs\u002F2.working-with-the-rest-api\u002F90.types-type-b24","Public contract implemented by every entry-point class (B24Frame, B24Hook, B24OAuth). Single source of truth for the SDK surface.",{"title":374,"path":375,"stem":376,"restApiVersion":15,"category":270,"description":377,"badge":15},"Telemetry","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ftelemetry","docs\u002F2.working-with-the-rest-api\u002F95.telemetry","Request id, SDK version, and SDK type query parameters added to every Bitrix24 REST call.",{"title":379,"path":380,"stem":381,"restApiVersion":15,"category":270,"description":382,"badge":15},"Error Codes","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ferror-codes","docs\u002F2.working-with-the-rest-api\u002F96.error-codes","Codes with a pinned classification — \"hard\" (thrown) and \"soft\" (returned as AjaxError inside AjaxResult) — and the category rule that covers everything else on restApi:v3.",{"title":384,"path":385,"stem":386,"restApiVersion":15,"category":318,"description":387,"badge":15},"HealthCheck","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ftools-health-check","docs\u002F2.working-with-the-rest-api\u002Ftools-health-check","Method for checking the availability of Bitrix24 REST API. Performs a simple request to the REST API to verify service health.",{"title":389,"path":390,"stem":391,"restApiVersion":15,"category":318,"description":392,"badge":15},"Ping","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ftools-ping","docs\u002F2.working-with-the-rest-api\u002Ftools-ping","Method for measuring Bitrix24 REST API response speed. Performs a test request and returns response time in milliseconds.",{"title":394,"path":395,"stem":396,"children":397,"restApiVersion":15,"category":15,"description":15,"badge":15},"API Reference","\u002Fdocs\u002Fapi-reference","docs\u002F3.api-reference\u002F1.index",[398],{"title":394,"path":395,"stem":396,"restApiVersion":15,"category":15,"description":399,"badge":15},"Index of the public @bitrix24\u002Fb24jssdk surface, grouped by domain — every value export, what it is, and where its guide and source live.",{"title":401,"path":402,"stem":403,"children":404,"restApiVersion":15,"category":15,"description":15,"badge":15},"Examples","\u002Fdocs\u002Fexamples","docs\u002F99.examples\u002F0.index",[405,407,413,418,423,428,433,438,443,448,453,458,463,468,473,478,483,488,493,498,503],{"title":89,"path":402,"stem":403,"restApiVersion":15,"category":15,"description":406,"badge":15},"Recipes that pair the SDK with realistic scenarios — CRM analytics, mass messaging, AI assistants, OAuth installs, and more. Each recipe is a single, copy-paste-friendly file.",{"title":408,"path":409,"stem":410,"restApiVersion":15,"category":411,"description":412,"badge":15},"CRM analytics","\u002Fdocs\u002Fexamples\u002Fcrm-analytics","docs\u002F99.examples\u002F1.crm-analytics","examples","Stream all deals via actions.v2.fetchList.make, group by stage, print a funnel report (counts, conversion %, avg ticket, win rate).",{"title":414,"path":415,"stem":416,"restApiVersion":15,"category":411,"description":417,"badge":15},"Deals → CSV","\u002Fdocs\u002Fexamples\u002Fdashboard-deals-csv","docs\u002F99.examples\u002F1.dashboard-deals-csv","Stream every CRM deal that matches a date filter into a CSV file using a webhook and FetchListV2.",{"title":419,"path":420,"stem":421,"restApiVersion":15,"category":15,"description":422,"badge":15},"Entity List","\u002Fdocs\u002Fexamples\u002Fentity-list","docs\u002F99.examples\u002F10.entity-list","Render a paged Bitrix24 entity list with B24UI components and the SDK callList action.",{"title":424,"path":425,"stem":426,"restApiVersion":15,"category":411,"description":427,"badge":15},"Error handling","\u002Fdocs\u002Fexamples\u002Ferror-handling","docs\u002F99.examples\u002F10.error-handling","Demonstrates the four error layers (SdkError \u002F AjaxError \u002F network \u002F soft) and the hardErrorCodes \u002F softErrorCodes \u002F retryOnNetworkError knobs on the restriction manager.",{"title":429,"path":430,"stem":431,"restApiVersion":15,"category":411,"description":432,"badge":15},"Event registration","\u002Fdocs\u002Fexamples\u002Fevent-registration","docs\u002F99.examples\u002F11.event-registration","CLI tool — list, bind, and unbind Bitrix24 outbound webhook events via event.get \u002F event.bind \u002F event.unbind. Pairs with the webhook handler recipe.",{"title":434,"path":435,"stem":436,"restApiVersion":15,"category":411,"description":437,"badge":15},"OAuth install","\u002Fdocs\u002Fexamples\u002Foauth-install","docs\u002F99.examples\u002F12.oauth-install","Express server that handles ONAPPINSTALL \u002F ONAPPUPDATE \u002F ONAPPUNINSTALL events for a Bitrix24 marketplace app, persists tokens per portal, and builds a B24OAuth client on demand with a refresh callback wired to storage.",{"title":439,"path":440,"stem":441,"restApiVersion":15,"category":411,"description":442,"badge":15},"Frame app skeleton","\u002Fdocs\u002Fexamples\u002Fframe-app-skeleton","docs\u002F99.examples\u002F2.frame-app-skeleton","Minimum viable Bitrix24 iframe app: init handshake, set title, persist app state, open a slider, close cleanly.",{"title":444,"path":445,"stem":446,"restApiVersion":15,"category":411,"description":447,"badge":15},"Mass messaging","\u002Fdocs\u002Fexamples\u002Fmass-messaging","docs\u002F99.examples\u002F2.mass-messaging","Filter contacts in CRM, personalise a template, send IM notifications to assigned managers.",{"title":449,"path":450,"stem":451,"restApiVersion":15,"category":15,"description":452,"badge":15},"Installation Wizard","\u002Fdocs\u002Fexamples\u002Fapp-installation-wizard","docs\u002F99.examples\u002F20.app-installation-wizard","Multi-step install flow that creates user fields, registers placements, celebrates with confetti, and finalises the installation last — because the portal reloads the page in response.",{"title":454,"path":455,"stem":456,"restApiVersion":15,"category":411,"description":457,"badge":15},"Task automation","\u002Fdocs\u002Fexamples\u002Ftask-automation","docs\u002F99.examples\u002F3.task-automation","Poll deal stages every 60 s. When a watched transition fires, create a task with description, deadline and priority.",{"title":459,"path":460,"stem":461,"restApiVersion":15,"category":411,"description":462,"badge":15},"Webhook CLI","\u002Fdocs\u002Fexamples\u002Fwebhook-cli-node","docs\u002F99.examples\u002F3.webhook-cli-node","A 30-line Node script that authenticates against a Bitrix24 portal via inbound webhook and prints the calling user — useful as the first thing you run after creating a webhook.",{"title":464,"path":465,"stem":466,"restApiVersion":15,"category":15,"description":467,"badge":15},"Node + Hook Export","\u002Fdocs\u002Fexamples\u002Fnode-hook-company-export","docs\u002F99.examples\u002F30.node-hook-company-export","Export Bitrix24 companies into a CSV file from a pure Node.js script using B24Hook.",{"title":469,"path":470,"stem":471,"restApiVersion":15,"category":411,"description":472,"badge":15},"Bulk update","\u002Fdocs\u002Fexamples\u002Fbulk-update-deals","docs\u002F99.examples\u002F4.bulk-update-deals","Migrate thousands of CRM deals to a new stage using BatchByChunkV2 — automatic chunking, partial-error handling, and a single progress line.",{"title":474,"path":475,"stem":476,"restApiVersion":15,"category":411,"description":477,"badge":15},"ERP sync","\u002Fdocs\u002Fexamples\u002Ferp-sync","docs\u002F99.examples\u002F4.erp-sync","Two-way contact sync between Bitrix24 and an external ERP. Match by INN (primary) or email (fallback). Cron every hour.",{"title":479,"path":480,"stem":481,"restApiVersion":15,"category":411,"description":482,"badge":15},"Disk files","\u002Fdocs\u002Fexamples\u002Fdisk-files","docs\u002F99.examples\u002F5.disk-files","List storages and folder children, create subfolders, inspect files. File upload (multipart) is intentionally out of scope.",{"title":484,"path":485,"stem":486,"restApiVersion":15,"category":411,"description":487,"badge":15},"Pull subscribe","\u002Fdocs\u002Fexamples\u002Fpull-subscribe-frame","docs\u002F99.examples\u002F5.pull-subscribe-frame","Open a live channel from a Bitrix24 frame app and react to push events using useB24Helper + the Pull client.",{"title":489,"path":490,"stem":491,"restApiVersion":15,"category":411,"description":492,"badge":15},"Telegram bot","\u002Fdocs\u002Fexamples\u002Ftelegram-bot","docs\u002F99.examples\u002F6.telegram-bot","Poll new CRM deals every two minutes; notify a Telegram chat with an HTML-formatted card.",{"title":494,"path":495,"stem":496,"restApiVersion":15,"category":411,"description":497,"badge":15},"Webhook handler","\u002Fdocs\u002Fexamples\u002Fwebhook-handler","docs\u002F99.examples\u002F7.webhook-handler","Express server that receives Bitrix24 outbound events, fetches details via REST, dispatches by event name. Always returns 200.",{"title":499,"path":500,"stem":501,"restApiVersion":15,"category":411,"description":502,"badge":15},"AI assistant","\u002Fdocs\u002Fexamples\u002Fai-assistant","docs\u002F99.examples\u002F8.ai-assistant","Load a deal and its activities, ask GPT-4o for the next-best action, create a task bound to the deal with priority and deadline.",{"title":504,"path":505,"stem":506,"restApiVersion":15,"category":411,"description":507,"badge":15},"Web search + LLM","\u002Fdocs\u002Fexamples\u002Fweb-search-llm","docs\u002F99.examples\u002F9.web-search-llm","Two-step RAG: ask any web-search provider, run the result through your LLM with [N] citations, post the answer as a CRM timeline comment on a deal.",{"id":509,"title":510,"audited":511,"badge":15,"body":512,"category":15,"cookbookOrder":15,"description":67,"extension":2174,"featured":47,"links":2175,"meta":2184,"navigation":2185,"path":65,"restApiVersion":15,"scopes":15,"seo":2186,"stack":15,"stem":66,"__hash__":2187},"docs\u002Fdocs\u002F1.getting-started\u002F3.migration\u002F3.within-2x.md","Behaviour changes inside 2.x","2026-09-14",{"type":513,"value":514,"toc":2165},"minimark",[515,519,534,543,550,560,570,595,624,629,695,705,725,770,774,827,842,857,866,885,1187,1196,1200,1223,1238,1256,1286,1297,1600,1634,1647,1664,1676,1752,1758,1777,1806,1821,1826,2083,2116,2129,2133,2161],[516,517,518],"p",{},"The other two guides on this page are about symbols that are removed. This one\nis about the smaller set of changes that removed nothing and still need\nsomething from you: a call that used to return now throws, or a value that used\nto be ignored now means something.",[520,521,522],"note",{},[516,523,524,525,529,530,533],{},"Everything here ships inside the ",[526,527,528],"code",{},"2.x"," line, so ",[526,531,532],{},"pnpm up @bitrix24\u002Fb24jssdk","\npicks it up without a major-version step. That is exactly why it is worth\nreading — nothing about the upgrade signals that behaviour moved.",[535,536,538,539,542],"h2",{"id":537},"_230-a-restapiv3-batch-sends-a-different-request-body","2.3.0 — a ",[526,540,541],{},"restApi:v3"," batch sends a different request body",[516,544,545,549],{},[546,547,548],"strong",{},"What changed."," A v3 batch now puts its commands on the wire as a bare\ntop-level JSON array. It used to send an object with numeric keys, and on an\nOAuth transport it added the access token as one more top-level entry:",[551,552,557],"pre",{"className":553,"code":555,"language":556},[554],"language-text","before (B24Hook)   {\"0\":{…},\"1\":{…}}\nbefore (B24OAuth)  {\"0\":{…},\"1\":{…},\"auth\":\"\u003Caccess token>\"}\nnow                [{…},{…}]\n","text",[526,558,555],{"__ignoreMap":559},"",[516,561,562,563,565,566,569],{},"On a server, ",[526,564,185],{}," sends the token in an ",[526,567,568],{},"Authorization: Bearer"," header\ninstead of in the body.",[516,571,572,575,576,578,579,582,583,586,587,590,591,594],{},[546,573,574],{},"What it fixes."," A v3 batch from ",[526,577,185],{}," never worked at all. The portal\nreads every top-level entry of a batch body as a command and requires ",[526,580,581],{},"method","\nand ",[526,584,585],{},"query"," on each, so the ",[526,588,589],{},"auth"," entry failed the whole batch with\n",[526,592,593],{},"BITRIX_REST_V3_EXCEPTION_INVALIDSELECTEXCEPTION"," before a single command ran. A\nwebhook survived only because PHP cannot tell a JSON list from a map with\nsequential integer keys.",[516,596,597,598,601,602,605,606,609,610,612,613,616,617,620,621,623],{},"The same rule had a second victim, invisible until the first was fixed: a command\nwritten without ",[526,599,600],{},"params"," — ",[526,603,604],{},"{ method: 'rest.scope.list' }",", or the tuple\n",[526,607,608],{},"['rest.scope.list']"," — went out with no ",[526,611,585],{}," key, because ",[526,614,615],{},"JSON.stringify","\ndrops an ",[526,618,619],{},"undefined"," value. That is refused under the same code, and one such\nentry takes the whole batch down with it. Commands now always carry a ",[526,622,585],{},",\nempty if there is nothing to put in it.",[516,625,626],{},[546,627,628],{},"Who is affected.",[630,631,632,648,660,677],"ul",{},[633,634,635,601,640,643,644,647],"li",{},[546,636,637,639],{},[526,638,185],{}," on a server",[526,641,642],{},"actions.v3.batch.make"," and\n",[526,645,646],{},"actions.v3.batchByChunk.make"," start working. Any workaround that looped\nsingle calls can go.",[633,649,650,659],{},[546,651,652,653,655,656,658],{},"A browser — ",[526,654,138],{},", or ",[526,657,185],{}," used client-side"," — the same, with\nthe credential in the query string rather than a header. See the note below.",[633,661,662,665,666,669,670,672,673,676],{},[546,663,664],{},"Anything that inspects the request"," — a reverse proxy, a WAF body rule, an\negress gateway, a recorded HTTP fixture (nock \u002F msw \u002F VCR), or a test that\nasserts on the request body. The body is an array now for ",[546,667,668],{},"every"," transport,\n",[526,671,122],{}," included, even though a webhook batch already worked; and a\nserver-side OAuth batch carries a header it did not carry before. Re-record\nfixtures, and let ",[526,674,675],{},"Authorization"," through the proxy.",[633,678,679,682,683,686,687,690,691,694],{},[546,680,681],{},"Log readers"," — the ",[526,684,685],{},"post\u002Fsend"," line logs the body it sends, so a v3 batch\nnow writes ",[526,688,689],{},"[{…},{…}]"," where it wrote\n",[526,692,693],{},"{\"0\":{…},…,\"auth\":\"***REDACTED***\"}",".",[516,696,697,700,701,704],{},[546,698,699],{},"What to do."," Nothing in your own code. The action arguments and the return\nshape are unchanged, and so is ",[526,702,703],{},"AjaxError.requestInfo.params"," — that has always\ncarried the commands array, not the formatted body.",[516,706,707,708,711,712,715,716,718,719,724],{},"One thing to know if you sit behind a redirect. The header-carrying request is\nsent with ",[526,709,710],{},"maxRedirects: 0",", so it will not follow a 301\u002F302 while holding the\ntoken — ",[526,713,714],{},"follow-redirects"," keeps ",[526,717,675],{}," across a same-host or subdomain\nhop, and the credential in the body was never exposed that way because a\nredirect drops the body. Only that one request is constrained; see\n",[720,721,723],"a",{"href":722},"\u002Fdocs\u002Fworking-with-the-rest-api\u002Fcore-http\u002F#configuring-the-axios-instance","configuring the axios instance","\nif you need to change it.",[520,726,727,752,759,764],{},[516,728,729,732,733,736,737,740,741,744,745,747,748,751],{},[546,730,731],{},"In a browser the token travels in the query string."," The portal answers the\nCORS preflight with ",[526,734,735],{},"Access-Control-Allow-Headers: origin, content-type, accept","\n— no ",[526,738,739],{},"authorization"," — so a browser cannot send the header at all; such a\nrequest would never leave. A v3 batch body is entirely commands, with nowhere\nfor a credential, so the remaining place is the URL: the SDK appends\n",[526,742,743],{},"?auth=\u003Ctoken>"," on this one request shape. The portal reads it through the same\ndictionary as a body ",[526,746,589],{}," (",[526,749,750],{},"CRestUtil::getRequestData()"," merges GET over\nPOST), which is why it works at all.",[516,753,754,755,758],{},"This is the only place the SDK puts an OAuth token in a URL, and it is worth\nknowing what that means: the value reaches the portal's web-server access log\nand, while an administrator has the REST module's diagnostic logger switched on,\nits ",[526,756,757],{},"REQUEST_URI"," field. It does not become visible to anyone who could not\nalready read it — in a frame app the token is in the page's own JavaScript, and\nevery non-batch call carries it in the body — but it does leave a server-side\nrecord that a body would not.",[516,760,761,763],{},[526,762,122],{}," is unaffected: its secret is already in the URL path where the portal\nputs it, so nothing is appended.",[516,765,766,767,769],{},"The day ",[526,768,739],{}," appears in the portal's allow-list, a browser takes the\nsame header path a server takes today and this goes away.",[535,771,773],{"id":772},"_300-every-keyset-walk-now-stops-after-10-000-pages","3.0.0 — every keyset walk now stops after 10 000 pages",[516,775,776,778,779,782,783,786,787,790,791,794,795,798,799,802,803,812,813,818,819,822,823,826],{},[546,777,548],{}," ",[526,780,781],{},"callList"," \u002F ",[526,784,785],{},"fetchList"," (both API versions) and ",[526,788,789],{},"callTail"," \u002F\n",[526,792,793],{},"fetchTail"," (v3) take a ",[526,796,797],{},"maxPages"," ceiling, and it ",[546,800,801],{},"defaults to 10 000",". A walk\nthat reaches it stops with ",[526,804,807],{"className":805,"language":806,"style":559},"language-ts-type shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","ts-type",[808,809,811],"span",{"class":810},"sBMFI","JSSDK_ACTION_MAX_PAGES_EXCEEDED","\nnaming the method. The same walkers also take an ",[526,814,815],{"className":805,"language":806,"style":559},[808,816,817],{"class":810},"AbortSignal","\nas ",[526,820,821],{},"signal",", and the eager ones take a ",[526,824,825],{},"progress"," callback.",[516,828,829,832,833,836,837,841],{},[546,830,831],{},"What it replaces."," An unbounded ",[526,834,835],{},"while (true)",". The stall guard added in 2.3.0\ncatches a cursor that stops moving, but not one that ",[838,839,840],"em",{},"keeps"," moving and never\nends — a filter that matched far more than intended, or a cursor cycling between\ntwo values, which never repeats the immediately preceding one.",[520,843,844],{},[516,845,846,847,852,853,694],{},"The cycling case was taken off the ceiling in 3.0.0, which reports it as\n",[526,848,849],{"className":805,"language":806,"style":559},[808,850,851],{"class":810},"JSSDK_ACTION_CURSOR_WENT_BACKWARDS"," on the first page that\nsteps backwards instead of after ten thousand. What remains for the ceiling is a walk that is genuinely\nlarger than expected, or one whose cursor values the SDK cannot order. See\n",[720,854,856],{"href":855},"\u002Fdocs\u002Fgetting-started\u002Fmigration\u002Fv3\u002F#behaviour-a-cycling-or-backwards-cursor-now-stops-the-walk","Behaviour: a cycling or backwards cursor now stops the walk",[516,858,859,861,862,865],{},[546,860,628],{}," Anyone whose walk legitimately reads more than 10 000 pages\n— 500 000 rows at the default page size of 50. That is past the point where the\neager helpers, which hold every row in memory, are the right tool; but a\n",[838,863,864],{},"streaming"," walk over a table that large used to complete and now stops.",[516,867,868,870,871,873,874,877,878,881,882,694],{},[546,869,699],{}," Nothing, unless you read more than 10 000 pages. If you do, pass\na higher ",[526,872,797],{},". Note that reaching the ceiling does ",[546,875,876],{},"not"," throw away what\nwas read: the eager walkers resolve with the rows they collected and the error\nattached, so the shape to check is ",[526,879,880],{},"isSuccess",", not a ",[526,883,884],{},"catch",[551,886,890],{"className":887,"code":888,"language":889,"meta":559,"style":559},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { B24Hook } from '@bitrix24\u002Fb24jssdk'\n\nconst b24 = B24Hook.fromWebhookUrl('https:\u002F\u002Fyour-portal.bitrix24.ru\u002Frest\u002F1\u002FSECRET')\n\nconst response = await b24.actions.v2.callList.make({\n  method: 'crm.item.list',\n  params: { entityTypeId: 2 },\n  idKey: 'id',\n  customKeyForResult: 'items',\n  maxPages: 40_000\n})\n\nif (!response.isSuccess) {\n  \u002F\u002F The rows are still here — they are correct, merely incomplete.\n  console.warn(response.getErrorMessages(), response.getData().length)\n}\n","ts",[526,891,892,924,931,966,971,1010,1030,1052,1069,1086,1097,1105,1110,1131,1138,1181],{"__ignoreMap":559},[808,893,896,900,904,908,911,914,917,921],{"class":894,"line":895},"line",1,[808,897,899],{"class":898},"s7zQu","import",[808,901,903],{"class":902},"sMK4o"," {",[808,905,907],{"class":906},"sTEyZ"," B24Hook",[808,909,910],{"class":902}," }",[808,912,913],{"class":898}," from",[808,915,916],{"class":902}," '",[808,918,920],{"class":919},"sfazB","@bitrix24\u002Fb24jssdk",[808,922,923],{"class":902},"'\n",[808,925,927],{"class":894,"line":926},2,[808,928,930],{"emptyLinePlaceholder":929},true,"\n",[808,932,934,938,941,944,946,948,952,955,958,961,963],{"class":894,"line":933},3,[808,935,937],{"class":936},"spNyl","const",[808,939,940],{"class":906}," b24 ",[808,942,943],{"class":902},"=",[808,945,907],{"class":906},[808,947,694],{"class":902},[808,949,951],{"class":950},"s2Zo4","fromWebhookUrl",[808,953,954],{"class":906},"(",[808,956,957],{"class":902},"'",[808,959,960],{"class":919},"https:\u002F\u002Fyour-portal.bitrix24.ru\u002Frest\u002F1\u002FSECRET",[808,962,957],{"class":902},[808,964,965],{"class":906},")\n",[808,967,969],{"class":894,"line":968},4,[808,970,930],{"emptyLinePlaceholder":929},[808,972,974,976,979,981,984,987,989,991,993,996,998,1000,1002,1005,1007],{"class":894,"line":973},5,[808,975,937],{"class":936},[808,977,978],{"class":906}," response ",[808,980,943],{"class":902},[808,982,983],{"class":898}," await",[808,985,986],{"class":906}," b24",[808,988,694],{"class":902},[808,990,96],{"class":906},[808,992,694],{"class":902},[808,994,995],{"class":906},"v2",[808,997,694],{"class":902},[808,999,781],{"class":906},[808,1001,694],{"class":902},[808,1003,1004],{"class":950},"make",[808,1006,954],{"class":906},[808,1008,1009],{"class":902},"{\n",[808,1011,1013,1017,1020,1022,1025,1027],{"class":894,"line":1012},6,[808,1014,1016],{"class":1015},"swJcz","  method",[808,1018,1019],{"class":902},":",[808,1021,916],{"class":902},[808,1023,1024],{"class":919},"crm.item.list",[808,1026,957],{"class":902},[808,1028,1029],{"class":902},",\n",[808,1031,1033,1036,1038,1040,1043,1045,1049],{"class":894,"line":1032},7,[808,1034,1035],{"class":1015},"  params",[808,1037,1019],{"class":902},[808,1039,903],{"class":902},[808,1041,1042],{"class":1015}," entityTypeId",[808,1044,1019],{"class":902},[808,1046,1048],{"class":1047},"sbssI"," 2",[808,1050,1051],{"class":902}," },\n",[808,1053,1055,1058,1060,1062,1065,1067],{"class":894,"line":1054},8,[808,1056,1057],{"class":1015},"  idKey",[808,1059,1019],{"class":902},[808,1061,916],{"class":902},[808,1063,1064],{"class":919},"id",[808,1066,957],{"class":902},[808,1068,1029],{"class":902},[808,1070,1072,1075,1077,1079,1082,1084],{"class":894,"line":1071},9,[808,1073,1074],{"class":1015},"  customKeyForResult",[808,1076,1019],{"class":902},[808,1078,916],{"class":902},[808,1080,1081],{"class":919},"items",[808,1083,957],{"class":902},[808,1085,1029],{"class":902},[808,1087,1089,1092,1094],{"class":894,"line":1088},10,[808,1090,1091],{"class":1015},"  maxPages",[808,1093,1019],{"class":902},[808,1095,1096],{"class":1047}," 40_000\n",[808,1098,1100,1103],{"class":894,"line":1099},11,[808,1101,1102],{"class":902},"}",[808,1104,965],{"class":906},[808,1106,1108],{"class":894,"line":1107},12,[808,1109,930],{"emptyLinePlaceholder":929},[808,1111,1113,1116,1118,1121,1124,1126,1129],{"class":894,"line":1112},13,[808,1114,1115],{"class":898},"if",[808,1117,747],{"class":906},[808,1119,1120],{"class":902},"!",[808,1122,1123],{"class":906},"response",[808,1125,694],{"class":902},[808,1127,1128],{"class":906},"isSuccess) ",[808,1130,1009],{"class":902},[808,1132,1134],{"class":894,"line":1133},14,[808,1135,1137],{"class":1136},"sHwdD","  \u002F\u002F The rows are still here — they are correct, merely incomplete.\n",[808,1139,1141,1144,1146,1149,1151,1153,1155,1158,1161,1164,1167,1169,1172,1174,1176,1179],{"class":894,"line":1140},15,[808,1142,1143],{"class":906},"  console",[808,1145,694],{"class":902},[808,1147,1148],{"class":950},"warn",[808,1150,954],{"class":1015},[808,1152,1123],{"class":906},[808,1154,694],{"class":902},[808,1156,1157],{"class":950},"getErrorMessages",[808,1159,1160],{"class":1015},"()",[808,1162,1163],{"class":902},",",[808,1165,1166],{"class":906}," response",[808,1168,694],{"class":902},[808,1170,1171],{"class":950},"getData",[808,1173,1160],{"class":1015},[808,1175,694],{"class":902},[808,1177,1178],{"class":906},"length",[808,1180,965],{"class":1015},[808,1182,1184],{"class":894,"line":1183},16,[808,1185,1186],{"class":902},"}\n",[516,1188,1189,1190,1195],{},"A ceiling that is not a positive integer is refused at call time with\n",[526,1191,1192],{"className":805,"language":806,"style":559},[808,1193,1194],{"class":810},"JSSDK_ACTION_INVALID_MAX_PAGES"," rather than coerced.",[535,1197,1199],{"id":1198},"_230-a-stalled-pagination-cursor-now-throws","2.3.0 — a stalled pagination cursor now throws",[516,1201,1202,778,1204,782,1206,786,1208,790,1210,1212,1213,1218,1219,1222],{},[546,1203,548],{},[526,1205,781],{},[526,1207,785],{},[526,1209,789],{},[526,1211,793],{}," (v3) now raise ",[526,1214,1215],{"className":805,"language":806,"style":559},[808,1216,1217],{"class":810},"SdkError"," with code\n",[526,1220,1221],{},"JSSDK_ACTION_CURSOR_STALLED"," when a full page comes back and the cursor read\nfrom it equals the one just sent. That means the server did not apply the page\ncondition, so the same page will keep arriving.",[516,1224,1225,1227,1228,782,1230,1232,1233,782,1235,1237],{},[546,1226,831],{}," Not an error — a hang. The walk had no way to end: the\npage is full, so no end-of-data check fires. ",[526,1229,785],{},[526,1231,793],{}," yielded\nthe same rows for ever; ",[526,1234,781],{},[526,1236,789],{}," grew an array until the process\nran out of memory.",[520,1239,1240],{},[516,1241,1242,1248,1249,1252,1253,694],{},[546,1243,1244,1245,694],{},"Extended in ",[526,1246,1247],{},"3.0.0"," This check compares the cursor against the one\n",[838,1250,1251],{},"immediately"," preceding it, so a server alternating between two pages slipped\npast it, and a stalled page that happened to be short ended the walk silently.\nBoth are closed by a companion code — see\n",[720,1254,1255],{"href":855},"the 3.0.0 guide",[516,1257,1258,1260,1261,782,1264,1267,1268,778,1271,1274,1275,1278,1279,1281,1282,1285],{},[546,1259,628],{}," Anyone whose ",[526,1262,1263],{},"idKey",[526,1265,1266],{},"cursorIdKey"," pair does not match\nthe method. The measured case is ",[526,1269,1270],{},"restApi:v2",[526,1272,1273],{},"tasks.task.list"," with\n",[526,1276,1277],{},"idKey: 'id'"," and no ",[526,1280,1266],{},": the response spells the id lowercase, the\nfilter accepts it uppercase, so ",[526,1283,1284],{},">id"," matches nothing and is dropped.",[516,1287,1288,1290,1291,1294,1295,1019],{},[546,1289,699],{}," Fix the configuration — that is what the error text tells you —\nand, if you call the eager helpers, add a ",[526,1292,1293],{},"try","\u002F",[526,1296,884],{},[551,1298,1300],{"className":887,"code":1299,"language":889,"meta":559,"style":559},"import { B24Hook, SdkError } from '@bitrix24\u002Fb24jssdk'\n\nconst b24 = B24Hook.fromWebhookUrl('https:\u002F\u002Fyour-portal.bitrix24.ru\u002Frest\u002F1\u002FSECRET')\n\ntry {\n  const response = await b24.actions.v2.callList.make({\n    method: 'tasks.task.list',\n    idKey: 'id', \u002F\u002F the id as the response spells it\n    cursorIdKey: 'ID', \u002F\u002F the field the request sorts and filters by\n    customKeyForResult: 'tasks'\n  })\n  console.log(response.getData())\n} catch (error) {\n  if (error instanceof SdkError && error.code === 'JSSDK_ACTION_CURSOR_STALLED') {\n    \u002F\u002F the walk was repeating one page — nothing collected is worth keeping\n    console.error('pagination is broken for this method, check idKey\u002FcursorIdKey')\n  }\n  else {\n    throw error\n  }\n}\n",[526,1301,1302,1325,1329,1353,1357,1364,1398,1413,1431,1450,1464,1471,1491,1503,1542,1547,1567,1573,1581,1590,1595],{"__ignoreMap":559},[808,1303,1304,1306,1308,1310,1312,1315,1317,1319,1321,1323],{"class":894,"line":895},[808,1305,899],{"class":898},[808,1307,903],{"class":902},[808,1309,907],{"class":906},[808,1311,1163],{"class":902},[808,1313,1314],{"class":906}," SdkError",[808,1316,910],{"class":902},[808,1318,913],{"class":898},[808,1320,916],{"class":902},[808,1322,920],{"class":919},[808,1324,923],{"class":902},[808,1326,1327],{"class":894,"line":926},[808,1328,930],{"emptyLinePlaceholder":929},[808,1330,1331,1333,1335,1337,1339,1341,1343,1345,1347,1349,1351],{"class":894,"line":933},[808,1332,937],{"class":936},[808,1334,940],{"class":906},[808,1336,943],{"class":902},[808,1338,907],{"class":906},[808,1340,694],{"class":902},[808,1342,951],{"class":950},[808,1344,954],{"class":906},[808,1346,957],{"class":902},[808,1348,960],{"class":919},[808,1350,957],{"class":902},[808,1352,965],{"class":906},[808,1354,1355],{"class":894,"line":968},[808,1356,930],{"emptyLinePlaceholder":929},[808,1358,1359,1361],{"class":894,"line":973},[808,1360,1293],{"class":898},[808,1362,1363],{"class":902}," {\n",[808,1365,1366,1369,1371,1374,1376,1378,1380,1382,1384,1386,1388,1390,1392,1394,1396],{"class":894,"line":1012},[808,1367,1368],{"class":936},"  const",[808,1370,1166],{"class":906},[808,1372,1373],{"class":902}," =",[808,1375,983],{"class":898},[808,1377,986],{"class":906},[808,1379,694],{"class":902},[808,1381,96],{"class":906},[808,1383,694],{"class":902},[808,1385,995],{"class":906},[808,1387,694],{"class":902},[808,1389,781],{"class":906},[808,1391,694],{"class":902},[808,1393,1004],{"class":950},[808,1395,954],{"class":1015},[808,1397,1009],{"class":902},[808,1399,1400,1403,1405,1407,1409,1411],{"class":894,"line":1032},[808,1401,1402],{"class":1015},"    method",[808,1404,1019],{"class":902},[808,1406,916],{"class":902},[808,1408,1273],{"class":919},[808,1410,957],{"class":902},[808,1412,1029],{"class":902},[808,1414,1415,1418,1420,1422,1424,1426,1428],{"class":894,"line":1054},[808,1416,1417],{"class":1015},"    idKey",[808,1419,1019],{"class":902},[808,1421,916],{"class":902},[808,1423,1064],{"class":919},[808,1425,957],{"class":902},[808,1427,1163],{"class":902},[808,1429,1430],{"class":1136}," \u002F\u002F the id as the response spells it\n",[808,1432,1433,1436,1438,1440,1443,1445,1447],{"class":894,"line":1071},[808,1434,1435],{"class":1015},"    cursorIdKey",[808,1437,1019],{"class":902},[808,1439,916],{"class":902},[808,1441,1442],{"class":919},"ID",[808,1444,957],{"class":902},[808,1446,1163],{"class":902},[808,1448,1449],{"class":1136}," \u002F\u002F the field the request sorts and filters by\n",[808,1451,1452,1455,1457,1459,1462],{"class":894,"line":1088},[808,1453,1454],{"class":1015},"    customKeyForResult",[808,1456,1019],{"class":902},[808,1458,916],{"class":902},[808,1460,1461],{"class":919},"tasks",[808,1463,923],{"class":902},[808,1465,1466,1469],{"class":894,"line":1099},[808,1467,1468],{"class":902},"  }",[808,1470,965],{"class":1015},[808,1472,1473,1475,1477,1480,1482,1484,1486,1488],{"class":894,"line":1107},[808,1474,1143],{"class":906},[808,1476,694],{"class":902},[808,1478,1479],{"class":950},"log",[808,1481,954],{"class":1015},[808,1483,1123],{"class":906},[808,1485,694],{"class":902},[808,1487,1171],{"class":950},[808,1489,1490],{"class":1015},"())\n",[808,1492,1493,1495,1498,1501],{"class":894,"line":1112},[808,1494,1102],{"class":902},[808,1496,1497],{"class":898}," catch",[808,1499,1500],{"class":906}," (error) ",[808,1502,1009],{"class":902},[808,1504,1505,1508,1510,1513,1516,1518,1521,1524,1526,1528,1531,1533,1535,1537,1540],{"class":894,"line":1133},[808,1506,1507],{"class":898},"  if",[808,1509,747],{"class":1015},[808,1511,1512],{"class":906},"error",[808,1514,1515],{"class":902}," instanceof",[808,1517,1314],{"class":810},[808,1519,1520],{"class":902}," &&",[808,1522,1523],{"class":906}," error",[808,1525,694],{"class":902},[808,1527,526],{"class":906},[808,1529,1530],{"class":902}," ===",[808,1532,916],{"class":902},[808,1534,1221],{"class":919},[808,1536,957],{"class":902},[808,1538,1539],{"class":1015},") ",[808,1541,1009],{"class":902},[808,1543,1544],{"class":894,"line":1140},[808,1545,1546],{"class":1136},"    \u002F\u002F the walk was repeating one page — nothing collected is worth keeping\n",[808,1548,1549,1552,1554,1556,1558,1560,1563,1565],{"class":894,"line":1183},[808,1550,1551],{"class":906},"    console",[808,1553,694],{"class":902},[808,1555,1512],{"class":950},[808,1557,954],{"class":1015},[808,1559,957],{"class":902},[808,1561,1562],{"class":919},"pagination is broken for this method, check idKey\u002FcursorIdKey",[808,1564,957],{"class":902},[808,1566,965],{"class":1015},[808,1568,1570],{"class":894,"line":1569},17,[808,1571,1572],{"class":902},"  }\n",[808,1574,1576,1579],{"class":894,"line":1575},18,[808,1577,1578],{"class":898},"  else",[808,1580,1363],{"class":902},[808,1582,1584,1587],{"class":894,"line":1583},19,[808,1585,1586],{"class":898},"    throw",[808,1588,1589],{"class":906}," error\n",[808,1591,1593],{"class":894,"line":1592},20,[808,1594,1572],{"class":902},[808,1596,1598],{"class":894,"line":1597},21,[808,1599,1186],{"class":902},[1601,1602,1603],"caution",{},[516,1604,1605,1607,1608,1610,1611,1615,1616,1619,1620,1622,1623,1625,1626,1294,1628,1630,1631,1633],{},[526,1606,781],{}," and ",[526,1609,789],{}," are documented elsewhere as methods that return a\n",[526,1612,1613],{"className":805,"language":806,"style":559},[808,1614,288],{"class":810}," rather than throwing. That is still true of ",[546,1617,1618],{},"portal","\nerrors — check ",[526,1621,880],{}," for those. It is not true of the guards that make the\nwalk itself impossible, this one included: those reject the promise. If you have\ncode that awaits ",[526,1624,781],{}," without a ",[526,1627,1293],{},[526,1629,884],{}," because the docs said it\nnever throws, that code needs the ",[526,1632,884],{}," now.",[516,1635,1636,778,1639,782,1641,1643,1644,1646],{},[546,1637,1638],{},"If you stream, the duplicates are already yours.",[526,1640,785],{},[526,1642,793],{},"\nyield each page as it arrives, so by the time this throws your consumer has\nalready seen the repeated page. A ",[526,1645,884],{}," that resumes from the last saved id is\nright for a failed page request and wrong here — roll the persisted chunks back\ninstead.",[516,1648,1649,1652,1653,1656,1657,1660,1661,1663],{},[546,1650,1651],{},"One more shape."," A ",[526,1654,1655],{},"cursorField"," naming an object- or array-valued field is\nnow treated as no cursor at all: the walk logs a ",[526,1658,1659],{},"warning"," and stops, where\nbefore it paged for ever (two distinct references are never equal, so the guard\nalone would not have caught it). Point ",[526,1662,1655],{}," at a scalar.",[535,1665,1667,1668,1671,1672,1675],{"id":1666},"_230-a-v3-aggregate-returns-strings-and-null-over-no-rows","2.3.0 — a v3 ",[526,1669,1670],{},"aggregate"," returns strings, and ",[526,1673,1674],{},"null"," over no rows",[516,1677,1678,778,1680,1685,1686,1705,1706,1751],{},[546,1679,548],{},[526,1681,1682],{"className":805,"language":806,"style":559},[808,1683,1684],{"class":810},"AggregateResultV3"," was\n",[526,1687,1688,1691,1694,1697,1699,1702],{"className":805,"language":806,"style":559},[808,1689,1690],{"class":810},"Record",[808,1692,1693],{"class":902},"\u003C",[808,1695,1696],{"class":810},"string",[808,1698,1163],{"class":902},[808,1700,1701],{"class":810}," number",[808,1703,1704],{"class":902},">"," and is now\n",[526,1707,1708,1711,1713,1715,1717,1720,1722,1725,1727,1729,1731,1733,1735,1738,1741,1743,1745,1748],{"className":805,"language":806,"style":559},[808,1709,1710],{"class":810},"Partial",[808,1712,1693],{"class":902},[808,1714,1690],{"class":810},[808,1716,1693],{"class":902},[808,1718,1719],{"class":810},"AggregateFunctionV3",[808,1721,1163],{"class":902},[808,1723,1724],{"class":810}," Partial",[808,1726,1693],{"class":902},[808,1728,1690],{"class":810},[808,1730,1693],{"class":902},[808,1732,1696],{"class":810},[808,1734,1163],{"class":902},[808,1736,1737],{"class":810}," string",[808,1739,1740],{"class":902}," |",[808,1742,1701],{"class":810},[808,1744,1740],{"class":902},[808,1746,1747],{"class":810}," null",[808,1749,1750],{"class":902},">>>>",".\nThe SDK does not convert the values.",[551,1753,1756],{"className":1754,"code":1755,"language":556},[554],"before  { count: { id: 27 },    sum: { amount: 12345.67 } }   \u002F\u002F what the type claimed\nnow     { count: { id: '27' },  sum: { amount: '12345.6700' } } \u002F\u002F what a portal sends\n",[526,1757,1755],{"__ignoreMap":559},[520,1759,1760],{},[516,1761,1762,1765,1766,1769,1770,1772,1773,1776],{},[526,1763,1764],{},"AggregateV3"," is ",[526,1767,1768],{},"@experimental",", so this correction ships inside the ",[526,1771,528],{}," line\nrather than waiting for a major. In practice it is unlikely to have broken\nanyone: no shipped Bitrix24 module publishes an ",[526,1774,1775],{},"*.aggregate"," action on any of the\nfour portals checked, so there is nothing on a real portal to call it on yet. It is listed here for the callers who\nwrote against the type anyway.",[516,1778,1779,1782,1783,1785,1786,790,1789,1792,1793,1765,1796,1799,1800,1802,1803,1805],{},[546,1780,1781],{},"Why."," The contract had never been measured — no shipped module publishes an\n",[526,1784,1775],{}," action on any of four portals — so it was verified against a module\nwritten for the purpose, reaching the same ",[526,1787,1788],{},"AggregateOrmActionTrait",[526,1790,1791],{},"OrmRepository::getAllWithAggregate()"," every future module will. Values arrive as\nstrings, with the scale the database chose. Over a filter matching no rows,\n",[526,1794,1795],{},"count",[526,1797,1798],{},"'0'"," and every other function is ",[526,1801,1674],{},", because SQL aggregates over\nan empty set are null and only ",[526,1804,1795],{}," has a zero.",[516,1807,1808,1810,1811,1814,1815,1818,1819,694],{},[546,1809,628],{}," Anyone doing arithmetic straight off the result.\n",[526,1812,1813],{},"data.count.id + 1"," concatenates now instead of adding, and a ",[526,1816,1817],{},"?? 0"," written\nagainst a missing key does not catch an explicit ",[526,1820,1674],{},[516,1822,1823,1825],{},[546,1824,699],{}," Convert deliberately, and pick the conversion per field:",[551,1827,1829],{"className":887,"code":1828,"language":889,"meta":559,"style":559},"import { Text } from '@bitrix24\u002Fb24jssdk'\n\nconst response = await $b24.actions.v3.aggregate.make({\n  \u002F\u002F @check-ignore: some.entity.aggregate is a placeholder — no shipped module publishes an *.aggregate action\n  method: 'some.entity.aggregate',\n  select: { count: ['id'], sum: ['amount'] }\n})\n\nif (response.isSuccess) {\n  const data = response.getData()\n  \u002F\u002F A row count is safe through a float.\n  const rows = Text.toNumber(data?.count?.id ?? 0)\n  \u002F\u002F A money total is not — `Text.toNumber` goes through `Number.parseFloat`,\n  \u002F\u002F so `'12345.6700'` loses precision exactly where a ledger cannot afford it.\n  \u002F\u002F Keep the string, or hand it to a decimal library.\n  const total = data?.sum?.amount ?? null\n}\n",[526,1830,1831,1850,1854,1888,1893,1908,1955,1961,1965,1978,1996,2001,2039,2044,2049,2054,2079],{"__ignoreMap":559},[808,1832,1833,1835,1837,1840,1842,1844,1846,1848],{"class":894,"line":895},[808,1834,899],{"class":898},[808,1836,903],{"class":902},[808,1838,1839],{"class":906}," Text",[808,1841,910],{"class":902},[808,1843,913],{"class":898},[808,1845,916],{"class":902},[808,1847,920],{"class":919},[808,1849,923],{"class":902},[808,1851,1852],{"class":894,"line":926},[808,1853,930],{"emptyLinePlaceholder":929},[808,1855,1856,1858,1860,1862,1864,1867,1869,1871,1873,1876,1878,1880,1882,1884,1886],{"class":894,"line":933},[808,1857,937],{"class":936},[808,1859,978],{"class":906},[808,1861,943],{"class":902},[808,1863,983],{"class":898},[808,1865,1866],{"class":906}," $b24",[808,1868,694],{"class":902},[808,1870,96],{"class":906},[808,1872,694],{"class":902},[808,1874,1875],{"class":906},"v3",[808,1877,694],{"class":902},[808,1879,1670],{"class":906},[808,1881,694],{"class":902},[808,1883,1004],{"class":950},[808,1885,954],{"class":906},[808,1887,1009],{"class":902},[808,1889,1890],{"class":894,"line":968},[808,1891,1892],{"class":1136},"  \u002F\u002F @check-ignore: some.entity.aggregate is a placeholder — no shipped module publishes an *.aggregate action\n",[808,1894,1895,1897,1899,1901,1904,1906],{"class":894,"line":973},[808,1896,1016],{"class":1015},[808,1898,1019],{"class":902},[808,1900,916],{"class":902},[808,1902,1903],{"class":919},"some.entity.aggregate",[808,1905,957],{"class":902},[808,1907,1029],{"class":902},[808,1909,1910,1913,1915,1917,1920,1922,1925,1927,1929,1931,1934,1936,1939,1941,1943,1945,1948,1950,1953],{"class":894,"line":1012},[808,1911,1912],{"class":1015},"  select",[808,1914,1019],{"class":902},[808,1916,903],{"class":902},[808,1918,1919],{"class":1015}," count",[808,1921,1019],{"class":902},[808,1923,1924],{"class":906}," [",[808,1926,957],{"class":902},[808,1928,1064],{"class":919},[808,1930,957],{"class":902},[808,1932,1933],{"class":906},"]",[808,1935,1163],{"class":902},[808,1937,1938],{"class":1015}," sum",[808,1940,1019],{"class":902},[808,1942,1924],{"class":906},[808,1944,957],{"class":902},[808,1946,1947],{"class":919},"amount",[808,1949,957],{"class":902},[808,1951,1952],{"class":906},"] ",[808,1954,1186],{"class":902},[808,1956,1957,1959],{"class":894,"line":1032},[808,1958,1102],{"class":902},[808,1960,965],{"class":906},[808,1962,1963],{"class":894,"line":1054},[808,1964,930],{"emptyLinePlaceholder":929},[808,1966,1967,1969,1972,1974,1976],{"class":894,"line":1071},[808,1968,1115],{"class":898},[808,1970,1971],{"class":906}," (response",[808,1973,694],{"class":902},[808,1975,1128],{"class":906},[808,1977,1009],{"class":902},[808,1979,1980,1982,1985,1987,1989,1991,1993],{"class":894,"line":1088},[808,1981,1368],{"class":936},[808,1983,1984],{"class":906}," data",[808,1986,1373],{"class":902},[808,1988,1166],{"class":906},[808,1990,694],{"class":902},[808,1992,1171],{"class":950},[808,1994,1995],{"class":1015},"()\n",[808,1997,1998],{"class":894,"line":1099},[808,1999,2000],{"class":1136},"  \u002F\u002F A row count is safe through a float.\n",[808,2002,2003,2005,2008,2010,2012,2014,2017,2019,2022,2025,2027,2029,2031,2034,2037],{"class":894,"line":1107},[808,2004,1368],{"class":936},[808,2006,2007],{"class":906}," rows",[808,2009,1373],{"class":902},[808,2011,1839],{"class":906},[808,2013,694],{"class":902},[808,2015,2016],{"class":950},"toNumber",[808,2018,954],{"class":1015},[808,2020,2021],{"class":906},"data",[808,2023,2024],{"class":902},"?.",[808,2026,1795],{"class":906},[808,2028,2024],{"class":902},[808,2030,1064],{"class":906},[808,2032,2033],{"class":902}," ??",[808,2035,2036],{"class":1047}," 0",[808,2038,965],{"class":1015},[808,2040,2041],{"class":894,"line":1112},[808,2042,2043],{"class":1136},"  \u002F\u002F A money total is not — `Text.toNumber` goes through `Number.parseFloat`,\n",[808,2045,2046],{"class":894,"line":1133},[808,2047,2048],{"class":1136},"  \u002F\u002F so `'12345.6700'` loses precision exactly where a ledger cannot afford it.\n",[808,2050,2051],{"class":894,"line":1140},[808,2052,2053],{"class":1136},"  \u002F\u002F Keep the string, or hand it to a decimal library.\n",[808,2055,2056,2058,2061,2063,2065,2067,2070,2072,2074,2076],{"class":894,"line":1183},[808,2057,1368],{"class":936},[808,2059,2060],{"class":906}," total",[808,2062,1373],{"class":902},[808,2064,1984],{"class":906},[808,2066,2024],{"class":902},[808,2068,2069],{"class":906},"sum",[808,2071,2024],{"class":902},[808,2073,1947],{"class":906},[808,2075,2033],{"class":902},[808,2077,2078],{"class":902}," null\n",[808,2080,2081],{"class":894,"line":1569},[808,2082,1186],{"class":902},[516,2084,2085,1652,2088,2091,2092,2095,2096,2095,2099,2102,2103,2107,2108,2111,2112,2115],{},[546,2086,2087],{},"One request shape is now refused before it is sent.",[526,2089,2090],{},"select"," naming no\naggregate column at all — ",[526,2093,2094],{},"{}",", ",[526,2097,2098],{},"{ count: [] }",[526,2100,2101],{},"{ count: {} }"," — throws\n",[526,2104,2105],{"className":805,"language":806,"style":559},[808,2106,1217],{"class":810}," with code ",[526,2109,2110],{},"JSSDK_AGGREGATE_V3_EMPTY_SELECT",". The\nportal answers such a request with a bare 500 carrying nothing to act on, after\nthe whole retry budget is spent on a call that was never going to work. An empty\nlist ",[838,2113,2114],{},"beside"," a non-empty one is still sent, because the portal answers it.",[520,2117,2118],{},[516,2119,2120,2122,2123,2125,2126,2128],{},[526,2121,1764],{}," remains ",[526,2124,1768],{},". The framework contract is pinned now, but\nnothing in the product exercises it, so the first module to ship an\n",[526,2127,1775],{}," action may surface behaviour no synthetic caller could. Pin a\nversion if you depend on the exact shape.",[535,2130,2132],{"id":2131},"see-also","See also",[630,2134,2135,2142,2152],{},[633,2136,2137,2141],{},[720,2138,2140],{"href":2139},"\u002Fdocs\u002Fworking-with-the-rest-api\u002Ferror-codes\u002F","Error codes and handling"," — the\nfull table, including what each walker's remedy text names.",[633,2143,2144,2147,2148,2151],{},[720,2145,310],{"href":2146},"\u002Fdocs\u002Fworking-with-the-rest-api\u002Fdiscovering-entity-fields\u002F","\n— before an aggregate call works at all, the field has to be ",[526,2149,2150],{},"filterable",", which\nis not the same as selectable.",[633,2153,2154,2160],{},[720,2155,2159],{"href":2156,"rel":2157},"https:\u002F\u002Fgithub.com\u002Fbitrix24\u002Fb24jssdk\u002Fblob\u002Fmain\u002FCHANGELOG.md",[2158],"nofollow","CHANGELOG"," — every\nchange in the line, not only the ones that need action.",[2162,2163,2164],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":559,"searchDepth":926,"depth":926,"links":2166},[2167,2169,2170,2171,2173],{"id":537,"depth":926,"text":2168},"2.3.0 — a restApi:v3 batch sends a different request body",{"id":772,"depth":926,"text":773},{"id":1198,"depth":926,"text":1199},{"id":1666,"depth":926,"text":2172},"2.3.0 — a v3 aggregate returns strings, and null over no rows",{"id":2131,"depth":926,"text":2132},"md",[2176,2178,2181],{"label":2159,"iconName":2177,"to":2156},"GitHubIcon",{"label":2179,"iconName":2177,"to":2180},"Cursor-stall guard","https:\u002F\u002Fgithub.com\u002Fbitrix24\u002Fb24jssdk\u002Fblob\u002Fmain\u002Fpackages\u002Fjssdk\u002Fsrc\u002Fcore\u002Factions\u002F_cursor-stalled.ts",{"label":2182,"iconName":2177,"to":2183},"Cursor-direction check","https:\u002F\u002Fgithub.com\u002Fbitrix24\u002Fb24jssdk\u002Fblob\u002Fmain\u002Fpackages\u002Fjssdk\u002Fsrc\u002Fcore\u002Factions\u002F_cursor-progress.ts",{},{"title":64},{"title":510,"description":67},"o4SVLuKmcT_wKzphjh-nwe9Wpi1IeAUSyqIvnzEDBD4",{"data":2189,"body":2190},{},{"type":2191,"children":2192},"root",[2193],{"type":2194,"tag":516,"props":2195,"children":2196},"element",{},[2197],{"type":556,"value":67},1789370229729]