{"version":3,"file":"index.cjs","sources":["../../node_modules/axios/lib/helpers/bind.js","../../node_modules/axios/lib/utils.js","../../node_modules/axios/lib/core/AxiosError.js","../../node_modules/axios/lib/helpers/null.js","../../node_modules/axios/lib/helpers/toFormData.js","../../node_modules/axios/lib/helpers/AxiosURLSearchParams.js","../../node_modules/axios/lib/helpers/buildURL.js","../../node_modules/axios/lib/core/InterceptorManager.js","../../node_modules/axios/lib/defaults/transitional.js","../../node_modules/axios/lib/platform/browser/classes/URLSearchParams.js","../../node_modules/axios/lib/platform/browser/classes/FormData.js","../../node_modules/axios/lib/platform/browser/classes/Blob.js","../../node_modules/axios/lib/platform/browser/index.js","../../node_modules/axios/lib/platform/common/utils.js","../../node_modules/axios/lib/platform/index.js","../../node_modules/axios/lib/helpers/toURLEncodedForm.js","../../node_modules/axios/lib/helpers/formDataToJSON.js","../../node_modules/axios/lib/defaults/index.js","../../node_modules/axios/lib/helpers/parseHeaders.js","../../node_modules/axios/lib/core/AxiosHeaders.js","../../node_modules/axios/lib/core/transformData.js","../../node_modules/axios/lib/cancel/isCancel.js","../../node_modules/axios/lib/cancel/CanceledError.js","../../node_modules/axios/lib/core/settle.js","../../node_modules/axios/lib/helpers/parseProtocol.js","../../node_modules/axios/lib/helpers/speedometer.js","../../node_modules/axios/lib/helpers/throttle.js","../../node_modules/axios/lib/helpers/progressEventReducer.js","../../node_modules/axios/lib/helpers/isURLSameOrigin.js","../../node_modules/axios/lib/helpers/cookies.js","../../node_modules/axios/lib/helpers/isAbsoluteURL.js","../../node_modules/axios/lib/helpers/combineURLs.js","../../node_modules/axios/lib/core/buildFullPath.js","../../node_modules/axios/lib/core/mergeConfig.js","../../node_modules/axios/lib/helpers/resolveConfig.js","../../node_modules/axios/lib/adapters/xhr.js","../../node_modules/axios/lib/helpers/composeSignals.js","../../node_modules/axios/lib/helpers/trackStream.js","../../node_modules/axios/lib/adapters/fetch.js","../../node_modules/axios/lib/adapters/adapters.js","../../node_modules/axios/lib/core/dispatchRequest.js","../../node_modules/axios/lib/env/data.js","../../node_modules/axios/lib/helpers/validator.js","../../node_modules/axios/lib/core/Axios.js","../../node_modules/axios/lib/cancel/CancelToken.js","../../node_modules/axios/lib/helpers/spread.js","../../node_modules/axios/lib/helpers/isAxiosError.js","../../node_modules/axios/lib/helpers/HttpStatusCode.js","../../node_modules/axios/lib/axios.js","../../node_modules/axios/index.js","../../src/errors/base-error.ts","../../src/errors/auth-error.ts","../../src/errors/rate-limit-error.ts","../../src/errors/validation-error.ts","../../src/errors/network-error.ts","../../src/errors/promotion-errors.ts","../../src/errors/in-store-pickup-errors.ts","../../src/errors/meta-validation-fail-error.ts","../../src/client/rate-limiter.ts","../../src/config/operation-metadata.ts","../../src/client/retry-handler.ts","../../src/config/general-rate-limits.ts","../../src/config/products-rate-limits.ts","../../src/config/orders-fbs-rate-limits.ts","../../src/config/orders-fbw-rate-limits.ts","../../src/config/orders-dbs-rate-limits.ts","../../src/config/user-management-rate-limits.ts","../../src/config/finances-rate-limits.ts","../../src/config/promotion-rate-limits.ts","../../src/config/tariffs-rate-limits.ts","../../src/config/in-store-pickup-rate-limits.ts","../../src/config/analytics-rate-limits.ts","../../src/config/reports-rate-limits.ts","../../src/config/communications-rate-limits.ts","../../src/config/rate-limits.ts","../../src/client/base-client.ts","../../src/modules/general/index.ts","../../src/utils/deprecation.ts","../../src/modules/products/index.ts","../../src/modules/orders-fbs/index.ts","../../src/modules/orders-fbw/index.ts","../../src/modules/finances/index.ts","../../src/modules/analytics/index.ts","../../src/modules/communications/index.ts","../../src/modules/reports/index.ts","../../src/modules/promotion/index.ts","../../src/modules/tariffs/index.ts","../../src/modules/in-store-pickup/index.ts","../../src/modules/orders-dbs/index.ts","../../src/modules/user-management/index.ts","../../src/utils/classifyReturnReason.ts","../../src/utils/parseMoneyAmount.ts","../../src/modules/returns/index.ts","../../src/utils/calculateSupplyCost.ts","../../src/utils/compareTariffs.ts","../../src/utils/validateRequiredCharacteristics.ts","../../src/utils/validateMergedCardVariants.ts","../../src/utils/enrichReturnsWithType.ts","../../src/utils/classifyFbsReturnCategory.ts","../../src/utils/reconcileBuyoutsAndReturns.ts","../../src/utils/parseMetaValidationFail.ts","../../src/index.ts"],"sourcesContent":["'use strict';\n\nexport default function bind(fn, thisArg) {\n  return function wrap() {\n    return fn.apply(thisArg, arguments);\n  };\n}\n","'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\nconst {iterator, toStringTag} = Symbol;\n\nconst kindOf = (cache => thing => {\n    const str = toString.call(thing);\n    return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n  type = type.toLowerCase();\n  return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n  return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n    && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n  let result;\n  if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n    result = ArrayBuffer.isView(val);\n  } else {\n    result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n  }\n  return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n  if (kindOf(val) !== 'object') {\n    return false;\n  }\n\n  const prototype = getPrototypeOf(val);\n  return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(toStringTag in val) && !(iterator in val);\n}\n\n/**\n * Determine if a value is an empty object (safely handles Buffers)\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an empty object, otherwise false\n */\nconst isEmptyObject = (val) => {\n  // Early return for non-objects or Buffers to prevent RangeError\n  if (!isObject(val) || isBuffer(val)) {\n    return false;\n  }\n\n  try {\n    return Object.keys(val).length === 0 && Object.getPrototypeOf(val) === Object.prototype;\n  } catch (e) {\n    // Fallback for any other objects that might cause RangeError with Object.keys()\n    return false;\n  }\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n  let kind;\n  return thing && (\n    (typeof FormData === 'function' && thing instanceof FormData) || (\n      isFunction(thing.append) && (\n        (kind = kindOf(thing)) === 'formdata' ||\n        // detect form-data instance\n        (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n      )\n    )\n  )\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\nconst [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n  str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n  // Don't bother if no value provided\n  if (obj === null || typeof obj === 'undefined') {\n    return;\n  }\n\n  let i;\n  let l;\n\n  // Force an array if not already something iterable\n  if (typeof obj !== 'object') {\n    /*eslint no-param-reassign:0*/\n    obj = [obj];\n  }\n\n  if (isArray(obj)) {\n    // Iterate over array values\n    for (i = 0, l = obj.length; i < l; i++) {\n      fn.call(null, obj[i], i, obj);\n    }\n  } else {\n    // Buffer check\n    if (isBuffer(obj)) {\n      return;\n    }\n\n    // Iterate over object keys\n    const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n    const len = keys.length;\n    let key;\n\n    for (i = 0; i < len; i++) {\n      key = keys[i];\n      fn.call(null, obj[key], key, obj);\n    }\n  }\n}\n\nfunction findKey(obj, key) {\n  if (isBuffer(obj)){\n    return null;\n  }\n\n  key = key.toLowerCase();\n  const keys = Object.keys(obj);\n  let i = keys.length;\n  let _key;\n  while (i-- > 0) {\n    _key = keys[i];\n    if (key === _key.toLowerCase()) {\n      return _key;\n    }\n  }\n  return null;\n}\n\nconst _global = (() => {\n  /*eslint no-undef:0*/\n  if (typeof globalThis !== \"undefined\") return globalThis;\n  return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n  const {caseless, skipUndefined} = isContextDefined(this) && this || {};\n  const result = {};\n  const assignValue = (val, key) => {\n    const targetKey = caseless && findKey(result, key) || key;\n    if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n      result[targetKey] = merge(result[targetKey], val);\n    } else if (isPlainObject(val)) {\n      result[targetKey] = merge({}, val);\n    } else if (isArray(val)) {\n      result[targetKey] = val.slice();\n    } else if (!skipUndefined || !isUndefined(val)) {\n      result[targetKey] = val;\n    }\n  }\n\n  for (let i = 0, l = arguments.length; i < l; i++) {\n    arguments[i] && forEach(arguments[i], assignValue);\n  }\n  return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n  forEach(b, (val, key) => {\n    if (thisArg && isFunction(val)) {\n      a[key] = bind(val, thisArg);\n    } else {\n      a[key] = val;\n    }\n  }, {allOwnKeys});\n  return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n  if (content.charCodeAt(0) === 0xFEFF) {\n    content = content.slice(1);\n  }\n  return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n  constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n  constructor.prototype.constructor = constructor;\n  Object.defineProperty(constructor, 'super', {\n    value: superConstructor.prototype\n  });\n  props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n  let props;\n  let i;\n  let prop;\n  const merged = {};\n\n  destObj = destObj || {};\n  // eslint-disable-next-line no-eq-null,eqeqeq\n  if (sourceObj == null) return destObj;\n\n  do {\n    props = Object.getOwnPropertyNames(sourceObj);\n    i = props.length;\n    while (i-- > 0) {\n      prop = props[i];\n      if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n        destObj[prop] = sourceObj[prop];\n        merged[prop] = true;\n      }\n    }\n    sourceObj = filter !== false && getPrototypeOf(sourceObj);\n  } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n  return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n  str = String(str);\n  if (position === undefined || position > str.length) {\n    position = str.length;\n  }\n  position -= searchString.length;\n  const lastIndex = str.indexOf(searchString, position);\n  return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n  if (!thing) return null;\n  if (isArray(thing)) return thing;\n  let i = thing.length;\n  if (!isNumber(i)) return null;\n  const arr = new Array(i);\n  while (i-- > 0) {\n    arr[i] = thing[i];\n  }\n  return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n  // eslint-disable-next-line func-names\n  return thing => {\n    return TypedArray && thing instanceof TypedArray;\n  };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n  const generator = obj && obj[iterator];\n\n  const _iterator = generator.call(obj);\n\n  let result;\n\n  while ((result = _iterator.next()) && !result.done) {\n    const pair = result.value;\n    fn.call(obj, pair[0], pair[1]);\n  }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */\nconst matchAll = (regExp, str) => {\n  let matches;\n  const arr = [];\n\n  while ((matches = regExp.exec(str)) !== null) {\n    arr.push(matches);\n  }\n\n  return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n  return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n    function replacer(m, p1, p2) {\n      return p1.toUpperCase() + p2;\n    }\n  );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n  const descriptors = Object.getOwnPropertyDescriptors(obj);\n  const reducedDescriptors = {};\n\n  forEach(descriptors, (descriptor, name) => {\n    let ret;\n    if ((ret = reducer(descriptor, name, obj)) !== false) {\n      reducedDescriptors[name] = ret || descriptor;\n    }\n  });\n\n  Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n  reduceDescriptors(obj, (descriptor, name) => {\n    // skip restricted props in strict mode\n    if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n      return false;\n    }\n\n    const value = obj[name];\n\n    if (!isFunction(value)) return;\n\n    descriptor.enumerable = false;\n\n    if ('writable' in descriptor) {\n      descriptor.writable = false;\n      return;\n    }\n\n    if (!descriptor.set) {\n      descriptor.set = () => {\n        throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n      };\n    }\n  });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n  const obj = {};\n\n  const define = (arr) => {\n    arr.forEach(value => {\n      obj[value] = true;\n    });\n  }\n\n  isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n  return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n  return value != null && Number.isFinite(value = +value) ? value : defaultValue;\n}\n\n\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n  return !!(thing && isFunction(thing.append) && thing[toStringTag] === 'FormData' && thing[iterator]);\n}\n\nconst toJSONObject = (obj) => {\n  const stack = new Array(10);\n\n  const visit = (source, i) => {\n\n    if (isObject(source)) {\n      if (stack.indexOf(source) >= 0) {\n        return;\n      }\n\n      //Buffer check\n      if (isBuffer(source)) {\n        return source;\n      }\n\n      if(!('toJSON' in source)) {\n        stack[i] = source;\n        const target = isArray(source) ? [] : {};\n\n        forEach(source, (value, key) => {\n          const reducedValue = visit(value, i + 1);\n          !isUndefined(reducedValue) && (target[key] = reducedValue);\n        });\n\n        stack[i] = undefined;\n\n        return target;\n      }\n    }\n\n    return source;\n  }\n\n  return visit(obj, 0);\n}\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n  thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\n// original code\n// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34\n\nconst _setImmediate = ((setImmediateSupported, postMessageSupported) => {\n  if (setImmediateSupported) {\n    return setImmediate;\n  }\n\n  return postMessageSupported ? ((token, callbacks) => {\n    _global.addEventListener(\"message\", ({source, data}) => {\n      if (source === _global && data === token) {\n        callbacks.length && callbacks.shift()();\n      }\n    }, false);\n\n    return (cb) => {\n      callbacks.push(cb);\n      _global.postMessage(token, \"*\");\n    }\n  })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);\n})(\n  typeof setImmediate === 'function',\n  isFunction(_global.postMessage)\n);\n\nconst asap = typeof queueMicrotask !== 'undefined' ?\n  queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate);\n\n// *********************\n\n\nconst isIterable = (thing) => thing != null && isFunction(thing[iterator]);\n\n\nexport default {\n  isArray,\n  isArrayBuffer,\n  isBuffer,\n  isFormData,\n  isArrayBufferView,\n  isString,\n  isNumber,\n  isBoolean,\n  isObject,\n  isPlainObject,\n  isEmptyObject,\n  isReadableStream,\n  isRequest,\n  isResponse,\n  isHeaders,\n  isUndefined,\n  isDate,\n  isFile,\n  isBlob,\n  isRegExp,\n  isFunction,\n  isStream,\n  isURLSearchParams,\n  isTypedArray,\n  isFileList,\n  forEach,\n  merge,\n  extend,\n  trim,\n  stripBOM,\n  inherits,\n  toFlatObject,\n  kindOf,\n  kindOfTest,\n  endsWith,\n  toArray,\n  forEachEntry,\n  matchAll,\n  isHTMLForm,\n  hasOwnProperty,\n  hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n  reduceDescriptors,\n  freezeMethods,\n  toObjectSet,\n  toCamelCase,\n  noop,\n  toFiniteNumber,\n  findKey,\n  global: _global,\n  isContextDefined,\n  isSpecCompliantForm,\n  toJSONObject,\n  isAsyncFn,\n  isThenable,\n  setImmediate: _setImmediate,\n  asap,\n  isIterable\n};\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n  Error.call(this);\n\n  if (Error.captureStackTrace) {\n    Error.captureStackTrace(this, this.constructor);\n  } else {\n    this.stack = (new Error()).stack;\n  }\n\n  this.message = message;\n  this.name = 'AxiosError';\n  code && (this.code = code);\n  config && (this.config = config);\n  request && (this.request = request);\n  if (response) {\n    this.response = response;\n    this.status = response.status ? response.status : null;\n  }\n}\n\nutils.inherits(AxiosError, Error, {\n  toJSON: function toJSON() {\n    return {\n      // Standard\n      message: this.message,\n      name: this.name,\n      // Microsoft\n      description: this.description,\n      number: this.number,\n      // Mozilla\n      fileName: this.fileName,\n      lineNumber: this.lineNumber,\n      columnNumber: this.columnNumber,\n      stack: this.stack,\n      // Axios\n      config: utils.toJSONObject(this.config),\n      code: this.code,\n      status: this.status\n    };\n  }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n  'ERR_BAD_OPTION_VALUE',\n  'ERR_BAD_OPTION',\n  'ECONNABORTED',\n  'ETIMEDOUT',\n  'ERR_NETWORK',\n  'ERR_FR_TOO_MANY_REDIRECTS',\n  'ERR_DEPRECATED',\n  'ERR_BAD_RESPONSE',\n  'ERR_BAD_REQUEST',\n  'ERR_CANCELED',\n  'ERR_NOT_SUPPORT',\n  'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n  descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n  const axiosError = Object.create(prototype);\n\n  utils.toFlatObject(error, axiosError, function filter(obj) {\n    return obj !== Error.prototype;\n  }, prop => {\n    return prop !== 'isAxiosError';\n  });\n\n  const msg = error && error.message ? error.message : 'Error';\n\n  // Prefer explicit code; otherwise copy the low-level error's code (e.g. ECONNREFUSED)\n  const errCode = code == null && error ? error.code : code;\n  AxiosError.call(axiosError, msg, errCode, config, request, response);\n\n  // Chain the original error on the standard field; non-enumerable to avoid JSON noise\n  if (error && axiosError.cause == null) {\n    Object.defineProperty(axiosError, 'cause', { value: error, configurable: true });\n  }\n\n  axiosError.name = (error && error.name) || 'Error';\n\n  customProps && Object.assign(axiosError, customProps);\n\n  return axiosError;\n};\n\nexport default AxiosError;\n","// eslint-disable-next-line strict\nexport default null;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\nimport PlatformFormData from '../platform/node/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n  return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n  return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n  if (!path) return key;\n  return path.concat(key).map(function each(token, i) {\n    // eslint-disable-next-line no-param-reassign\n    token = removeBrackets(token);\n    return !dots && i ? '[' + token + ']' : token;\n  }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n  return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n  return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n  if (!utils.isObject(obj)) {\n    throw new TypeError('target must be an object');\n  }\n\n  // eslint-disable-next-line no-param-reassign\n  formData = formData || new (PlatformFormData || FormData)();\n\n  // eslint-disable-next-line no-param-reassign\n  options = utils.toFlatObject(options, {\n    metaTokens: true,\n    dots: false,\n    indexes: false\n  }, false, function defined(option, source) {\n    // eslint-disable-next-line no-eq-null,eqeqeq\n    return !utils.isUndefined(source[option]);\n  });\n\n  const metaTokens = options.metaTokens;\n  // eslint-disable-next-line no-use-before-define\n  const visitor = options.visitor || defaultVisitor;\n  const dots = options.dots;\n  const indexes = options.indexes;\n  const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n  const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n  if (!utils.isFunction(visitor)) {\n    throw new TypeError('visitor must be a function');\n  }\n\n  function convertValue(value) {\n    if (value === null) return '';\n\n    if (utils.isDate(value)) {\n      return value.toISOString();\n    }\n\n    if (utils.isBoolean(value)) {\n      return value.toString();\n    }\n\n    if (!useBlob && utils.isBlob(value)) {\n      throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n    }\n\n    if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n      return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n    }\n\n    return value;\n  }\n\n  /**\n   * Default visitor.\n   *\n   * @param {*} value\n   * @param {String|Number} key\n   * @param {Array<String|Number>} path\n   * @this {FormData}\n   *\n   * @returns {boolean} return true to visit the each prop of the value recursively\n   */\n  function defaultVisitor(value, key, path) {\n    let arr = value;\n\n    if (value && !path && typeof value === 'object') {\n      if (utils.endsWith(key, '{}')) {\n        // eslint-disable-next-line no-param-reassign\n        key = metaTokens ? key : key.slice(0, -2);\n        // eslint-disable-next-line no-param-reassign\n        value = JSON.stringify(value);\n      } else if (\n        (utils.isArray(value) && isFlatArray(value)) ||\n        ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\n        )) {\n        // eslint-disable-next-line no-param-reassign\n        key = removeBrackets(key);\n\n        arr.forEach(function each(el, index) {\n          !(utils.isUndefined(el) || el === null) && formData.append(\n            // eslint-disable-next-line no-nested-ternary\n            indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n            convertValue(el)\n          );\n        });\n        return false;\n      }\n    }\n\n    if (isVisitable(value)) {\n      return true;\n    }\n\n    formData.append(renderKey(path, key, dots), convertValue(value));\n\n    return false;\n  }\n\n  const stack = [];\n\n  const exposedHelpers = Object.assign(predicates, {\n    defaultVisitor,\n    convertValue,\n    isVisitable\n  });\n\n  function build(value, path) {\n    if (utils.isUndefined(value)) return;\n\n    if (stack.indexOf(value) !== -1) {\n      throw Error('Circular reference detected in ' + path.join('.'));\n    }\n\n    stack.push(value);\n\n    utils.forEach(value, function each(el, key) {\n      const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n        formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n      );\n\n      if (result === true) {\n        build(el, path ? path.concat(key) : [key]);\n      }\n    });\n\n    stack.pop();\n  }\n\n  if (!utils.isObject(obj)) {\n    throw new TypeError('data must be an object');\n  }\n\n  build(obj);\n\n  return formData;\n}\n\nexport default toFormData;\n","'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n  const charMap = {\n    '!': '%21',\n    \"'\": '%27',\n    '(': '%28',\n    ')': '%29',\n    '~': '%7E',\n    '%20': '+',\n    '%00': '\\x00'\n  };\n  return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n    return charMap[match];\n  });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n  this._pairs = [];\n\n  params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n  this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n  const _encode = encoder ? function(value) {\n    return encoder.call(this, value, encode);\n  } : encode;\n\n  return this._pairs.map(function each(pair) {\n    return _encode(pair[0]) + '=' + _encode(pair[1]);\n  }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n  return encodeURIComponent(val).\n    replace(/%3A/gi, ':').\n    replace(/%24/g, '$').\n    replace(/%2C/gi, ',').\n    replace(/%20/g, '+');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?(object|Function)} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n  /*eslint no-param-reassign:0*/\n  if (!params) {\n    return url;\n  }\n  \n  const _encode = options && options.encode || encode;\n\n  if (utils.isFunction(options)) {\n    options = {\n      serialize: options\n    };\n  } \n\n  const serializeFn = options && options.serialize;\n\n  let serializedParams;\n\n  if (serializeFn) {\n    serializedParams = serializeFn(params, options);\n  } else {\n    serializedParams = utils.isURLSearchParams(params) ?\n      params.toString() :\n      new AxiosURLSearchParams(params, options).toString(_encode);\n  }\n\n  if (serializedParams) {\n    const hashmarkIndex = url.indexOf(\"#\");\n\n    if (hashmarkIndex !== -1) {\n      url = url.slice(0, hashmarkIndex);\n    }\n    url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n  }\n\n  return url;\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n  constructor() {\n    this.handlers = [];\n  }\n\n  /**\n   * Add a new interceptor to the stack\n   *\n   * @param {Function} fulfilled The function to handle `then` for a `Promise`\n   * @param {Function} rejected The function to handle `reject` for a `Promise`\n   *\n   * @return {Number} An ID used to remove interceptor later\n   */\n  use(fulfilled, rejected, options) {\n    this.handlers.push({\n      fulfilled,\n      rejected,\n      synchronous: options ? options.synchronous : false,\n      runWhen: options ? options.runWhen : null\n    });\n    return this.handlers.length - 1;\n  }\n\n  /**\n   * Remove an interceptor from the stack\n   *\n   * @param {Number} id The ID that was returned by `use`\n   *\n   * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n   */\n  eject(id) {\n    if (this.handlers[id]) {\n      this.handlers[id] = null;\n    }\n  }\n\n  /**\n   * Clear all interceptors from the stack\n   *\n   * @returns {void}\n   */\n  clear() {\n    if (this.handlers) {\n      this.handlers = [];\n    }\n  }\n\n  /**\n   * Iterate over all the registered interceptors\n   *\n   * This method is particularly useful for skipping over any\n   * interceptors that may have become `null` calling `eject`.\n   *\n   * @param {Function} fn The function to call for each interceptor\n   *\n   * @returns {void}\n   */\n  forEach(fn) {\n    utils.forEach(this.handlers, function forEachHandler(h) {\n      if (h !== null) {\n        fn(h);\n      }\n    });\n  }\n}\n\nexport default InterceptorManager;\n","'use strict';\n\nexport default {\n  silentJSONParsing: true,\n  forcedJSONParsing: true,\n  clarifyTimeoutError: false\n};\n","'use strict';\n\nimport AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';\nexport default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n","'use strict';\n\nexport default typeof FormData !== 'undefined' ? FormData : null;\n","'use strict'\n\nexport default typeof Blob !== 'undefined' ? Blob : null\n","import URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\nimport Blob from './classes/Blob.js'\n\nexport default {\n  isBrowser: true,\n  classes: {\n    URLSearchParams,\n    FormData,\n    Blob\n  },\n  protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n","const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nconst _navigator = typeof navigator === 'object' && navigator || undefined;\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n *  typeof window -> undefined\n *  typeof document -> undefined\n *\n * react-native:\n *  navigator.product -> 'ReactNative'\n * nativescript\n *  navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = hasBrowserEnv &&\n  (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n  return (\n    typeof WorkerGlobalScope !== 'undefined' &&\n    // eslint-disable-next-line no-undef\n    self instanceof WorkerGlobalScope &&\n    typeof self.importScripts === 'function'\n  );\n})();\n\nconst origin = hasBrowserEnv && window.location.href || 'http://localhost';\n\nexport {\n  hasBrowserEnv,\n  hasStandardBrowserWebWorkerEnv,\n  hasStandardBrowserEnv,\n  _navigator as navigator,\n  origin\n}\n","import platform from './node/index.js';\nimport * as utils from './common/utils.js';\n\nexport default {\n  ...utils,\n  ...platform\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n  return toFormData(data, new platform.classes.URLSearchParams(), {\n    visitor: function(value, key, path, helpers) {\n      if (platform.isNode && utils.isBuffer(value)) {\n        this.append(key, value.toString('base64'));\n        return false;\n      }\n\n      return helpers.defaultVisitor.apply(this, arguments);\n    },\n    ...options\n  });\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n  // foo[x][y][z]\n  // foo.x.y.z\n  // foo-x-y-z\n  // foo x y z\n  return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n    return match[0] === '[]' ? '' : match[1] || match[0];\n  });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n  const obj = {};\n  const keys = Object.keys(arr);\n  let i;\n  const len = keys.length;\n  let key;\n  for (i = 0; i < len; i++) {\n    key = keys[i];\n    obj[key] = arr[key];\n  }\n  return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n  function buildPath(path, value, target, index) {\n    let name = path[index++];\n\n    if (name === '__proto__') return true;\n\n    const isNumericKey = Number.isFinite(+name);\n    const isLast = index >= path.length;\n    name = !name && utils.isArray(target) ? target.length : name;\n\n    if (isLast) {\n      if (utils.hasOwnProp(target, name)) {\n        target[name] = [target[name], value];\n      } else {\n        target[name] = value;\n      }\n\n      return !isNumericKey;\n    }\n\n    if (!target[name] || !utils.isObject(target[name])) {\n      target[name] = [];\n    }\n\n    const result = buildPath(path, value, target[name], index);\n\n    if (result && utils.isArray(target[name])) {\n      target[name] = arrayToObject(target[name]);\n    }\n\n    return !isNumericKey;\n  }\n\n  if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n    const obj = {};\n\n    utils.forEachEntry(formData, (name, value) => {\n      buildPath(parsePropPath(name), value, obj, 0);\n    });\n\n    return obj;\n  }\n\n  return null;\n}\n\nexport default formDataToJSON;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n  if (utils.isString(rawValue)) {\n    try {\n      (parser || JSON.parse)(rawValue);\n      return utils.trim(rawValue);\n    } catch (e) {\n      if (e.name !== 'SyntaxError') {\n        throw e;\n      }\n    }\n  }\n\n  return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n  transitional: transitionalDefaults,\n\n  adapter: ['xhr', 'http', 'fetch'],\n\n  transformRequest: [function transformRequest(data, headers) {\n    const contentType = headers.getContentType() || '';\n    const hasJSONContentType = contentType.indexOf('application/json') > -1;\n    const isObjectPayload = utils.isObject(data);\n\n    if (isObjectPayload && utils.isHTMLForm(data)) {\n      data = new FormData(data);\n    }\n\n    const isFormData = utils.isFormData(data);\n\n    if (isFormData) {\n      return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n    }\n\n    if (utils.isArrayBuffer(data) ||\n      utils.isBuffer(data) ||\n      utils.isStream(data) ||\n      utils.isFile(data) ||\n      utils.isBlob(data) ||\n      utils.isReadableStream(data)\n    ) {\n      return data;\n    }\n    if (utils.isArrayBufferView(data)) {\n      return data.buffer;\n    }\n    if (utils.isURLSearchParams(data)) {\n      headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n      return data.toString();\n    }\n\n    let isFileList;\n\n    if (isObjectPayload) {\n      if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n        return toURLEncodedForm(data, this.formSerializer).toString();\n      }\n\n      if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n        const _FormData = this.env && this.env.FormData;\n\n        return toFormData(\n          isFileList ? {'files[]': data} : data,\n          _FormData && new _FormData(),\n          this.formSerializer\n        );\n      }\n    }\n\n    if (isObjectPayload || hasJSONContentType ) {\n      headers.setContentType('application/json', false);\n      return stringifySafely(data);\n    }\n\n    return data;\n  }],\n\n  transformResponse: [function transformResponse(data) {\n    const transitional = this.transitional || defaults.transitional;\n    const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n    const JSONRequested = this.responseType === 'json';\n\n    if (utils.isResponse(data) || utils.isReadableStream(data)) {\n      return data;\n    }\n\n    if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n      const silentJSONParsing = transitional && transitional.silentJSONParsing;\n      const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n      try {\n        return JSON.parse(data, this.parseReviver);\n      } catch (e) {\n        if (strictJSONParsing) {\n          if (e.name === 'SyntaxError') {\n            throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n          }\n          throw e;\n        }\n      }\n    }\n\n    return data;\n  }],\n\n  /**\n   * A timeout in milliseconds to abort a request. If set to 0 (default) a\n   * timeout is not created.\n   */\n  timeout: 0,\n\n  xsrfCookieName: 'XSRF-TOKEN',\n  xsrfHeaderName: 'X-XSRF-TOKEN',\n\n  maxContentLength: -1,\n  maxBodyLength: -1,\n\n  env: {\n    FormData: platform.classes.FormData,\n    Blob: platform.classes.Blob\n  },\n\n  validateStatus: function validateStatus(status) {\n    return status >= 200 && status < 300;\n  },\n\n  headers: {\n    common: {\n      'Accept': 'application/json, text/plain, */*',\n      'Content-Type': undefined\n    }\n  }\n};\n\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n  defaults.headers[method] = {};\n});\n\nexport default defaults;\n","'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n  'age', 'authorization', 'content-length', 'content-type', 'etag',\n  'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n  'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n  'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n  const parsed = {};\n  let key;\n  let val;\n  let i;\n\n  rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n    i = line.indexOf(':');\n    key = line.substring(0, i).trim().toLowerCase();\n    val = line.substring(i + 1).trim();\n\n    if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n      return;\n    }\n\n    if (key === 'set-cookie') {\n      if (parsed[key]) {\n        parsed[key].push(val);\n      } else {\n        parsed[key] = [val];\n      }\n    } else {\n      parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n    }\n  });\n\n  return parsed;\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n  return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n  if (value === false || value == null) {\n    return value;\n  }\n\n  return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n  const tokens = Object.create(null);\n  const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n  let match;\n\n  while ((match = tokensRE.exec(str))) {\n    tokens[match[1]] = match[2];\n  }\n\n  return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n  if (utils.isFunction(filter)) {\n    return filter.call(this, value, header);\n  }\n\n  if (isHeaderNameFilter) {\n    value = header;\n  }\n\n  if (!utils.isString(value)) return;\n\n  if (utils.isString(filter)) {\n    return value.indexOf(filter) !== -1;\n  }\n\n  if (utils.isRegExp(filter)) {\n    return filter.test(value);\n  }\n}\n\nfunction formatHeader(header) {\n  return header.trim()\n    .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n      return char.toUpperCase() + str;\n    });\n}\n\nfunction buildAccessors(obj, header) {\n  const accessorName = utils.toCamelCase(' ' + header);\n\n  ['get', 'set', 'has'].forEach(methodName => {\n    Object.defineProperty(obj, methodName + accessorName, {\n      value: function(arg1, arg2, arg3) {\n        return this[methodName].call(this, header, arg1, arg2, arg3);\n      },\n      configurable: true\n    });\n  });\n}\n\nclass AxiosHeaders {\n  constructor(headers) {\n    headers && this.set(headers);\n  }\n\n  set(header, valueOrRewrite, rewrite) {\n    const self = this;\n\n    function setHeader(_value, _header, _rewrite) {\n      const lHeader = normalizeHeader(_header);\n\n      if (!lHeader) {\n        throw new Error('header name must be a non-empty string');\n      }\n\n      const key = utils.findKey(self, lHeader);\n\n      if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n        self[key || _header] = normalizeValue(_value);\n      }\n    }\n\n    const setHeaders = (headers, _rewrite) =>\n      utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n    if (utils.isPlainObject(header) || header instanceof this.constructor) {\n      setHeaders(header, valueOrRewrite)\n    } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n      setHeaders(parseHeaders(header), valueOrRewrite);\n    } else if (utils.isObject(header) && utils.isIterable(header)) {\n      let obj = {}, dest, key;\n      for (const entry of header) {\n        if (!utils.isArray(entry)) {\n          throw TypeError('Object iterator must return a key-value pair');\n        }\n\n        obj[key = entry[0]] = (dest = obj[key]) ?\n          (utils.isArray(dest) ? [...dest, entry[1]] : [dest, entry[1]]) : entry[1];\n      }\n\n      setHeaders(obj, valueOrRewrite)\n    } else {\n      header != null && setHeader(valueOrRewrite, header, rewrite);\n    }\n\n    return this;\n  }\n\n  get(header, parser) {\n    header = normalizeHeader(header);\n\n    if (header) {\n      const key = utils.findKey(this, header);\n\n      if (key) {\n        const value = this[key];\n\n        if (!parser) {\n          return value;\n        }\n\n        if (parser === true) {\n          return parseTokens(value);\n        }\n\n        if (utils.isFunction(parser)) {\n          return parser.call(this, value, key);\n        }\n\n        if (utils.isRegExp(parser)) {\n          return parser.exec(value);\n        }\n\n        throw new TypeError('parser must be boolean|regexp|function');\n      }\n    }\n  }\n\n  has(header, matcher) {\n    header = normalizeHeader(header);\n\n    if (header) {\n      const key = utils.findKey(this, header);\n\n      return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n    }\n\n    return false;\n  }\n\n  delete(header, matcher) {\n    const self = this;\n    let deleted = false;\n\n    function deleteHeader(_header) {\n      _header = normalizeHeader(_header);\n\n      if (_header) {\n        const key = utils.findKey(self, _header);\n\n        if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n          delete self[key];\n\n          deleted = true;\n        }\n      }\n    }\n\n    if (utils.isArray(header)) {\n      header.forEach(deleteHeader);\n    } else {\n      deleteHeader(header);\n    }\n\n    return deleted;\n  }\n\n  clear(matcher) {\n    const keys = Object.keys(this);\n    let i = keys.length;\n    let deleted = false;\n\n    while (i--) {\n      const key = keys[i];\n      if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n        delete this[key];\n        deleted = true;\n      }\n    }\n\n    return deleted;\n  }\n\n  normalize(format) {\n    const self = this;\n    const headers = {};\n\n    utils.forEach(this, (value, header) => {\n      const key = utils.findKey(headers, header);\n\n      if (key) {\n        self[key] = normalizeValue(value);\n        delete self[header];\n        return;\n      }\n\n      const normalized = format ? formatHeader(header) : String(header).trim();\n\n      if (normalized !== header) {\n        delete self[header];\n      }\n\n      self[normalized] = normalizeValue(value);\n\n      headers[normalized] = true;\n    });\n\n    return this;\n  }\n\n  concat(...targets) {\n    return this.constructor.concat(this, ...targets);\n  }\n\n  toJSON(asStrings) {\n    const obj = Object.create(null);\n\n    utils.forEach(this, (value, header) => {\n      value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n    });\n\n    return obj;\n  }\n\n  [Symbol.iterator]() {\n    return Object.entries(this.toJSON())[Symbol.iterator]();\n  }\n\n  toString() {\n    return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n  }\n\n  getSetCookie() {\n    return this.get(\"set-cookie\") || [];\n  }\n\n  get [Symbol.toStringTag]() {\n    return 'AxiosHeaders';\n  }\n\n  static from(thing) {\n    return thing instanceof this ? thing : new this(thing);\n  }\n\n  static concat(first, ...targets) {\n    const computed = new this(first);\n\n    targets.forEach((target) => computed.set(target));\n\n    return computed;\n  }\n\n  static accessor(header) {\n    const internals = this[$internals] = (this[$internals] = {\n      accessors: {}\n    });\n\n    const accessors = internals.accessors;\n    const prototype = this.prototype;\n\n    function defineAccessor(_header) {\n      const lHeader = normalizeHeader(_header);\n\n      if (!accessors[lHeader]) {\n        buildAccessors(prototype, _header);\n        accessors[lHeader] = true;\n      }\n    }\n\n    utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n    return this;\n  }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n  let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n  return {\n    get: () => value,\n    set(headerValue) {\n      this[mapped] = headerValue;\n    }\n  }\n});\n\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n","'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n  const config = this || defaults;\n  const context = response || config;\n  const headers = AxiosHeaders.from(context.headers);\n  let data = context.data;\n\n  utils.forEach(fns, function transform(fn) {\n    data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n  });\n\n  headers.normalize();\n\n  return data;\n}\n","'use strict';\n\nexport default function isCancel(value) {\n  return !!(value && value.__CANCEL__);\n}\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n  // eslint-disable-next-line no-eq-null,eqeqeq\n  AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n  this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n  __CANCEL__: true\n});\n\nexport default CanceledError;\n","'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n  const validateStatus = response.config.validateStatus;\n  if (!response.status || !validateStatus || validateStatus(response.status)) {\n    resolve(response);\n  } else {\n    reject(new AxiosError(\n      'Request failed with status code ' + response.status,\n      [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n      response.config,\n      response.request,\n      response\n    ));\n  }\n}\n","'use strict';\n\nexport default function parseProtocol(url) {\n  const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n  return match && match[1] || '';\n}\n","'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n  samplesCount = samplesCount || 10;\n  const bytes = new Array(samplesCount);\n  const timestamps = new Array(samplesCount);\n  let head = 0;\n  let tail = 0;\n  let firstSampleTS;\n\n  min = min !== undefined ? min : 1000;\n\n  return function push(chunkLength) {\n    const now = Date.now();\n\n    const startedAt = timestamps[tail];\n\n    if (!firstSampleTS) {\n      firstSampleTS = now;\n    }\n\n    bytes[head] = chunkLength;\n    timestamps[head] = now;\n\n    let i = tail;\n    let bytesCount = 0;\n\n    while (i !== head) {\n      bytesCount += bytes[i++];\n      i = i % samplesCount;\n    }\n\n    head = (head + 1) % samplesCount;\n\n    if (head === tail) {\n      tail = (tail + 1) % samplesCount;\n    }\n\n    if (now - firstSampleTS < min) {\n      return;\n    }\n\n    const passed = startedAt && now - startedAt;\n\n    return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n  };\n}\n\nexport default speedometer;\n","/**\n * Throttle decorator\n * @param {Function} fn\n * @param {Number} freq\n * @return {Function}\n */\nfunction throttle(fn, freq) {\n  let timestamp = 0;\n  let threshold = 1000 / freq;\n  let lastArgs;\n  let timer;\n\n  const invoke = (args, now = Date.now()) => {\n    timestamp = now;\n    lastArgs = null;\n    if (timer) {\n      clearTimeout(timer);\n      timer = null;\n    }\n    fn(...args);\n  }\n\n  const throttled = (...args) => {\n    const now = Date.now();\n    const passed = now - timestamp;\n    if ( passed >= threshold) {\n      invoke(args, now);\n    } else {\n      lastArgs = args;\n      if (!timer) {\n        timer = setTimeout(() => {\n          timer = null;\n          invoke(lastArgs)\n        }, threshold - passed);\n      }\n    }\n  }\n\n  const flush = () => lastArgs && invoke(lastArgs);\n\n  return [throttled, flush];\n}\n\nexport default throttle;\n","import speedometer from \"./speedometer.js\";\nimport throttle from \"./throttle.js\";\nimport utils from \"../utils.js\";\n\nexport const progressEventReducer = (listener, isDownloadStream, freq = 3) => {\n  let bytesNotified = 0;\n  const _speedometer = speedometer(50, 250);\n\n  return throttle(e => {\n    const loaded = e.loaded;\n    const total = e.lengthComputable ? e.total : undefined;\n    const progressBytes = loaded - bytesNotified;\n    const rate = _speedometer(progressBytes);\n    const inRange = loaded <= total;\n\n    bytesNotified = loaded;\n\n    const data = {\n      loaded,\n      total,\n      progress: total ? (loaded / total) : undefined,\n      bytes: progressBytes,\n      rate: rate ? rate : undefined,\n      estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n      event: e,\n      lengthComputable: total != null,\n      [isDownloadStream ? 'download' : 'upload']: true\n    };\n\n    listener(data);\n  }, freq);\n}\n\nexport const progressEventDecorator = (total, throttled) => {\n  const lengthComputable = total != null;\n\n  return [(loaded) => throttled[0]({\n    lengthComputable,\n    total,\n    loaded\n  }), throttled[1]];\n}\n\nexport const asyncDecorator = (fn) => (...args) => utils.asap(() => fn(...args));\n","import platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ? ((origin, isMSIE) => (url) => {\n  url = new URL(url, platform.origin);\n\n  return (\n    origin.protocol === url.protocol &&\n    origin.host === url.host &&\n    (isMSIE || origin.port === url.port)\n  );\n})(\n  new URL(platform.origin),\n  platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)\n) : () => true;\n","import utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n  // Standard browser envs support document.cookie\n  {\n    write(name, value, expires, path, domain, secure) {\n      const cookie = [name + '=' + encodeURIComponent(value)];\n\n      utils.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n\n      utils.isString(path) && cookie.push('path=' + path);\n\n      utils.isString(domain) && cookie.push('domain=' + domain);\n\n      secure === true && cookie.push('secure');\n\n      document.cookie = cookie.join('; ');\n    },\n\n    read(name) {\n      const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n      return (match ? decodeURIComponent(match[3]) : null);\n    },\n\n    remove(name) {\n      this.write(name, '', Date.now() - 86400000);\n    }\n  }\n\n  :\n\n  // Non-standard browser env (web workers, react-native) lack needed support.\n  {\n    write() {},\n    read() {\n      return null;\n    },\n    remove() {}\n  };\n\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n  // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n  // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n  // by any combination of letters, digits, plus, period, or hyphen.\n  return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n  return relativeURL\n    ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n    : baseURL;\n}\n","'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {\n  let isRelativeUrl = !isAbsoluteURL(requestedURL);\n  if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) {\n    return combineURLs(baseURL, requestedURL);\n  }\n  return requestedURL;\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosHeaders from \"./AxiosHeaders.js\";\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? { ...thing } : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n  // eslint-disable-next-line no-param-reassign\n  config2 = config2 || {};\n  const config = {};\n\n  function getMergedValue(target, source, prop, caseless) {\n    if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n      return utils.merge.call({caseless}, target, source);\n    } else if (utils.isPlainObject(source)) {\n      return utils.merge({}, source);\n    } else if (utils.isArray(source)) {\n      return source.slice();\n    }\n    return source;\n  }\n\n  // eslint-disable-next-line consistent-return\n  function mergeDeepProperties(a, b, prop , caseless) {\n    if (!utils.isUndefined(b)) {\n      return getMergedValue(a, b, prop , caseless);\n    } else if (!utils.isUndefined(a)) {\n      return getMergedValue(undefined, a, prop , caseless);\n    }\n  }\n\n  // eslint-disable-next-line consistent-return\n  function valueFromConfig2(a, b) {\n    if (!utils.isUndefined(b)) {\n      return getMergedValue(undefined, b);\n    }\n  }\n\n  // eslint-disable-next-line consistent-return\n  function defaultToConfig2(a, b) {\n    if (!utils.isUndefined(b)) {\n      return getMergedValue(undefined, b);\n    } else if (!utils.isUndefined(a)) {\n      return getMergedValue(undefined, a);\n    }\n  }\n\n  // eslint-disable-next-line consistent-return\n  function mergeDirectKeys(a, b, prop) {\n    if (prop in config2) {\n      return getMergedValue(a, b);\n    } else if (prop in config1) {\n      return getMergedValue(undefined, a);\n    }\n  }\n\n  const mergeMap = {\n    url: valueFromConfig2,\n    method: valueFromConfig2,\n    data: valueFromConfig2,\n    baseURL: defaultToConfig2,\n    transformRequest: defaultToConfig2,\n    transformResponse: defaultToConfig2,\n    paramsSerializer: defaultToConfig2,\n    timeout: defaultToConfig2,\n    timeoutMessage: defaultToConfig2,\n    withCredentials: defaultToConfig2,\n    withXSRFToken: defaultToConfig2,\n    adapter: defaultToConfig2,\n    responseType: defaultToConfig2,\n    xsrfCookieName: defaultToConfig2,\n    xsrfHeaderName: defaultToConfig2,\n    onUploadProgress: defaultToConfig2,\n    onDownloadProgress: defaultToConfig2,\n    decompress: defaultToConfig2,\n    maxContentLength: defaultToConfig2,\n    maxBodyLength: defaultToConfig2,\n    beforeRedirect: defaultToConfig2,\n    transport: defaultToConfig2,\n    httpAgent: defaultToConfig2,\n    httpsAgent: defaultToConfig2,\n    cancelToken: defaultToConfig2,\n    socketPath: defaultToConfig2,\n    responseEncoding: defaultToConfig2,\n    validateStatus: mergeDirectKeys,\n    headers: (a, b , prop) => mergeDeepProperties(headersToObject(a), headersToObject(b),prop, true)\n  };\n\n  utils.forEach(Object.keys({...config1, ...config2}), function computeConfigValue(prop) {\n    const merge = mergeMap[prop] || mergeDeepProperties;\n    const configValue = merge(config1[prop], config2[prop], prop);\n    (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n  });\n\n  return config;\n}\n","import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport isURLSameOrigin from \"./isURLSameOrigin.js\";\nimport cookies from \"./cookies.js\";\nimport buildFullPath from \"../core/buildFullPath.js\";\nimport mergeConfig from \"../core/mergeConfig.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport buildURL from \"./buildURL.js\";\n\nexport default (config) => {\n  const newConfig = mergeConfig({}, config);\n\n  let { data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth } = newConfig;\n\n  newConfig.headers = headers = AxiosHeaders.from(headers);\n\n  newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls), config.params, config.paramsSerializer);\n\n  // HTTP basic authentication\n  if (auth) {\n    headers.set('Authorization', 'Basic ' +\n      btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : ''))\n    );\n  }\n\n  if (utils.isFormData(data)) {\n    if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n      headers.setContentType(undefined); // browser handles it\n    } else if (utils.isFunction(data.getHeaders)) {\n      // Node.js FormData (like form-data package)\n      const formHeaders = data.getHeaders();\n      // Only set safe headers to avoid overwriting security headers\n      const allowedHeaders = ['content-type', 'content-length'];\n      Object.entries(formHeaders).forEach(([key, val]) => {\n        if (allowedHeaders.includes(key.toLowerCase())) {\n          headers.set(key, val);\n        }\n      });\n    }\n  }  \n\n  // Add xsrf header\n  // This is only done if running in a standard browser environment.\n  // Specifically not if we're in a web worker, or react-native.\n\n  if (platform.hasStandardBrowserEnv) {\n    withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));\n\n    if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {\n      // Add xsrf header\n      const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);\n\n      if (xsrfValue) {\n        headers.set(xsrfHeaderName, xsrfValue);\n      }\n    }\n  }\n\n  return newConfig;\n}\n\n","import utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport {progressEventReducer} from '../helpers/progressEventReducer.js';\nimport resolveConfig from \"../helpers/resolveConfig.js\";\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nexport default isXHRAdapterSupported && function (config) {\n  return new Promise(function dispatchXhrRequest(resolve, reject) {\n    const _config = resolveConfig(config);\n    let requestData = _config.data;\n    const requestHeaders = AxiosHeaders.from(_config.headers).normalize();\n    let {responseType, onUploadProgress, onDownloadProgress} = _config;\n    let onCanceled;\n    let uploadThrottled, downloadThrottled;\n    let flushUpload, flushDownload;\n\n    function done() {\n      flushUpload && flushUpload(); // flush events\n      flushDownload && flushDownload(); // flush events\n\n      _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);\n\n      _config.signal && _config.signal.removeEventListener('abort', onCanceled);\n    }\n\n    let request = new XMLHttpRequest();\n\n    request.open(_config.method.toUpperCase(), _config.url, true);\n\n    // Set the request timeout in MS\n    request.timeout = _config.timeout;\n\n    function onloadend() {\n      if (!request) {\n        return;\n      }\n      // Prepare the response\n      const responseHeaders = AxiosHeaders.from(\n        'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n      );\n      const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n        request.responseText : request.response;\n      const response = {\n        data: responseData,\n        status: request.status,\n        statusText: request.statusText,\n        headers: responseHeaders,\n        config,\n        request\n      };\n\n      settle(function _resolve(value) {\n        resolve(value);\n        done();\n      }, function _reject(err) {\n        reject(err);\n        done();\n      }, response);\n\n      // Clean up request\n      request = null;\n    }\n\n    if ('onloadend' in request) {\n      // Use onloadend if available\n      request.onloadend = onloadend;\n    } else {\n      // Listen for ready state to emulate onloadend\n      request.onreadystatechange = function handleLoad() {\n        if (!request || request.readyState !== 4) {\n          return;\n        }\n\n        // The request errored out and we didn't get a response, this will be\n        // handled by onerror instead\n        // With one exception: request that using file: protocol, most browsers\n        // will return status as 0 even though it's a successful request\n        if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n          return;\n        }\n        // readystate handler is calling before onerror or ontimeout handlers,\n        // so we should call onloadend on the next 'tick'\n        setTimeout(onloadend);\n      };\n    }\n\n    // Handle browser request cancellation (as opposed to a manual cancellation)\n    request.onabort = function handleAbort() {\n      if (!request) {\n        return;\n      }\n\n      reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n      // Clean up request\n      request = null;\n    };\n\n    // Handle low level network errors\n  request.onerror = function handleError(event) {\n       // Browsers deliver a ProgressEvent in XHR onerror\n       // (message may be empty; when present, surface it)\n       // See https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/error_event\n       const msg = event && event.message ? event.message : 'Network Error';\n       const err = new AxiosError(msg, AxiosError.ERR_NETWORK, config, request);\n       // attach the underlying event for consumers who want details\n       err.event = event || null;\n       reject(err);\n       request = null;\n    };\n    \n    // Handle timeout\n    request.ontimeout = function handleTimeout() {\n      let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';\n      const transitional = _config.transitional || transitionalDefaults;\n      if (_config.timeoutErrorMessage) {\n        timeoutErrorMessage = _config.timeoutErrorMessage;\n      }\n      reject(new AxiosError(\n        timeoutErrorMessage,\n        transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n        config,\n        request));\n\n      // Clean up request\n      request = null;\n    };\n\n    // Remove Content-Type if data is undefined\n    requestData === undefined && requestHeaders.setContentType(null);\n\n    // Add headers to the request\n    if ('setRequestHeader' in request) {\n      utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n        request.setRequestHeader(key, val);\n      });\n    }\n\n    // Add withCredentials to request if needed\n    if (!utils.isUndefined(_config.withCredentials)) {\n      request.withCredentials = !!_config.withCredentials;\n    }\n\n    // Add responseType to request if needed\n    if (responseType && responseType !== 'json') {\n      request.responseType = _config.responseType;\n    }\n\n    // Handle progress if needed\n    if (onDownloadProgress) {\n      ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true));\n      request.addEventListener('progress', downloadThrottled);\n    }\n\n    // Not all browsers support upload events\n    if (onUploadProgress && request.upload) {\n      ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress));\n\n      request.upload.addEventListener('progress', uploadThrottled);\n\n      request.upload.addEventListener('loadend', flushUpload);\n    }\n\n    if (_config.cancelToken || _config.signal) {\n      // Handle cancellation\n      // eslint-disable-next-line func-names\n      onCanceled = cancel => {\n        if (!request) {\n          return;\n        }\n        reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n        request.abort();\n        request = null;\n      };\n\n      _config.cancelToken && _config.cancelToken.subscribe(onCanceled);\n      if (_config.signal) {\n        _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);\n      }\n    }\n\n    const protocol = parseProtocol(_config.url);\n\n    if (protocol && platform.protocols.indexOf(protocol) === -1) {\n      reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n      return;\n    }\n\n\n    // Send the request\n    request.send(requestData || null);\n  });\n}\n","import CanceledError from \"../cancel/CanceledError.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport utils from '../utils.js';\n\nconst composeSignals = (signals, timeout) => {\n  const {length} = (signals = signals ? signals.filter(Boolean) : []);\n\n  if (timeout || length) {\n    let controller = new AbortController();\n\n    let aborted;\n\n    const onabort = function (reason) {\n      if (!aborted) {\n        aborted = true;\n        unsubscribe();\n        const err = reason instanceof Error ? reason : this.reason;\n        controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));\n      }\n    }\n\n    let timer = timeout && setTimeout(() => {\n      timer = null;\n      onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT))\n    }, timeout)\n\n    const unsubscribe = () => {\n      if (signals) {\n        timer && clearTimeout(timer);\n        timer = null;\n        signals.forEach(signal => {\n          signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort);\n        });\n        signals = null;\n      }\n    }\n\n    signals.forEach((signal) => signal.addEventListener('abort', onabort));\n\n    const {signal} = controller;\n\n    signal.unsubscribe = () => utils.asap(unsubscribe);\n\n    return signal;\n  }\n}\n\nexport default composeSignals;\n","\nexport const streamChunk = function* (chunk, chunkSize) {\n  let len = chunk.byteLength;\n\n  if (!chunkSize || len < chunkSize) {\n    yield chunk;\n    return;\n  }\n\n  let pos = 0;\n  let end;\n\n  while (pos < len) {\n    end = pos + chunkSize;\n    yield chunk.slice(pos, end);\n    pos = end;\n  }\n}\n\nexport const readBytes = async function* (iterable, chunkSize) {\n  for await (const chunk of readStream(iterable)) {\n    yield* streamChunk(chunk, chunkSize);\n  }\n}\n\nconst readStream = async function* (stream) {\n  if (stream[Symbol.asyncIterator]) {\n    yield* stream;\n    return;\n  }\n\n  const reader = stream.getReader();\n  try {\n    for (;;) {\n      const {done, value} = await reader.read();\n      if (done) {\n        break;\n      }\n      yield value;\n    }\n  } finally {\n    await reader.cancel();\n  }\n}\n\nexport const trackStream = (stream, chunkSize, onProgress, onFinish) => {\n  const iterator = readBytes(stream, chunkSize);\n\n  let bytes = 0;\n  let done;\n  let _onFinish = (e) => {\n    if (!done) {\n      done = true;\n      onFinish && onFinish(e);\n    }\n  }\n\n  return new ReadableStream({\n    async pull(controller) {\n      try {\n        const {done, value} = await iterator.next();\n\n        if (done) {\n         _onFinish();\n          controller.close();\n          return;\n        }\n\n        let len = value.byteLength;\n        if (onProgress) {\n          let loadedBytes = bytes += len;\n          onProgress(loadedBytes);\n        }\n        controller.enqueue(new Uint8Array(value));\n      } catch (err) {\n        _onFinish(err);\n        throw err;\n      }\n    },\n    cancel(reason) {\n      _onFinish(reason);\n      return iterator.return();\n    }\n  }, {\n    highWaterMark: 2\n  })\n}\n","import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport composeSignals from \"../helpers/composeSignals.js\";\nimport {trackStream} from \"../helpers/trackStream.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport {progressEventReducer, progressEventDecorator, asyncDecorator} from \"../helpers/progressEventReducer.js\";\nimport resolveConfig from \"../helpers/resolveConfig.js\";\nimport settle from \"../core/settle.js\";\n\nconst DEFAULT_CHUNK_SIZE = 64 * 1024;\n\nconst {isFunction} = utils;\n\nconst globalFetchAPI = (({Request, Response}) => ({\n  Request, Response\n}))(utils.global);\n\nconst {\n  ReadableStream, TextEncoder\n} = utils.global;\n\n\nconst test = (fn, ...args) => {\n  try {\n    return !!fn(...args);\n  } catch (e) {\n    return false\n  }\n}\n\nconst factory = (env) => {\n  env = utils.merge.call({\n    skipUndefined: true\n  }, globalFetchAPI, env);\n\n  const {fetch: envFetch, Request, Response} = env;\n  const isFetchSupported = envFetch ? isFunction(envFetch) : typeof fetch === 'function';\n  const isRequestSupported = isFunction(Request);\n  const isResponseSupported = isFunction(Response);\n\n  if (!isFetchSupported) {\n    return false;\n  }\n\n  const isReadableStreamSupported = isFetchSupported && isFunction(ReadableStream);\n\n  const encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?\n      ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :\n      async (str) => new Uint8Array(await new Request(str).arrayBuffer())\n  );\n\n  const supportsRequestStream = isRequestSupported && isReadableStreamSupported && test(() => {\n    let duplexAccessed = false;\n\n    const hasContentType = new Request(platform.origin, {\n      body: new ReadableStream(),\n      method: 'POST',\n      get duplex() {\n        duplexAccessed = true;\n        return 'half';\n      },\n    }).headers.has('Content-Type');\n\n    return duplexAccessed && !hasContentType;\n  });\n\n  const supportsResponseStream = isResponseSupported && isReadableStreamSupported &&\n    test(() => utils.isReadableStream(new Response('').body));\n\n  const resolvers = {\n    stream: supportsResponseStream && ((res) => res.body)\n  };\n\n  isFetchSupported && ((() => {\n    ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {\n      !resolvers[type] && (resolvers[type] = (res, config) => {\n        let method = res && res[type];\n\n        if (method) {\n          return method.call(res);\n        }\n\n        throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);\n      })\n    });\n  })());\n\n  const getBodyLength = async (body) => {\n    if (body == null) {\n      return 0;\n    }\n\n    if (utils.isBlob(body)) {\n      return body.size;\n    }\n\n    if (utils.isSpecCompliantForm(body)) {\n      const _request = new Request(platform.origin, {\n        method: 'POST',\n        body,\n      });\n      return (await _request.arrayBuffer()).byteLength;\n    }\n\n    if (utils.isArrayBufferView(body) || utils.isArrayBuffer(body)) {\n      return body.byteLength;\n    }\n\n    if (utils.isURLSearchParams(body)) {\n      body = body + '';\n    }\n\n    if (utils.isString(body)) {\n      return (await encodeText(body)).byteLength;\n    }\n  }\n\n  const resolveBodyLength = async (headers, body) => {\n    const length = utils.toFiniteNumber(headers.getContentLength());\n\n    return length == null ? getBodyLength(body) : length;\n  }\n\n  return async (config) => {\n    let {\n      url,\n      method,\n      data,\n      signal,\n      cancelToken,\n      timeout,\n      onDownloadProgress,\n      onUploadProgress,\n      responseType,\n      headers,\n      withCredentials = 'same-origin',\n      fetchOptions\n    } = resolveConfig(config);\n\n    let _fetch = envFetch || fetch;\n\n    responseType = responseType ? (responseType + '').toLowerCase() : 'text';\n\n    let composedSignal = composeSignals([signal, cancelToken && cancelToken.toAbortSignal()], timeout);\n\n    let request = null;\n\n    const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {\n      composedSignal.unsubscribe();\n    });\n\n    let requestContentLength;\n\n    try {\n      if (\n        onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&\n        (requestContentLength = await resolveBodyLength(headers, data)) !== 0\n      ) {\n        let _request = new Request(url, {\n          method: 'POST',\n          body: data,\n          duplex: \"half\"\n        });\n\n        let contentTypeHeader;\n\n        if (utils.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {\n          headers.setContentType(contentTypeHeader)\n        }\n\n        if (_request.body) {\n          const [onProgress, flush] = progressEventDecorator(\n            requestContentLength,\n            progressEventReducer(asyncDecorator(onUploadProgress))\n          );\n\n          data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);\n        }\n      }\n\n      if (!utils.isString(withCredentials)) {\n        withCredentials = withCredentials ? 'include' : 'omit';\n      }\n\n      // Cloudflare Workers throws when credentials are defined\n      // see https://github.com/cloudflare/workerd/issues/902\n      const isCredentialsSupported = isRequestSupported && \"credentials\" in Request.prototype;\n\n      const resolvedOptions = {\n        ...fetchOptions,\n        signal: composedSignal,\n        method: method.toUpperCase(),\n        headers: headers.normalize().toJSON(),\n        body: data,\n        duplex: \"half\",\n        credentials: isCredentialsSupported ? withCredentials : undefined\n      };\n\n      request = isRequestSupported && new Request(url, resolvedOptions);\n\n      let response = await (isRequestSupported ? _fetch(request, fetchOptions) : _fetch(url, resolvedOptions));\n\n      const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');\n\n      if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {\n        const options = {};\n\n        ['status', 'statusText', 'headers'].forEach(prop => {\n          options[prop] = response[prop];\n        });\n\n        const responseContentLength = utils.toFiniteNumber(response.headers.get('content-length'));\n\n        const [onProgress, flush] = onDownloadProgress && progressEventDecorator(\n          responseContentLength,\n          progressEventReducer(asyncDecorator(onDownloadProgress), true)\n        ) || [];\n\n        response = new Response(\n          trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {\n            flush && flush();\n            unsubscribe && unsubscribe();\n          }),\n          options\n        );\n      }\n\n      responseType = responseType || 'text';\n\n      let responseData = await resolvers[utils.findKey(resolvers, responseType) || 'text'](response, config);\n\n      !isStreamResponse && unsubscribe && unsubscribe();\n\n      return await new Promise((resolve, reject) => {\n        settle(resolve, reject, {\n          data: responseData,\n          headers: AxiosHeaders.from(response.headers),\n          status: response.status,\n          statusText: response.statusText,\n          config,\n          request\n        })\n      })\n    } catch (err) {\n      unsubscribe && unsubscribe();\n\n      if (err && err.name === 'TypeError' && /Load failed|fetch/i.test(err.message)) {\n        throw Object.assign(\n          new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request),\n          {\n            cause: err.cause || err\n          }\n        )\n      }\n\n      throw AxiosError.from(err, err && err.code, config, request);\n    }\n  }\n}\n\nconst seedCache = new Map();\n\nexport const getFetch = (config) => {\n  let env = config ? config.env : {};\n  const {fetch, Request, Response} = env;\n  const seeds = [\n    Request, Response, fetch\n  ];\n\n  let len = seeds.length, i = len,\n    seed, target, map = seedCache;\n\n  while (i--) {\n    seed = seeds[i];\n    target = map.get(seed);\n\n    target === undefined && map.set(seed, target = (i ? new Map() : factory(env)))\n\n    map = target;\n  }\n\n  return target;\n};\n\nconst adapter = getFetch();\n\nexport default adapter;\n","import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\nimport * as fetchAdapter from './fetch.js';\nimport AxiosError from \"../core/AxiosError.js\";\n\nconst knownAdapters = {\n  http: httpAdapter,\n  xhr: xhrAdapter,\n  fetch: {\n    get: fetchAdapter.getFetch,\n  }\n}\n\nutils.forEach(knownAdapters, (fn, value) => {\n  if (fn) {\n    try {\n      Object.defineProperty(fn, 'name', {value});\n    } catch (e) {\n      // eslint-disable-next-line no-empty\n    }\n    Object.defineProperty(fn, 'adapterName', {value});\n  }\n});\n\nconst renderReason = (reason) => `- ${reason}`;\n\nconst isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;\n\nexport default {\n  getAdapter: (adapters, config) => {\n    adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n    const {length} = adapters;\n    let nameOrAdapter;\n    let adapter;\n\n    const rejectedReasons = {};\n\n    for (let i = 0; i < length; i++) {\n      nameOrAdapter = adapters[i];\n      let id;\n\n      adapter = nameOrAdapter;\n\n      if (!isResolvedHandle(nameOrAdapter)) {\n        adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n        if (adapter === undefined) {\n          throw new AxiosError(`Unknown adapter '${id}'`);\n        }\n      }\n\n      if (adapter && (utils.isFunction(adapter) || (adapter = adapter.get(config)))) {\n        break;\n      }\n\n      rejectedReasons[id || '#' + i] = adapter;\n    }\n\n    if (!adapter) {\n\n      const reasons = Object.entries(rejectedReasons)\n        .map(([id, state]) => `adapter ${id} ` +\n          (state === false ? 'is not supported by the environment' : 'is not available in the build')\n        );\n\n      let s = length ?\n        (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n        'as no adapter specified';\n\n      throw new AxiosError(\n        `There is no suitable adapter to dispatch the request ` + s,\n        'ERR_NOT_SUPPORT'\n      );\n    }\n\n    return adapter;\n  },\n  adapters: knownAdapters\n}\n","'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport adapters from \"../adapters/adapters.js\";\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n  if (config.cancelToken) {\n    config.cancelToken.throwIfRequested();\n  }\n\n  if (config.signal && config.signal.aborted) {\n    throw new CanceledError(null, config);\n  }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n  throwIfCancellationRequested(config);\n\n  config.headers = AxiosHeaders.from(config.headers);\n\n  // Transform request data\n  config.data = transformData.call(\n    config,\n    config.transformRequest\n  );\n\n  if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n    config.headers.setContentType('application/x-www-form-urlencoded', false);\n  }\n\n  const adapter = adapters.getAdapter(config.adapter || defaults.adapter, config);\n\n  return adapter(config).then(function onAdapterResolution(response) {\n    throwIfCancellationRequested(config);\n\n    // Transform response data\n    response.data = transformData.call(\n      config,\n      config.transformResponse,\n      response\n    );\n\n    response.headers = AxiosHeaders.from(response.headers);\n\n    return response;\n  }, function onAdapterRejection(reason) {\n    if (!isCancel(reason)) {\n      throwIfCancellationRequested(config);\n\n      // Transform response data\n      if (reason && reason.response) {\n        reason.response.data = transformData.call(\n          config,\n          config.transformResponse,\n          reason.response\n        );\n        reason.response.headers = AxiosHeaders.from(reason.response.headers);\n      }\n    }\n\n    return Promise.reject(reason);\n  });\n}\n","export const VERSION = \"1.12.2\";","'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n  validators[type] = function validator(thing) {\n    return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n  };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n  function formatMessage(opt, desc) {\n    return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n  }\n\n  // eslint-disable-next-line func-names\n  return (value, opt, opts) => {\n    if (validator === false) {\n      throw new AxiosError(\n        formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n        AxiosError.ERR_DEPRECATED\n      );\n    }\n\n    if (version && !deprecatedWarnings[opt]) {\n      deprecatedWarnings[opt] = true;\n      // eslint-disable-next-line no-console\n      console.warn(\n        formatMessage(\n          opt,\n          ' has been deprecated since v' + version + ' and will be removed in the near future'\n        )\n      );\n    }\n\n    return validator ? validator(value, opt, opts) : true;\n  };\n};\n\nvalidators.spelling = function spelling(correctSpelling) {\n  return (value, opt) => {\n    // eslint-disable-next-line no-console\n    console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);\n    return true;\n  }\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n  if (typeof options !== 'object') {\n    throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n  }\n  const keys = Object.keys(options);\n  let i = keys.length;\n  while (i-- > 0) {\n    const opt = keys[i];\n    const validator = schema[opt];\n    if (validator) {\n      const value = options[opt];\n      const result = value === undefined || validator(value, opt, options);\n      if (result !== true) {\n        throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n      }\n      continue;\n    }\n    if (allowUnknown !== true) {\n      throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n    }\n  }\n}\n\nexport default {\n  assertOptions,\n  validators\n};\n","'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n  constructor(instanceConfig) {\n    this.defaults = instanceConfig || {};\n    this.interceptors = {\n      request: new InterceptorManager(),\n      response: new InterceptorManager()\n    };\n  }\n\n  /**\n   * Dispatch a request\n   *\n   * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n   * @param {?Object} config\n   *\n   * @returns {Promise} The Promise to be fulfilled\n   */\n  async request(configOrUrl, config) {\n    try {\n      return await this._request(configOrUrl, config);\n    } catch (err) {\n      if (err instanceof Error) {\n        let dummy = {};\n\n        Error.captureStackTrace ? Error.captureStackTrace(dummy) : (dummy = new Error());\n\n        // slice off the Error: ... line\n        const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, '') : '';\n        try {\n          if (!err.stack) {\n            err.stack = stack;\n            // match without the 2 top stack lines\n          } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, ''))) {\n            err.stack += '\\n' + stack\n          }\n        } catch (e) {\n          // ignore the case where \"stack\" is an un-writable property\n        }\n      }\n\n      throw err;\n    }\n  }\n\n  _request(configOrUrl, config) {\n    /*eslint no-param-reassign:0*/\n    // Allow for axios('example/url'[, config]) a la fetch API\n    if (typeof configOrUrl === 'string') {\n      config = config || {};\n      config.url = configOrUrl;\n    } else {\n      config = configOrUrl || {};\n    }\n\n    config = mergeConfig(this.defaults, config);\n\n    const {transitional, paramsSerializer, headers} = config;\n\n    if (transitional !== undefined) {\n      validator.assertOptions(transitional, {\n        silentJSONParsing: validators.transitional(validators.boolean),\n        forcedJSONParsing: validators.transitional(validators.boolean),\n        clarifyTimeoutError: validators.transitional(validators.boolean)\n      }, false);\n    }\n\n    if (paramsSerializer != null) {\n      if (utils.isFunction(paramsSerializer)) {\n        config.paramsSerializer = {\n          serialize: paramsSerializer\n        }\n      } else {\n        validator.assertOptions(paramsSerializer, {\n          encode: validators.function,\n          serialize: validators.function\n        }, true);\n      }\n    }\n\n    // Set config.allowAbsoluteUrls\n    if (config.allowAbsoluteUrls !== undefined) {\n      // do nothing\n    } else if (this.defaults.allowAbsoluteUrls !== undefined) {\n      config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;\n    } else {\n      config.allowAbsoluteUrls = true;\n    }\n\n    validator.assertOptions(config, {\n      baseUrl: validators.spelling('baseURL'),\n      withXsrfToken: validators.spelling('withXSRFToken')\n    }, true);\n\n    // Set config.method\n    config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n    // Flatten headers\n    let contextHeaders = headers && utils.merge(\n      headers.common,\n      headers[config.method]\n    );\n\n    headers && utils.forEach(\n      ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n      (method) => {\n        delete headers[method];\n      }\n    );\n\n    config.headers = AxiosHeaders.concat(contextHeaders, headers);\n\n    // filter out skipped interceptors\n    const requestInterceptorChain = [];\n    let synchronousRequestInterceptors = true;\n    this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n      if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n        return;\n      }\n\n      synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n      requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n    });\n\n    const responseInterceptorChain = [];\n    this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n      responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n    });\n\n    let promise;\n    let i = 0;\n    let len;\n\n    if (!synchronousRequestInterceptors) {\n      const chain = [dispatchRequest.bind(this), undefined];\n      chain.unshift(...requestInterceptorChain);\n      chain.push(...responseInterceptorChain);\n      len = chain.length;\n\n      promise = Promise.resolve(config);\n\n      while (i < len) {\n        promise = promise.then(chain[i++], chain[i++]);\n      }\n\n      return promise;\n    }\n\n    len = requestInterceptorChain.length;\n\n    let newConfig = config;\n\n    while (i < len) {\n      const onFulfilled = requestInterceptorChain[i++];\n      const onRejected = requestInterceptorChain[i++];\n      try {\n        newConfig = onFulfilled(newConfig);\n      } catch (error) {\n        onRejected.call(this, error);\n        break;\n      }\n    }\n\n    try {\n      promise = dispatchRequest.call(this, newConfig);\n    } catch (error) {\n      return Promise.reject(error);\n    }\n\n    i = 0;\n    len = responseInterceptorChain.length;\n\n    while (i < len) {\n      promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n    }\n\n    return promise;\n  }\n\n  getUri(config) {\n    config = mergeConfig(this.defaults, config);\n    const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);\n    return buildURL(fullPath, config.params, config.paramsSerializer);\n  }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n  /*eslint func-names:0*/\n  Axios.prototype[method] = function(url, config) {\n    return this.request(mergeConfig(config || {}, {\n      method,\n      url,\n      data: (config || {}).data\n    }));\n  };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n  /*eslint func-names:0*/\n\n  function generateHTTPMethod(isForm) {\n    return function httpMethod(url, data, config) {\n      return this.request(mergeConfig(config || {}, {\n        method,\n        headers: isForm ? {\n          'Content-Type': 'multipart/form-data'\n        } : {},\n        url,\n        data\n      }));\n    };\n  }\n\n  Axios.prototype[method] = generateHTTPMethod();\n\n  Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n","'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n  constructor(executor) {\n    if (typeof executor !== 'function') {\n      throw new TypeError('executor must be a function.');\n    }\n\n    let resolvePromise;\n\n    this.promise = new Promise(function promiseExecutor(resolve) {\n      resolvePromise = resolve;\n    });\n\n    const token = this;\n\n    // eslint-disable-next-line func-names\n    this.promise.then(cancel => {\n      if (!token._listeners) return;\n\n      let i = token._listeners.length;\n\n      while (i-- > 0) {\n        token._listeners[i](cancel);\n      }\n      token._listeners = null;\n    });\n\n    // eslint-disable-next-line func-names\n    this.promise.then = onfulfilled => {\n      let _resolve;\n      // eslint-disable-next-line func-names\n      const promise = new Promise(resolve => {\n        token.subscribe(resolve);\n        _resolve = resolve;\n      }).then(onfulfilled);\n\n      promise.cancel = function reject() {\n        token.unsubscribe(_resolve);\n      };\n\n      return promise;\n    };\n\n    executor(function cancel(message, config, request) {\n      if (token.reason) {\n        // Cancellation has already been requested\n        return;\n      }\n\n      token.reason = new CanceledError(message, config, request);\n      resolvePromise(token.reason);\n    });\n  }\n\n  /**\n   * Throws a `CanceledError` if cancellation has been requested.\n   */\n  throwIfRequested() {\n    if (this.reason) {\n      throw this.reason;\n    }\n  }\n\n  /**\n   * Subscribe to the cancel signal\n   */\n\n  subscribe(listener) {\n    if (this.reason) {\n      listener(this.reason);\n      return;\n    }\n\n    if (this._listeners) {\n      this._listeners.push(listener);\n    } else {\n      this._listeners = [listener];\n    }\n  }\n\n  /**\n   * Unsubscribe from the cancel signal\n   */\n\n  unsubscribe(listener) {\n    if (!this._listeners) {\n      return;\n    }\n    const index = this._listeners.indexOf(listener);\n    if (index !== -1) {\n      this._listeners.splice(index, 1);\n    }\n  }\n\n  toAbortSignal() {\n    const controller = new AbortController();\n\n    const abort = (err) => {\n      controller.abort(err);\n    };\n\n    this.subscribe(abort);\n\n    controller.signal.unsubscribe = () => this.unsubscribe(abort);\n\n    return controller.signal;\n  }\n\n  /**\n   * Returns an object that contains a new `CancelToken` and a function that, when called,\n   * cancels the `CancelToken`.\n   */\n  static source() {\n    let cancel;\n    const token = new CancelToken(function executor(c) {\n      cancel = c;\n    });\n    return {\n      token,\n      cancel\n    };\n  }\n}\n\nexport default CancelToken;\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n *  ```js\n *  function f(x, y, z) {}\n *  var args = [1, 2, 3];\n *  f.apply(null, args);\n *  ```\n *\n * With `spread` this example can be re-written.\n *\n *  ```js\n *  spread(function(x, y, z) {})([1, 2, 3]);\n *  ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n  return function wrap(arr) {\n    return callback.apply(null, arr);\n  };\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n  return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n","const HttpStatusCode = {\n  Continue: 100,\n  SwitchingProtocols: 101,\n  Processing: 102,\n  EarlyHints: 103,\n  Ok: 200,\n  Created: 201,\n  Accepted: 202,\n  NonAuthoritativeInformation: 203,\n  NoContent: 204,\n  ResetContent: 205,\n  PartialContent: 206,\n  MultiStatus: 207,\n  AlreadyReported: 208,\n  ImUsed: 226,\n  MultipleChoices: 300,\n  MovedPermanently: 301,\n  Found: 302,\n  SeeOther: 303,\n  NotModified: 304,\n  UseProxy: 305,\n  Unused: 306,\n  TemporaryRedirect: 307,\n  PermanentRedirect: 308,\n  BadRequest: 400,\n  Unauthorized: 401,\n  PaymentRequired: 402,\n  Forbidden: 403,\n  NotFound: 404,\n  MethodNotAllowed: 405,\n  NotAcceptable: 406,\n  ProxyAuthenticationRequired: 407,\n  RequestTimeout: 408,\n  Conflict: 409,\n  Gone: 410,\n  LengthRequired: 411,\n  PreconditionFailed: 412,\n  PayloadTooLarge: 413,\n  UriTooLong: 414,\n  UnsupportedMediaType: 415,\n  RangeNotSatisfiable: 416,\n  ExpectationFailed: 417,\n  ImATeapot: 418,\n  MisdirectedRequest: 421,\n  UnprocessableEntity: 422,\n  Locked: 423,\n  FailedDependency: 424,\n  TooEarly: 425,\n  UpgradeRequired: 426,\n  PreconditionRequired: 428,\n  TooManyRequests: 429,\n  RequestHeaderFieldsTooLarge: 431,\n  UnavailableForLegalReasons: 451,\n  InternalServerError: 500,\n  NotImplemented: 501,\n  BadGateway: 502,\n  ServiceUnavailable: 503,\n  GatewayTimeout: 504,\n  HttpVersionNotSupported: 505,\n  VariantAlsoNegotiates: 506,\n  InsufficientStorage: 507,\n  LoopDetected: 508,\n  NotExtended: 510,\n  NetworkAuthenticationRequired: 511,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n  HttpStatusCode[value] = key;\n});\n\nexport default HttpStatusCode;\n","'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\nimport AxiosHeaders from \"./core/AxiosHeaders.js\";\nimport adapters from './adapters/adapters.js';\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n  const context = new Axios(defaultConfig);\n  const instance = bind(Axios.prototype.request, context);\n\n  // Copy axios.prototype to instance\n  utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n  // Copy context to instance\n  utils.extend(instance, context, null, {allOwnKeys: true});\n\n  // Factory for creating new instances\n  instance.create = function create(instanceConfig) {\n    return createInstance(mergeConfig(defaultConfig, instanceConfig));\n  };\n\n  return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n  return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders;\n\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\nexport default axios\n","import axios from './lib/axios.js';\n\n// This module is intended to unwrap Axios default export as named.\n// Keep top-level export same with static properties\n// so that it can keep same with es module or cjs\nconst {\n  Axios,\n  AxiosError,\n  CanceledError,\n  isCancel,\n  CancelToken,\n  VERSION,\n  all,\n  Cancel,\n  isAxiosError,\n  spread,\n  toFormData,\n  AxiosHeaders,\n  HttpStatusCode,\n  formToJSON,\n  getAdapter,\n  mergeConfig\n} = axios;\n\nexport {\n  axios as default,\n  Axios,\n  AxiosError,\n  CanceledError,\n  isCancel,\n  CancelToken,\n  VERSION,\n  all,\n  Cancel,\n  isAxiosError,\n  spread,\n  toFormData,\n  AxiosHeaders,\n  HttpStatusCode,\n  formToJSON,\n  getAdapter,\n  mergeConfig\n}\n","/**\n * Base error class for all Wildberries SDK errors.\n *\n * All SDK-specific errors extend this class to enable consumers to catch\n * all SDK errors with a single catch block if desired.\n *\n * @example\n * ```typescript\n * import { WBAPIError } from 'daytona-wildberries-typescript-sdk';\n *\n * try {\n *   await sdk.general.ping();\n * } catch (error) {\n *   if (error instanceof WBAPIError) {\n *     console.error('SDK error:', error.getUserMessage());\n *     console.error('Status code:', error.statusCode);\n *   }\n * }\n * ```\n */\nexport class WBAPIError extends Error {\n  /**\n   * HTTP status code if applicable\n   */\n  public readonly statusCode?: number;\n\n  /**\n   * API response body if available\n   */\n  public readonly response?: unknown;\n\n  /**\n   * Correlation ID for debugging and tracing requests\n   */\n  public readonly requestId?: string;\n\n  /**\n   * Origin service identifier from RFC 7807 problem+json responses.\n   *\n   * Indicates which internal Wildberries service originated the error\n   * (e.g., \"s2s-api-auth-catalog\").\n   */\n  public readonly origin?: string;\n\n  /**\n   * ISO 8601 timestamp from RFC 7807 problem+json responses.\n   *\n   * Indicates when the error occurred on the server side\n   * (e.g., \"2024-09-30T06:52:38Z\").\n   */\n  public readonly timestamp?: string;\n\n  /**\n   * Creates a new WBAPIError\n   *\n   * @param message - Error message describing what went wrong\n   * @param statusCode - HTTP status code if applicable\n   * @param response - API response body if available\n   * @param requestId - Correlation ID for debugging\n   * @param origin - Origin service identifier from RFC 7807 responses\n   * @param timestamp - ISO 8601 timestamp from RFC 7807 responses\n   */\n  constructor(\n    message: string,\n    statusCode?: number,\n    response?: unknown,\n    requestId?: string,\n    origin?: string,\n    timestamp?: string\n  ) {\n    super(message);\n\n    // Set error name to class name for proper identification\n    this.name = this.constructor.name;\n\n    // Preserve stack trace for debugging (V8 engines like Node.js)\n    // Type assertion needed because captureStackTrace is V8-specific\n    const captureStackTrace = (\n      Error as {\n        captureStackTrace?: (\n          target: object,\n          constructor: new (...args: unknown[]) => unknown\n        ) => void;\n      }\n    ).captureStackTrace;\n    if (captureStackTrace) {\n      captureStackTrace(this, this.constructor as new (...args: unknown[]) => unknown);\n    }\n\n    this.statusCode = statusCode;\n    this.response = response;\n    this.requestId = requestId;\n    this.origin = origin;\n    this.timestamp = timestamp;\n  }\n\n  /**\n   * Returns a human-readable error message with recovery guidance.\n   *\n   * Override this method in subclasses to provide specific recovery steps.\n   *\n   * @returns User-friendly error message with actionable guidance\n   *\n   * @example\n   * ```typescript\n   * try {\n   *   await sdk.products.createProduct(data);\n   * } catch (error) {\n   *   if (error instanceof WBAPIError) {\n   *     // Show user-friendly message\n   *     alert(error.getUserMessage());\n   *\n   *     // Log technical details for debugging\n   *     console.error('Technical details:', {\n   *       statusCode: error.statusCode,\n   *       requestId: error.requestId\n   *     });\n   *   }\n   * }\n   * ```\n   */\n  getUserMessage(): string {\n    let message = this.message;\n\n    if (this.statusCode !== undefined) {\n      message += ` (Status: ${this.statusCode.toString()})`;\n    }\n\n    if (this.requestId) {\n      message += ` [Request ID: ${this.requestId}]`;\n    }\n\n    if (this.origin) {\n      message += ` [Origin: ${this.origin}]`;\n    }\n\n    return message;\n  }\n\n  /**\n   * Custom JSON serialization to preserve all error properties.\n   *\n   * By default, Error objects don't serialize the `message` property\n   * when using JSON.stringify(). This method ensures all important\n   * properties are included in the JSON output.\n   *\n   * @returns Object representation of the error for JSON serialization\n   *\n   * @example\n   * ```typescript\n   * const error = new WBAPIError('Test error', 400, { detail: 'info' }, 'req-123');\n   * const json = JSON.stringify(error);\n   * // { \"name\": \"WBAPIError\", \"message\": \"Test error\", \"statusCode\": 400, ... }\n   * ```\n   */\n  toJSON(): {\n    name: string;\n    message: string;\n    statusCode?: number;\n    response?: unknown;\n    requestId?: string;\n    origin?: string;\n    timestamp?: string;\n  } {\n    return {\n      name: this.name,\n      message: this.message,\n      statusCode: this.statusCode,\n      response: this.response,\n      requestId: this.requestId,\n      origin: this.origin,\n      timestamp: this.timestamp,\n    };\n  }\n}\n","import { WBAPIError } from './base-error';\n\n/**\n * Authentication error thrown when API key is invalid or lacks permissions.\n *\n * This error is thrown for:\n * - 401 Unauthorized responses (invalid API key)\n * - 403 Forbidden responses (insufficient permissions)\n * - Client-side API key validation failures\n *\n * @example\n * ```typescript\n * import { AuthenticationError } from 'daytona-wildberries-typescript-sdk';\n *\n * try {\n *   await sdk.general.ping();\n * } catch (error) {\n *   if (error instanceof AuthenticationError) {\n *     console.error('Invalid API key:', error.getUserMessage());\n *     // Prompt user to update API key in settings\n *   }\n * }\n * ```\n */\nexport class AuthenticationError extends WBAPIError {\n  /**\n   * Creates an authentication error\n   *\n   * @param message - Error message (defaults to standard authentication failure message)\n   * @param statusCode - HTTP status code (401 or 403)\n   * @param response - API response body if available\n   * @param requestId - Correlation ID for debugging\n   * @param origin - Origin service identifier from RFC 7807 responses\n   * @param timestamp - ISO 8601 timestamp from RFC 7807 responses\n   */\n  constructor(\n    message = 'Authentication failed. Please verify your API key is valid and has the required permissions.',\n    statusCode: 401 | 403 = 401,\n    response?: unknown,\n    requestId?: string,\n    origin?: string,\n    timestamp?: string\n  ) {\n    super(message, statusCode, response, requestId, origin, timestamp);\n    this.name = 'AuthenticationError';\n  }\n\n  /**\n   * Returns user-friendly error message with API key troubleshooting guidance\n   *\n   * @returns Error message with actionable recovery steps\n   */\n  getUserMessage(): string {\n    const baseMessage = super.getUserMessage();\n\n    const guidance = [\n      '\\n\\nTo resolve this issue:',\n      '1. Verify your API key is valid and correctly formatted',\n      '2. Check that your API key has the required permissions for this operation',\n      '3. Ensure the Authorization header is properly set',\n      '4. Confirm your API key has not been revoked or expired',\n    ].join('\\n');\n\n    return baseMessage + guidance;\n  }\n}\n","import { WBAPIError } from './base-error';\n\n/**\n * Rate limit error thrown when API rate limits are exceeded.\n *\n * This error is thrown for 429 Too Many Requests responses.\n * The SDK's RetryHandler automatically retries rate-limited requests\n * after the specified delay, so consumers typically don't need to\n * handle this error manually.\n *\n * @example\n * ```typescript\n * import { RateLimitError } from 'daytona-wildberries-typescript-sdk';\n *\n * try {\n *   await sdk.products.createProduct(data);\n * } catch (error) {\n *   if (error instanceof RateLimitError) {\n *     console.log(`Rate limited. SDK will retry after ${error.retryAfter}ms`);\n *     // The SDK automatically retries, so you usually don't need to do anything\n *   }\n * }\n * ```\n */\nexport class RateLimitError extends WBAPIError {\n  /**\n   * Milliseconds to wait before retrying the request\n   */\n  public readonly retryAfter: number;\n\n  /**\n   * Creates a rate limit error\n   *\n   * @param message - Error message (defaults to standard rate limit message)\n   * @param retryAfter - Milliseconds until retry is allowed\n   * @param response - API response body if available\n   * @param requestId - Correlation ID for debugging\n   * @param origin - Origin service identifier from RFC 7807 responses\n   * @param timestamp - ISO 8601 timestamp from RFC 7807 responses\n   */\n  constructor(\n    message = 'Rate limit exceeded. The SDK will automatically retry this request.',\n    retryAfter: number,\n    response?: unknown,\n    requestId?: string,\n    origin?: string,\n    timestamp?: string\n  ) {\n    super(message, 429, response, requestId, origin, timestamp);\n    this.name = 'RateLimitError';\n    this.retryAfter = retryAfter;\n  }\n\n  /**\n   * Returns user-friendly error message with retry timing information\n   *\n   * @returns Error message with retry delay and automatic handling notice\n   */\n  getUserMessage(): string {\n    const baseMessage = super.getUserMessage();\n\n    const retrySeconds = (this.retryAfter / 1000).toFixed(1);\n    const guidance = [\n      `\\n\\nRetry after: ${retrySeconds} seconds`,\n      '\\nThe SDK will automatically retry this request.',\n      '\\nIf rate limiting occurs frequently, consider:',\n      '1. Implementing request batching to reduce API call frequency',\n      '2. Caching responses when appropriate',\n      \"3. Reviewing your application's API usage patterns\",\n    ].join('\\n');\n\n    return baseMessage + guidance;\n  }\n\n  /**\n   * Custom JSON serialization to preserve retryAfter property\n   *\n   * @returns Object representation including retryAfter timing\n   */\n  toJSON(): {\n    name: string;\n    message: string;\n    statusCode: number;\n    retryAfter: number;\n    response?: unknown;\n    requestId?: string;\n  } {\n    return {\n      ...super.toJSON(),\n      statusCode: this.statusCode ?? 429,\n      retryAfter: this.retryAfter,\n    };\n  }\n}\n","import { WBAPIError } from './base-error';\n\n/**\n * Validation error thrown when request data fails validation.\n *\n * This error is thrown for:\n * - 400 Bad Request responses (malformed requests)\n * - 422 Unprocessable Entity responses (validation failures)\n *\n * Includes field-level error details when available to help\n * identify which specific fields failed validation.\n *\n * @example\n * ```typescript\n * import { ValidationError } from 'daytona-wildberries-typescript-sdk';\n *\n * try {\n *   await sdk.products.createProduct({\n *     // Missing required fields\n *   });\n * } catch (error) {\n *   if (error instanceof ValidationError) {\n *     console.error('Validation failed:', error.getUserMessage());\n *\n *     // Access field-level errors\n *     if (error.fieldErrors) {\n *       Object.entries(error.fieldErrors).forEach(([field, message]) => {\n *         console.error(`  - ${field}: ${message}`);\n *       });\n *     }\n *   }\n * }\n * ```\n */\nexport class ValidationError extends WBAPIError {\n  /**\n   * Map of field names to their validation error messages\n   */\n  public readonly fieldErrors?: Record<string, string>;\n\n  /**\n   * Creates a validation error\n   *\n   * @param message - Error message (defaults to standard validation failure message)\n   * @param fieldErrors - Optional map of field names to error messages\n   * @param statusCode - HTTP status code (400 or 422)\n   * @param response - API response body if available\n   * @param requestId - Correlation ID for debugging\n   */\n  constructor(\n    message = 'Validation failed. Please check the request data and try again.',\n    fieldErrors?: Record<string, string>,\n    statusCode: 400 | 422 = 400,\n    response?: unknown,\n    requestId?: string\n  ) {\n    super(message, statusCode, response, requestId);\n    this.name = 'ValidationError';\n    this.fieldErrors = fieldErrors;\n  }\n\n  /**\n   * Returns user-friendly error message with field-level validation details\n   *\n   * @returns Error message with specific field errors and resolution guidance\n   */\n  getUserMessage(): string {\n    const baseMessage = super.getUserMessage();\n\n    if (this.fieldErrors && Object.keys(this.fieldErrors).length > 0) {\n      const fieldErrorsList = Object.entries(this.fieldErrors)\n        .map(([field, error]) => `  - ${field}: ${error}`)\n        .join('\\n');\n\n      const guidance = [\n        '\\n\\nField validation errors:',\n        fieldErrorsList,\n        '\\nPlease correct the above fields and try again.',\n      ].join('\\n');\n\n      return baseMessage + guidance;\n    }\n\n    const guidance = [\n      '\\n\\nTo resolve this issue:',\n      '1. Ensure all required fields are provided',\n      '2. Verify that field values meet the API specifications',\n      '3. Check that data types and formats are correct',\n      '4. Review the API documentation for field requirements',\n    ].join('\\n');\n\n    return baseMessage + guidance;\n  }\n\n  /**\n   * Custom JSON serialization to preserve fieldErrors property\n   *\n   * @returns Object representation including field-level error details\n   */\n  toJSON(): {\n    name: string;\n    message: string;\n    statusCode: number;\n    fieldErrors?: Record<string, string>;\n    response?: unknown;\n    requestId?: string;\n  } {\n    return {\n      ...super.toJSON(),\n      statusCode: this.statusCode ?? 400,\n      fieldErrors: this.fieldErrors,\n    };\n  }\n}\n","import { WBAPIError } from './base-error';\n\n/**\n * Network error thrown for connection failures, timeouts, and server errors.\n *\n * This error is thrown for:\n * - Network connection failures (no internet, DNS failures)\n * - Request timeouts (exceeding configured timeout)\n * - 500-level server errors (500, 502, 503, 504)\n *\n * The SDK's RetryHandler automatically retries network errors with\n * exponential backoff (max 3 attempts), so transient failures are\n * handled automatically.\n *\n * @example\n * ```typescript\n * import { NetworkError } from 'daytona-wildberries-typescript-sdk';\n *\n * try {\n *   await sdk.products.getProductList();\n * } catch (error) {\n *   if (error instanceof NetworkError) {\n *     if (error.isTimeout) {\n *       console.error('Request timed out:', error.getUserMessage());\n *     } else {\n *       console.error('Network error:', error.getUserMessage());\n *     }\n *     // The SDK already attempted 3 retries automatically\n *   }\n * }\n * ```\n */\nexport class NetworkError extends WBAPIError {\n  /**\n   * Original error from the HTTP client\n   */\n  public readonly cause?: Error;\n\n  /**\n   * True if the error was caused by a timeout\n   */\n  public readonly isTimeout: boolean;\n\n  /**\n   * Creates a network error\n   *\n   * @param message - Error message describing the network failure\n   * @param isTimeout - Whether this error was caused by a timeout\n   * @param statusCode - HTTP status code (0 for network failures, 5xx for server errors)\n   * @param cause - Original error from the HTTP client\n   * @param response - API response body if available\n   * @param requestId - Correlation ID for debugging\n   */\n  constructor(\n    message: string,\n    isTimeout = false,\n    statusCode?: number,\n    cause?: Error,\n    response?: unknown,\n    requestId?: string\n  ) {\n    super(message, statusCode, response, requestId);\n    this.name = 'NetworkError';\n    this.isTimeout = isTimeout;\n    this.cause = cause;\n  }\n\n  /**\n   * Returns user-friendly error message with retry information and troubleshooting guidance\n   *\n   * @returns Error message with network-specific recovery steps\n   */\n  getUserMessage(): string {\n    const baseMessage = super.getUserMessage();\n\n    let guidance: string;\n\n    if (this.isTimeout) {\n      guidance = [\n        '\\n\\nThis request timed out after 30 seconds.',\n        'The SDK automatically retried this request 3 times.',\n        '\\nTo resolve timeout issues:',\n        '1. Check if the Wildberries API is experiencing high latency',\n        '2. Consider increasing the timeout configuration',\n        '3. Verify your network connection is stable',\n        '4. Try again later if the API is overloaded',\n      ].join('\\n');\n    } else if (this.statusCode && this.statusCode >= 500) {\n      guidance = [\n        '\\n\\nThe Wildberries API server encountered an error.',\n        'The SDK automatically retried this request 3 times.',\n        '\\nTo resolve server errors:',\n        '1. Wait a few moments and try again',\n        '2. Check the Wildberries API status page for known issues',\n        '3. If the problem persists, contact Wildberries API support',\n      ].join('\\n');\n    } else {\n      guidance = [\n        '\\n\\nNetwork connection failed.',\n        'The SDK automatically retried this request 3 times.',\n        '\\nTo resolve connection issues:',\n        '1. Check your internet connection',\n        '2. Verify network firewalls allow HTTPS connections',\n        '3. Ensure DNS resolution is working properly',\n        '4. Try again when network connectivity is restored',\n      ].join('\\n');\n    }\n\n    return baseMessage + guidance;\n  }\n\n  /**\n   * Custom JSON serialization to preserve isTimeout property\n   *\n   * Note: The `cause` property is not serialized as Error objects\n   * don't serialize well. Check the cause property directly if needed.\n   *\n   * @returns Object representation including timeout flag and status\n   */\n  toJSON(): {\n    name: string;\n    message: string;\n    isTimeout: boolean;\n    statusCode?: number;\n    response?: unknown;\n    requestId?: string;\n  } {\n    return {\n      ...super.toJSON(),\n      isTimeout: this.isTimeout,\n    };\n  }\n}\n","import { WBAPIError } from './base-error';\nimport { ValidationError } from './validation-error';\n\n/**\n * Error thrown when a campaign is not found by its ID.\n *\n * This error typically occurs when:\n * - Campaign was deleted\n * - Campaign ID is incorrect\n * - Campaign belongs to another seller account\n *\n * @example\n * ```typescript\n * import { CampaignNotFoundError } from 'daytona-wildberries-typescript-sdk';\n *\n * try {\n *   await sdk.promotion.startCampaign(123456);\n * } catch (error) {\n *   if (error instanceof CampaignNotFoundError) {\n *     console.error('Campaign does not exist:', error.message);\n *     // Verify campaign ID and try again\n *   }\n * }\n * ```\n */\nexport class CampaignNotFoundError extends WBAPIError {\n  /**\n   * Campaign ID that was not found\n   */\n  public readonly campaignId: number;\n\n  /**\n   * Creates a CampaignNotFoundError\n   *\n   * @param campaignId - ID of the campaign that wasn't found\n   * @param response - API response body if available\n   * @param requestId - Correlation ID for debugging\n   */\n  constructor(campaignId: number, response?: unknown, requestId?: string) {\n    super(`Campaign not found: ${campaignId}`, 404, response, requestId);\n    this.name = 'CampaignNotFoundError';\n    this.campaignId = campaignId;\n  }\n\n  /**\n   * Returns user-friendly error message with recovery guidance\n   *\n   * @returns Error message with actionable steps\n   */\n  getUserMessage(): string {\n    const baseMessage = super.getUserMessage();\n\n    const guidance = [\n      '\\n\\nTo resolve this issue:',\n      `1. Verify that campaign ID ${this.campaignId} is correct`,\n      '2. Check if the campaign was deleted',\n      '3. Ensure you have access to this campaign in your account',\n      '4. Use getCampaignCount() to list all available campaigns',\n    ].join('\\n');\n\n    return baseMessage + guidance;\n  }\n\n  /**\n   * Custom JSON serialization\n   */\n  toJSON(): {\n    name: string;\n    message: string;\n    statusCode: number;\n    campaignId: number;\n    response?: unknown;\n    requestId?: string;\n  } {\n    return {\n      ...super.toJSON(),\n      statusCode: 404,\n      campaignId: this.campaignId,\n    };\n  }\n}\n\n/**\n * Error thrown when bid amount is invalid or below minimum.\n *\n * This error occurs when:\n * - Bid is below the minimum required amount\n * - Bid format is incorrect\n * - Bid exceeds maximum allowed amount\n *\n * @example\n * ```typescript\n * import { InvalidBidError } from 'daytona-wildberries-typescript-sdk';\n *\n * try {\n *   await sdk.promotion.updateAuctionBids({\n *     bids: [{ advert_id: 123, nm_bids: [{ nm_id: 456, bid: 50, placement: 'search' }] }]\n *   });\n * } catch (error) {\n *   if (error instanceof InvalidBidError) {\n *     console.error(`Minimum bid is ${error.minBid}`);\n *     // Increase bid amount and retry\n *   }\n * }\n * ```\n */\nexport class InvalidBidError extends ValidationError {\n  /**\n   * Minimum bid amount required (if available)\n   */\n  public readonly minBid?: number;\n\n  /**\n   * Maximum bid amount allowed (if applicable)\n   */\n  public readonly maxBid?: number;\n\n  /**\n   * Current bid amount that was rejected\n   */\n  public readonly currentBid?: number;\n\n  /**\n   * Creates an InvalidBidError\n   *\n   * @param message - Error message describing the bid validation failure\n   * @param context - Additional context (minBid, maxBid, currentBid)\n   * @param response - API response body if available\n   * @param requestId - Correlation ID for debugging\n   */\n  constructor(\n    message: string,\n    context?: {\n      field?: string;\n      minBid?: number;\n      maxBid?: number;\n      currentBid?: number;\n    },\n    response?: unknown,\n    requestId?: string\n  ) {\n    const fieldErrors = context?.field ? { [context.field]: message } : { bid: message };\n\n    super(message, fieldErrors, 400, response, requestId);\n    this.name = 'InvalidBidError';\n    this.minBid = context?.minBid;\n    this.maxBid = context?.maxBid;\n    this.currentBid = context?.currentBid;\n  }\n\n  /**\n   * Returns user-friendly error message with bid requirements\n   *\n   * @returns Error message with specific bid constraints\n   */\n  getUserMessage(): string {\n    const baseMessage = super.getUserMessage();\n\n    const bidInfo: string[] = [];\n\n    if (this.minBid !== undefined) {\n      bidInfo.push(`Minimum bid: ${this.minBid} руб.`);\n    }\n\n    if (this.maxBid !== undefined) {\n      bidInfo.push(`Maximum bid: ${this.maxBid} руб.`);\n    }\n\n    if (this.currentBid !== undefined) {\n      bidInfo.push(`Your bid: ${this.currentBid} руб.`);\n    }\n\n    if (bidInfo.length > 0) {\n      const guidance = [\n        '\\n\\nBid requirements:',\n        ...bidInfo.map((info) => `  - ${info}`),\n        '\\nPlease adjust your bid to meet these requirements.',\n      ].join('\\n');\n\n      return baseMessage + guidance;\n    }\n\n    return baseMessage;\n  }\n\n  /**\n   * Custom JSON serialization\n   */\n  toJSON(): {\n    name: string;\n    message: string;\n    statusCode: number;\n    fieldErrors?: Record<string, string>;\n    minBid?: number;\n    maxBid?: number;\n    currentBid?: number;\n    response?: unknown;\n    requestId?: string;\n  } {\n    return {\n      ...super.toJSON(),\n      minBid: this.minBid,\n      maxBid: this.maxBid,\n      currentBid: this.currentBid,\n    };\n  }\n}\n\n/**\n * Error thrown when campaign budget is exceeded or insufficient.\n *\n * This error occurs when:\n * - Requested operation would exceed campaign budget\n * - Insufficient funds in account for deposit\n * - Budget limit reached for billing period\n *\n * @example\n * ```typescript\n * import { BudgetExceededError } from 'daytona-wildberries-typescript-sdk';\n *\n * try {\n *   await sdk.promotion.createBudgetDeposit({ sum: 50000 }, { id: 123 });\n * } catch (error) {\n *   if (error instanceof BudgetExceededError) {\n *     console.error(`Budget exceeded: ${error.message}`);\n *     console.error(`Available: ${error.availableBudget}, Required: ${error.requiredBudget}`);\n *   }\n * }\n * ```\n */\nexport class BudgetExceededError extends WBAPIError {\n  /**\n   * Available budget amount\n   */\n  public readonly availableBudget?: number;\n\n  /**\n   * Required budget amount for the operation\n   */\n  public readonly requiredBudget?: number;\n\n  /**\n   * Creates a BudgetExceededError\n   *\n   * @param message - Error message describing the budget issue\n   * @param context - Budget information (available, required)\n   * @param response - API response body if available\n   * @param requestId - Correlation ID for debugging\n   */\n  constructor(\n    message: string,\n    context?: {\n      availableBudget?: number;\n      requiredBudget?: number;\n    },\n    response?: unknown,\n    requestId?: string\n  ) {\n    super(message, 400, response, requestId);\n    this.name = 'BudgetExceededError';\n    this.availableBudget = context?.availableBudget;\n    this.requiredBudget = context?.requiredBudget;\n  }\n\n  /**\n   * Returns user-friendly error message with budget details\n   *\n   * @returns Error message with budget information\n   */\n  getUserMessage(): string {\n    const baseMessage = super.getUserMessage();\n\n    const budgetInfo: string[] = [];\n\n    if (this.availableBudget !== undefined) {\n      budgetInfo.push(`Available budget: ${this.availableBudget} руб.`);\n    }\n\n    if (this.requiredBudget !== undefined) {\n      budgetInfo.push(`Required budget: ${this.requiredBudget} руб.`);\n    }\n\n    if (budgetInfo.length > 0) {\n      const guidance = [\n        '\\n\\nBudget information:',\n        ...budgetInfo.map((info) => `  - ${info}`),\n        '\\nTo resolve this issue:',\n        '1. Check your account balance using getAdvBalance()',\n        '2. Add funds to your advertising account',\n        '3. Reduce the requested budget or bid amounts',\n        '4. Contact Wildberries support for account limit increases',\n      ].join('\\n');\n\n      return baseMessage + guidance;\n    }\n\n    const guidance = [\n      '\\n\\nTo resolve this issue:',\n      '1. Check your account balance using getAdvBalance()',\n      '2. Add funds to your advertising account',\n      '3. Verify campaign budget limits',\n    ].join('\\n');\n\n    return baseMessage + guidance;\n  }\n\n  /**\n   * Custom JSON serialization\n   */\n  toJSON(): {\n    name: string;\n    message: string;\n    statusCode: number;\n    availableBudget?: number;\n    requiredBudget?: number;\n    response?: unknown;\n    requestId?: string;\n  } {\n    return {\n      ...super.toJSON(),\n      statusCode: 400,\n      availableBudget: this.availableBudget,\n      requiredBudget: this.requiredBudget,\n    };\n  }\n}\n\n/**\n * Error thrown when attempting invalid campaign state transitions.\n *\n * Campaign lifecycle states:\n * - `-1`: Deleted (being deleted, will complete in 10 minutes)\n * - `4`: Ready to launch\n * - `7`: Completed\n * - `8`: Cancelled\n * - `9`: Active\n * - `11`: Paused\n *\n * Valid transitions:\n * - Ready (4) → Active (9) via startCampaign()\n * - Active (9) → Paused (11) via pauseCampaign()\n * - Paused (11) → Active (9) via startCampaign()\n * - Active/Paused → Completed (7) via stopCampaign()\n *\n * @example\n * ```typescript\n * import { InvalidCampaignStateError } from 'daytona-wildberries-typescript-sdk';\n *\n * try {\n *   // Trying to start an already active campaign\n *   await sdk.promotion.startCampaign(123);\n * } catch (error) {\n *   if (error instanceof InvalidCampaignStateError) {\n *     console.error(`Cannot ${error.attemptedAction} campaign in ${error.currentState} state`);\n *     console.error('Valid states:', error.validStates);\n *   }\n * }\n * ```\n */\nexport class InvalidCampaignStateError extends WBAPIError {\n  /**\n   * Current campaign state\n   */\n  public readonly currentState: string;\n\n  /**\n   * Action that was attempted\n   */\n  public readonly attemptedAction: string;\n\n  /**\n   * List of valid states for the attempted action\n   */\n  public readonly validStates?: string[];\n\n  /**\n   * Creates an InvalidCampaignStateError\n   *\n   * @param currentState - Current state of the campaign\n   * @param attemptedAction - Action that was attempted (start, pause, stop, delete)\n   * @param validStates - Optional list of valid states for this action\n   * @param response - API response body if available\n   * @param requestId - Correlation ID for debugging\n   */\n  constructor(\n    currentState: string,\n    attemptedAction: string,\n    validStates?: string[],\n    response?: unknown,\n    requestId?: string\n  ) {\n    super(`Cannot ${attemptedAction} campaign in ${currentState} state`, 400, response, requestId);\n    this.name = 'InvalidCampaignStateError';\n    this.currentState = currentState;\n    this.attemptedAction = attemptedAction;\n    this.validStates = validStates;\n  }\n\n  /**\n   * Returns user-friendly error message with state transition guidance\n   *\n   * @returns Error message with valid state transitions\n   */\n  getUserMessage(): string {\n    const baseMessage = super.getUserMessage();\n\n    const stateGuide: string[] = [\n      '\\n\\nCampaign state information:',\n      `  - Current state: ${this.currentState}`,\n    ];\n\n    if (this.validStates && this.validStates.length > 0) {\n      stateGuide.push(\n        `  - Valid states for ${this.attemptedAction}: ${this.validStates.join(', ')}`\n      );\n    }\n\n    const transitionGuide = [\n      '\\nValid state transitions:',\n      '  - Ready (4) → Active (9): Use startCampaign()',\n      '  - Active (9) → Paused (11): Use pauseCampaign()',\n      '  - Paused (11) → Active (9): Use startCampaign()',\n      '  - Active/Paused → Completed (7): Use stopCampaign()',\n      '\\nTo resolve this issue:',\n      '1. Check current campaign state using getCampaigns() or getAuctionAdverts()',\n      '2. Ensure campaign is in a valid state for this operation',\n      '3. Review campaign lifecycle documentation',\n    ].join('\\n');\n\n    return baseMessage + stateGuide.join('\\n') + transitionGuide;\n  }\n\n  /**\n   * Custom JSON serialization\n   */\n  toJSON(): {\n    name: string;\n    message: string;\n    statusCode: number;\n    currentState: string;\n    attemptedAction: string;\n    validStates?: string[];\n    response?: unknown;\n    requestId?: string;\n  } {\n    return {\n      ...super.toJSON(),\n      statusCode: 400,\n      currentState: this.currentState,\n      attemptedAction: this.attemptedAction,\n      validStates: this.validStates,\n    };\n  }\n}\n","/**\n * In-Store Pickup specific error classes\n *\n * These errors handle failures specific to click & collect order operations,\n * including order state transitions, customer verification, and metadata management.\n *\n * @module errors/in-store-pickup-errors\n */\n\nimport { WBAPIError } from './base-error';\n\n/**\n * Error thrown when a pickup order is not found\n *\n * **HTTP Status**: 404\n * **Retry**: No (permanent failure)\n *\n * @example\n * ```typescript\n * try {\n *   await sdk.inStorePickup.confirmOrder(999999);\n * } catch (error) {\n *   if (error instanceof PickupOrderNotFoundError) {\n *     console.error(`Order ${error.orderId} not found`);\n *     // Handle order not found scenario\n *   }\n * }\n * ```\n */\nexport class PickupOrderNotFoundError extends WBAPIError {\n  /**\n   * Creates a new PickupOrderNotFoundError\n   *\n   * @param orderId - ID of the order that was not found\n   * @param requestId - Optional request ID from API response\n   */\n  constructor(\n    public readonly orderId: number,\n    requestId?: string\n  ) {\n    super(\n      `Pickup order not found: ${orderId}`,\n      404,\n      {\n        orderId,\n        errorType: 'OrderNotFound',\n      },\n      requestId\n    );\n    this.name = 'PickupOrderNotFoundError';\n  }\n\n  /**\n   * Returns user-friendly error message with recovery guidance\n   */\n  override getUserMessage(): string {\n    return `Pickup order ${this.orderId} was not found. Please verify the order ID and try again. The order may have been cancelled or does not exist.`;\n  }\n}\n\n/**\n * Error thrown when an order state transition is invalid\n *\n * **HTTP Status**: 409 Conflict\n * **Retry**: No (permanent failure - requires state correction)\n * **Rate Limit**: 409 responses count as 10 requests!\n *\n * This error occurs when attempting to transition an order to a state that is\n * not valid given its current state (e.g., trying to prepare an order that\n * hasn't been confirmed yet).\n *\n * **Valid State Transitions**:\n * - `new` → `confirm` (confirmOrder)\n * - `confirm` → `prepare` (prepareOrder)\n * - `prepare` → `receive` (receiveOrder) - terminal state\n * - `prepare` → `reject` (rejectOrder) - terminal state\n * - Any → `cancel` (cancelOrder) - terminal state\n *\n * @example\n * ```typescript\n * try {\n *   // Trying to prepare order without confirming first\n *   await sdk.inStorePickup.prepareOrder(12345);\n * } catch (error) {\n *   if (error instanceof InvalidOrderStateError) {\n *     console.error(`Cannot ${error.attemptedAction} order ${error.orderId}`);\n *     console.error(`Current state: ${error.currentState}`);\n *     console.error('Recovery:', error.getUserMessage());\n *\n *     // Get current status and retry with correct action\n *     const statuses = await sdk.inStorePickup.getOrderStatuses([error.orderId]);\n *     const currentState = statuses.orders[0]?.supplierStatus;\n *     // Handle based on current state\n *   }\n * }\n * ```\n */\nexport class InvalidOrderStateError extends WBAPIError {\n  /**\n   * Creates a new InvalidOrderStateError\n   *\n   * @param orderId - ID of the order with invalid state\n   * @param currentState - Current state of the order (if known)\n   * @param attemptedAction - Action that was attempted (e.g., \"prepare\", \"receive\")\n   * @param requestId - Optional request ID from API response\n   */\n  constructor(\n    public readonly orderId: number,\n    public readonly currentState: string | undefined,\n    public readonly attemptedAction: string,\n    requestId?: string\n  ) {\n    const stateInfo = currentState ? ` in ${currentState} state` : '';\n    super(\n      `Cannot ${attemptedAction} order ${orderId}${stateInfo}. Invalid state transition.`,\n      409,\n      {\n        orderId,\n        currentState,\n        attemptedAction,\n        errorType: 'StatusMismatch',\n      },\n      requestId\n    );\n    this.name = 'InvalidOrderStateError';\n  }\n\n  /**\n   * Returns user-friendly error message with recovery guidance\n   */\n  override getUserMessage(): string {\n    const stateMsg = this.currentState\n      ? `The order is currently in \"${this.currentState}\" state and`\n      : 'The order';\n\n    return (\n      `${stateMsg} cannot be transitioned to \"${this.attemptedAction}\". ` +\n      `Please check the current order status using getOrderStatuses() and ` +\n      `ensure you follow the correct state transition sequence: ` +\n      `new → confirm → prepare → receive/reject. ` +\n      `Note: This 409 response counts as 10 requests toward your rate limit.`\n    );\n  }\n}\n\n/**\n * Error thrown when customer identity verification fails\n *\n * **HTTP Status**: 409 Conflict\n * **Retry**: No (permanent failure - requires correct passcode)\n * **Rate Limit**: 409 responses count as 10 requests!\n *\n * This error occurs when the passcode provided for identity verification does\n * not match the customer's order code. The customer needs to provide the correct\n * passcode from their Wildberries app.\n *\n * @example\n * ```typescript\n * try {\n *   const result = await sdk.inStorePickup.verifyCustomerIdentity({\n *     orderCode: '21117866-0006',\n *     passcode: '1234'\n *   });\n * } catch (error) {\n *   if (error instanceof CustomerVerificationError) {\n *     console.error('Verification failed:', error.getUserMessage());\n *     // Ask customer to check their app for correct passcode\n *     // Note: Be careful not to exceed rate limits (30 req/min)\n *   }\n * }\n * ```\n */\nexport class CustomerVerificationError extends WBAPIError {\n  /**\n   * Creates a new CustomerVerificationError\n   *\n   * @param orderCode - Customer's order code that failed verification\n   * @param message - Detailed error message from API\n   * @param requestId - Optional request ID from API response\n   */\n  constructor(\n    public readonly orderCode: string,\n    message: string,\n    requestId?: string\n  ) {\n    super(\n      `Customer verification failed for order ${orderCode}: ${message}`,\n      409,\n      {\n        orderCode,\n        errorType: 'InvalidPasscode',\n      },\n      requestId\n    );\n    this.name = 'CustomerVerificationError';\n  }\n\n  /**\n   * Returns user-friendly error message with recovery guidance\n   */\n  override getUserMessage(): string {\n    return (\n      `Customer identity verification failed for order ${this.orderCode}. ` +\n      `The passcode provided does not match. Please ask the customer to check ` +\n      `their Wildberries app for the correct passcode. ` +\n      `Note: This 409 response counts as 10 requests toward your rate limit. ` +\n      `Be careful not to exceed the 30 requests/minute limit for this endpoint.`\n    );\n  }\n}\n\n/**\n * Error thrown when product metadata validation fails\n *\n * **HTTP Status**: 409 Conflict (metadata update failures)\n * **Retry**: No (permanent failure - requires correct data or order state)\n * **Rate Limit**: 409 responses count as 10 requests!\n *\n * This error occurs when attempting to set metadata (SGTIN, UIN, IMEI, GTIN) codes\n * but the operation fails due to:\n * - Invalid code format\n * - Order not in `confirm` status\n * - Metadata type not in order's `requiredMeta` list\n * - Delivery not by WB (for UIN, IMEI, GTIN)\n *\n * @example\n * ```typescript\n * try {\n *   await sdk.inStorePickup.setSGTINCode(12345, ['invalid-code']);\n * } catch (error) {\n *   if (error instanceof MetadataValidationError) {\n *     console.error(`Cannot set ${error.codeType}:`, error.getUserMessage());\n *\n *     // Check order status\n *     const statuses = await sdk.inStorePickup.getOrderStatuses([12345]);\n *     console.log('Current status:', statuses.orders[0].supplierStatus);\n *\n *     // Check required metadata\n *     const newOrders = await sdk.inStorePickup.getNewOrders();\n *     const order = newOrders.orders.find(o => o.id === 12345);\n *     console.log('Required metadata:', order?.requiredMeta);\n *   }\n * }\n * ```\n */\nexport class MetadataValidationError extends WBAPIError {\n  /**\n   * Creates a new MetadataValidationError\n   *\n   * @param codeType - Type of metadata code (SGTIN, UIN, IMEI, GTIN)\n   * @param orderId - ID of the order for which metadata update failed\n   * @param message - Detailed error message from API\n   * @param requestId - Optional request ID from API response\n   */\n  constructor(\n    public readonly codeType: 'SGTIN' | 'UIN' | 'IMEI' | 'GTIN',\n    public readonly orderId: number,\n    message: string,\n    requestId?: string\n  ) {\n    super(\n      message,\n      409,\n      {\n        codeType,\n        orderId,\n        errorType: 'FailedToUpdateMeta',\n      },\n      requestId\n    );\n    this.name = 'MetadataValidationError';\n  }\n\n  /**\n   * Returns user-friendly error message with recovery guidance\n   */\n  override getUserMessage(): string {\n    return (\n      `Failed to set ${this.codeType} metadata for order ${this.orderId}. ` +\n      `Please ensure: 1) Order is in \"confirm\" status, ` +\n      `2) \"${this.codeType.toLowerCase()}\" is in the order's requiredMeta list, ` +\n      `3) Code format is valid, ` +\n      `4) For UIN/IMEI/GTIN: delivery is by WB. ` +\n      `Use getNewOrders() to check requiredMeta and getOrderStatuses() to check status. ` +\n      `Note: This 409 response counts as 10 requests toward your rate limit.`\n    );\n  }\n}\n","import { WBAPIError } from './base-error';\nimport type { MetaDetail } from '../types/orders-fbs.types';\n\n/**\n * Error thrown when `PATCH /api/v3/supplies/{supplyId}/deliver` returns HTTP 409\n * with marking-code validation failures in the `metaDetails` response array.\n *\n * From **2026-06-03**, Wildberries validates Честный Знак (Honest Sign) marking codes\n * server-side for B2C FBS orders. Codes must be passed **in full** — with GS separators\n * (ASCII 0x1D) and the cryptographic authenticity tail. Invalid codes trigger this error.\n *\n * ⚠️ **Rate-limit penalty**: every 409 response counts as **10 requests** against the\n * FBS supply/order budget. Use `sdk.ordersFBS.getOrdersMetaBulk()` for pre-flight\n * validation to avoid burning budget on repeated failures.\n *\n * @since 3.15.0\n * @see {@link https://dev.wildberries.ru/docs/openapi/orders-fbs} — Orders FBS API\n * @see [Migration guide](../../docs/guides/fbs-marking-code-validation.md)\n *\n * @example Narrowing with instanceof\n * ```typescript\n * import { MetaValidationFailError } from 'daytona-wildberries-typescript-sdk';\n *\n * try {\n *   await sdk.ordersFBS.updateSuppliesDeliver('WB-GI-1234');\n * } catch (err) {\n *   if (err instanceof MetaValidationFailError) {\n *     // Typed access to the failing marking codes\n *     err.metaDetails.forEach(d => {\n *       console.log(`key=${d.key} value=\"${d.value}\" decision=${d.decision}`);\n *     });\n *     // err is still instanceof WBAPIError — existing catch-all blocks still work\n *   }\n *   throw err;\n * }\n * ```\n */\nexport class MetaValidationFailError extends WBAPIError {\n  /**\n   * WB error code from the response body (e.g. `'MetaValidationFail'`).\n   * Defaults to `'Unknown'` when WB omits the code field.\n   */\n  public readonly code: string;\n\n  /**\n   * Array of individual marking-code validation failures.\n   * Each item exposes `key` (metadata type), `value` (the submitted code),\n   * and `decision` (`'invalid'` when the code failed validation).\n   */\n  public readonly metaDetails: MetaDetail[];\n\n  /**\n   * Creates a MetaValidationFailError\n   *\n   * @param message - Human-readable error message from the API response\n   * @param code - WB error code string (e.g. `'MetaValidationFail'`). Defaults to 'Unknown' when WB omits the code field.\n   * @param metaDetails - Array of individual validation failures\n   * @param response - Raw API response body\n   * @param requestId - Correlation ID for debugging and tracing\n   * @param origin - Origin service identifier from RFC 7807 problem+json responses\n   * @param timestamp - ISO 8601 timestamp from RFC 7807 problem+json responses\n   */\n  constructor(\n    message: string,\n    code: string,\n    metaDetails: MetaDetail[],\n    response?: unknown,\n    requestId?: string,\n    origin?: string,\n    timestamp?: string\n  ) {\n    super(message, 409, response, requestId, origin, timestamp);\n    this.name = 'MetaValidationFailError';\n    this.code = code;\n    // Defensive copy: prevents downstream mutation\n    this.metaDetails = [...metaDetails];\n  }\n\n  /**\n   * Returns a user-friendly error message listing the failing marking codes.\n   *\n   * @returns Error message with metaDetails summary and recovery guidance\n   */\n  getUserMessage(): string {\n    const baseMessage = super.getUserMessage();\n\n    const invalidItems = this.metaDetails.filter((d) => d.decision === 'invalid');\n    const requiredItems = this.metaDetails.filter((d) => d.decision === 'required');\n\n    const lines: string[] = [baseMessage];\n\n    if (invalidItems.length > 0) {\n      lines.push(\n        `\\n\\nInvalid marking codes (${invalidItems.length.toString()}):`,\n        ...invalidItems.map((d) => `  - ${d.key}: \"${d.value}\"`)\n      );\n    }\n\n    if (requiredItems.length > 0) {\n      lines.push(\n        `\\n\\nMissing required marking codes (${requiredItems.length.toString()}):`,\n        ...requiredItems.map((d) => `  - ${d.key}`)\n      );\n    }\n\n    lines.push(\n      '\\n\\nRecovery steps:',\n      '1. Use sdk.ordersFBS.getOrdersMetaBulk() to pre-flight check marking codes before deliver',\n      '2. Ensure marking codes include GS separators (ASCII 0x1D) and crypto-tail in full',\n      '3. Fix the flagged assembly tasks, then retry updateSuppliesDeliver()',\n      '\\n⚠️ Each 409 response counts as 10 requests against the rate-limit budget.'\n    );\n\n    return lines.join('\\n');\n  }\n\n  /**\n   * Custom JSON serialization to include metaDetails and code properties\n   *\n   * @returns Object representation including metaDetails and code\n   */\n  toJSON(): {\n    name: string;\n    message: string;\n    statusCode?: number;\n    code: string;\n    metaDetails: MetaDetail[];\n    response?: unknown;\n    requestId?: string;\n  } {\n    return {\n      ...super.toJSON(),\n      code: this.code,\n      metaDetails: this.metaDetails,\n    };\n  }\n}\n","/**\n * Rate Limiting with Token Bucket Algorithm\n *\n * This module implements automatic rate limiting for Wildberries API endpoints using\n * the token bucket algorithm. Each endpoint can have independent rate limits configured\n * to prevent exceeding API quotas and avoid request throttling or bans.\n *\n * @module client/rate-limiter\n */\n\n/**\n * Configuration for rate limiting a specific endpoint.\n *\n * Rate limits follow the token bucket algorithm where:\n * - Each request consumes 1 token from the bucket\n * - Tokens refill at a steady rate based on `requestsPerMinute`\n * - The bucket can hold up to `burstLimit` tokens maximum\n * - Requests wait in queue when no tokens are available\n *\n * @example\n * ```typescript\n * // Strict limit: 1 request every 10 seconds\n * const strictLimit: RateLimitConfig = {\n *   requestsPerMinute: 6,      // 60s / 10s = 6 requests/minute\n *   intervalSeconds: 10,       // Minimum 10s between requests\n *   burstLimit: 1              // Cannot burst multiple requests\n * };\n *\n * // Burst-friendly: 20 requests/minute, can burst 10 initially\n * const burstLimit: RateLimitConfig = {\n *   requestsPerMinute: 20,\n *   burstLimit: 10             // Can send 10 rapid requests, then throttled\n * };\n *\n * // Simple rate limit: 5 requests/minute\n * const simpleLimit: RateLimitConfig = {\n *   requestsPerMinute: 5       // burstLimit defaults to 5\n * };\n * ```\n */\nexport interface RateLimitConfig {\n  /**\n   * Maximum number of requests allowed per 1-minute window.\n   *\n   * This determines the token refill rate:\n   * - refillRate = requestsPerMinute / 60000 (tokens per millisecond)\n   *\n   * @example 6 // Allows 6 requests per minute (1 request every 10 seconds)\n   * @example 20 // Allows 20 requests per minute (3 requests every second)\n   */\n  requestsPerMinute: number;\n\n  /**\n   * Optional minimum interval in seconds between requests.\n   *\n   * When specified, enforces a strict minimum time gap between consecutive requests.\n   * This is useful for endpoints with explicit interval requirements (e.g., \"20 seconds between requests\").\n   *\n   * @example 10 // Enforces 10-second minimum interval between requests\n   * @default undefined // No interval enforcement, only per-minute limit\n   */\n  intervalSeconds?: number;\n\n  /**\n   * Optional maximum number of tokens the bucket can hold (burst capacity).\n   *\n   * Allows sending multiple requests rapidly up to this limit before rate limiting kicks in.\n   * After consuming all burst tokens, requests are throttled to the `requestsPerMinute` rate.\n   *\n   * @example 10 // Can send 10 rapid requests, then limited to requestsPerMinute\n   * @default requestsPerMinute // Burst limit equals per-minute limit\n   */\n  burstLimit?: number;\n\n  /**\n   * Optional penalty multiplier for 409 (Conflict) responses.\n   *\n   * When a request receives a 409 response, this many tokens are consumed from the bucket\n   * instead of the default 1. This accounts for API-level penalties where conflict responses\n   * count as multiple requests toward the rate limit.\n   *\n   * @example 10 // In-store pickup: one 409 counts as 10 requests\n   * @example 10 // FBS/FBW: one 409 counts as 10 requests\n   * @default undefined // No penalty (409 counts as 1 request like any other)\n   */\n  penaltyMultiplier?: number;\n}\n\n/**\n * Mapping of endpoint keys to their rate limit configurations.\n *\n * Each key represents a unique API endpoint or operation (e.g., 'products.create', 'orders.list').\n * Keys are arbitrary strings defined by the SDK module implementations.\n *\n * @example\n * ```typescript\n * const limits: EndpointLimits = {\n *   'products.create': {\n *     requestsPerMinute: 6,\n *     intervalSeconds: 10,\n *     burstLimit: 1\n *   },\n *   'products.list': {\n *     requestsPerMinute: 20,\n *     burstLimit: 20\n *   },\n *   'orders.updateStatus': {\n *     requestsPerMinute: 10\n *   }\n * };\n * ```\n */\nexport type EndpointLimits = Record<string, RateLimitConfig>;\n\n/**\n * Internal token bucket implementation for rate limiting.\n *\n * Implements the token bucket algorithm where:\n * 1. A bucket holds up to `capacity` tokens\n * 2. Tokens refill at a steady `refillRate` over time\n * 3. Each request consumes 1 token\n * 4. Requests queue when no tokens are available\n * 5. Queued requests are processed FIFO when tokens become available\n *\n * This class is used internally by RateLimiter and not exported.\n *\n * @internal\n * @see {@link https://en.wikipedia.org/wiki/Token_bucket Token Bucket Algorithm}\n */\nclass _TokenBucket {\n  /**\n   * Current number of tokens available in the bucket.\n   * Starts at `capacity` and decreases with each request.\n   * Refills over time based on `refillRate`.\n   */\n  private tokens: number;\n\n  /**\n   * Maximum number of tokens the bucket can hold (burst capacity).\n   * Derived from config.burstLimit or config.requestsPerMinute.\n   */\n  private readonly capacity: number;\n\n  /**\n   * Rate at which tokens are added to the bucket (tokens per millisecond).\n   * Calculated as: requestsPerMinute / 60000\n   *\n   * @example\n   * // For 6 requests/minute:\n   * refillRate = 6 / 60000 = 0.0001 tokens/ms = 1 token/10000ms\n   */\n  private readonly refillRate: number;\n\n  /**\n   * Timestamp (milliseconds since epoch) of the last token refill operation.\n   * Used to calculate how many tokens to add based on elapsed time.\n   */\n  private lastRefill: number;\n\n  /**\n   * Queue of pending requests waiting for tokens to become available.\n   * Each item is a Promise resolve function that will be called when\n   * a token becomes available for that request.\n   *\n   * Requests are processed in FIFO order.\n   */\n  private readonly queue: (() => void)[];\n\n  /**\n   * Creates a new token bucket with the specified rate limit configuration.\n   *\n   * @param config - Rate limit configuration for this bucket\n   */\n  constructor(config: RateLimitConfig) {\n    this.capacity = config.burstLimit ?? config.requestsPerMinute;\n    this.tokens = this.capacity; // Start with full bucket\n    this.refillRate = config.requestsPerMinute / 60000; // tokens per millisecond\n    this.lastRefill = Date.now();\n    this.queue = [];\n  }\n\n  /**\n   * Refills tokens based on elapsed time since last refill.\n   *\n   * Tokens are added at the configured `refillRate` but never exceed `capacity`.\n   * This method is called before each token consumption attempt.\n   *\n   * @example\n   * // If refillRate is 0.0001 tokens/ms and 10000ms have elapsed:\n   * // tokensToAdd = 10000 * 0.0001 = 1 token\n   * // tokens = Math.min(capacity, currentTokens + 1)\n   */\n  private refill(): void {\n    const now = Date.now();\n    const elapsed = now - this.lastRefill;\n    const tokensToAdd = elapsed * this.refillRate;\n\n    this.tokens = Math.min(this.capacity, this.tokens + tokensToAdd);\n    this.lastRefill = now;\n  }\n\n  /**\n   * Attempts to consume a token for a request.\n   *\n   * If tokens are available, consumes one immediately and resolves.\n   * If no tokens are available, queues the request and returns a Promise\n   * that will resolve when a token becomes available.\n   *\n   * Queued requests are processed in FIFO order.\n   *\n   * @returns Promise that resolves when a token has been consumed\n   *\n   * @example\n   * ```typescript\n   * const bucket = new TokenBucket({ requestsPerMinute: 6, burstLimit: 1 });\n   *\n   * // First request: immediate (token available)\n   * await bucket.consume(); // Resolves immediately\n   *\n   * // Second request: queued (no tokens)\n   * await bucket.consume(); // Waits ~10 seconds for token refill\n   * ```\n   */\n  async consume(): Promise<void> {\n    this.refill();\n\n    if (this.tokens >= 1) {\n      this.tokens -= 1;\n      return; // Immediate execution\n    }\n\n    // Queue the request and wait for token availability\n    return new Promise<void>((resolve) => {\n      this.queue.push(resolve);\n      this.scheduleNextRelease();\n    });\n  }\n\n  /**\n   * Schedules the release of the next queued request when a token becomes available.\n   *\n   * Calculates the time until the next token will be available based on `refillRate`,\n   * then uses setTimeout to process the next queued request at that time.\n   *\n   * This method is called automatically when a request is queued.\n   *\n   * @private\n   */\n  private scheduleNextRelease(): void {\n    if (this.queue.length === 0) return;\n\n    // Calculate milliseconds until next token is available\n    const timeToNextToken = 1 / this.refillRate;\n\n    setTimeout(() => {\n      this.refill();\n\n      if (this.tokens >= 1 && this.queue.length > 0) {\n        this.tokens -= 1;\n        const resolve = this.queue.shift();\n        if (resolve) {\n          resolve();\n        }\n\n        // Schedule next release if queue has more requests\n        if (this.queue.length > 0) {\n          this.scheduleNextRelease();\n        }\n      }\n    }, timeToNextToken);\n  }\n\n  /**\n   * Get the current number of available tokens after refilling.\n   *\n   * This method triggers a refill and returns the current token count.\n   * Useful for monitoring and debugging.\n   *\n   * @returns Current number of available tokens\n   * @internal\n   */\n  getAvailableTokens(): number {\n    this.refill();\n    return this.tokens;\n  }\n}\n\n/**\n * Rate limiter for API endpoints using the token bucket algorithm.\n *\n * Manages per-endpoint rate limiting to prevent exceeding API quotas.\n * Each endpoint key (e.g., 'products.create', 'orders.list') can have\n * independent rate limit configurations.\n *\n * Features:\n * - Automatic request queueing when rate limit reached\n * - FIFO queue processing\n * - Per-endpoint configuration\n * - Dynamic configuration updates\n * - Zero external dependencies (in-memory state)\n *\n * @example\n * ```typescript\n * import { RateLimiter } from './rate-limiter';\n *\n * // Create rate limiter with predefined limits\n * const limiter = new RateLimiter({\n *   'products.create': {\n *     requestsPerMinute: 6,\n *     intervalSeconds: 10,\n *     burstLimit: 1\n *   },\n *   'orders.list': {\n *     requestsPerMinute: 5\n *   }\n * });\n *\n * // Wait for rate limit slot before making request\n * await limiter.waitForSlot('products.create');\n * // Request proceeds when token available\n *\n * // Endpoints without configured limits are unlimited\n * await limiter.waitForSlot('general.ping'); // Returns immediately\n * ```\n *\n * @example\n * ```typescript\n * // Create empty rate limiter and configure dynamically\n * const limiter = new RateLimiter();\n *\n * // Add rate limit for specific endpoint\n * limiter.configure('products.update', {\n *   requestsPerMinute: 10,\n *   burstLimit: 5\n * });\n *\n * await limiter.waitForSlot('products.update');\n * ```\n */\nexport class RateLimiter {\n  /**\n   * Map of endpoint keys to their token buckets.\n   * Buckets are created lazily when first accessed for an endpoint.\n   */\n  private readonly buckets = new Map<string, _TokenBucket>();\n\n  /**\n   * Rate limit configuration for each endpoint.\n   * Keys are endpoint identifiers, values are rate limit configs.\n   */\n  private readonly config: EndpointLimits;\n\n  /**\n   * Creates a new RateLimiter instance.\n   *\n   * @param config - Optional initial rate limit configuration.\n   *                 Can be empty and configured dynamically via configure().\n   *                 Defaults to empty object (no limits).\n   *\n   * @example\n   * ```typescript\n   * // With predefined limits\n   * const limiter = new RateLimiter({\n   *   'api.operation': { requestsPerMinute: 10 }\n   * });\n   *\n   * // Empty (configure later)\n   * const limiter = new RateLimiter();\n   * ```\n   */\n  constructor(config?: EndpointLimits) {\n    this.config = config ?? {};\n  }\n\n  /**\n   * Waits for a rate limit slot to become available for the specified endpoint.\n   *\n   * This method should be called before making an API request to ensure\n   * the request doesn't exceed the endpoint's rate limit.\n   *\n   * Behavior:\n   * - If no rate limit is configured for the endpoint key, returns immediately (unlimited)\n   * - If tokens are available, consumes one and returns immediately\n   * - If no tokens available, queues the request and waits until a token is available\n   * - Queued requests are processed in FIFO order\n   *\n   * @param key - Endpoint identifier (e.g., 'products.create', 'orders.list')\n   * @returns Promise that resolves when a rate limit slot is available\n   *\n   * @example\n   * ```typescript\n   * const limiter = new RateLimiter({\n   *   'products.create': { requestsPerMinute: 6, burstLimit: 1 }\n   * });\n   *\n   * // First request: immediate (token available)\n   * await limiter.waitForSlot('products.create');\n   * console.log('Request 1 can proceed');\n   *\n   * // Second request: queued (no tokens, waits ~10 seconds)\n   * await limiter.waitForSlot('products.create');\n   * console.log('Request 2 can proceed');\n   *\n   * // Unlimited endpoint: always immediate\n   * await limiter.waitForSlot('general.ping');\n   * console.log('Unlimited request proceeds immediately');\n   * ```\n   *\n   * @example\n   * ```typescript\n   * // Multiple concurrent requests are queued in FIFO order\n   * const promises = [\n   *   limiter.waitForSlot('api.operation'),\n   *   limiter.waitForSlot('api.operation'),\n   *   limiter.waitForSlot('api.operation')\n   * ];\n   *\n   * // First request proceeds immediately (token available)\n   * // Second and third queue and wait in order\n   * await Promise.all(promises);\n   * ```\n   */\n  async waitForSlot(key: string): Promise<void> {\n    const bucket = this.getOrCreateBucket(key);\n    if (!bucket) {\n      return; // No rate limit configured for this endpoint\n    }\n\n    await bucket.consume();\n  }\n\n  /**\n   * Gets or creates a token bucket for the specified endpoint.\n   *\n   * Buckets are created lazily on first access and reused for subsequent requests.\n   * If no rate limit is configured for the endpoint, returns null (unlimited).\n   *\n   * @param key - Endpoint identifier\n   * @returns TokenBucket instance or null if unlimited\n   * @private\n   */\n  private getOrCreateBucket(key: string): _TokenBucket | null {\n    if (this.buckets.has(key)) {\n      return this.buckets.get(key) ?? null;\n    }\n\n    if (!(key in this.config)) {\n      return null; // No rate limit for this endpoint\n    }\n\n    const config = this.config[key];\n    const bucket = new _TokenBucket(config);\n    this.buckets.set(key, bucket);\n    return bucket;\n  }\n\n  /**\n   * Dynamically configure or update rate limit for an endpoint.\n   *\n   * If a bucket already exists for this endpoint, it will be reset\n   * with the new configuration. Existing queued requests will continue\n   * with the old bucket until completed.\n   *\n   * @param key - Endpoint identifier\n   * @param config - Rate limit configuration\n   *\n   * @example\n   * ```typescript\n   * const limiter = new RateLimiter();\n   *\n   * // Add rate limit for endpoint\n   * limiter.configure('products.create', {\n   *   requestsPerMinute: 6,\n   *   intervalSeconds: 10,\n   *   burstLimit: 1\n   * });\n   *\n   * // Update existing rate limit\n   * limiter.configure('products.create', {\n   *   requestsPerMinute: 10  // Increase limit\n   * });\n   * ```\n   */\n  configure(key: string, config: RateLimitConfig): void {\n    this.config[key] = config;\n    // Reset bucket if it exists to apply new config\n    this.buckets.delete(key);\n  }\n\n  /**\n   * Get the current rate limit configuration for an endpoint.\n   *\n   * @param key - Endpoint identifier\n   * @returns Rate limit configuration or undefined if no limit configured\n   *\n   * @example\n   * ```typescript\n   * const config = limiter.getConfiguration('products.create');\n   * if (config) {\n   *   console.log(`Limit: ${config.requestsPerMinute} req/min`);\n   * }\n   * ```\n   */\n  getConfiguration(key: string): RateLimitConfig | undefined {\n    return key in this.config ? this.config[key] : undefined;\n  }\n\n  /**\n   * Check if a request can proceed immediately without queueing.\n   *\n   * This is a non-blocking check useful for monitoring or debugging.\n   * Does NOT consume a token.\n   *\n   * @param key - Endpoint identifier\n   * @returns true if request can proceed immediately, false if would queue\n   *\n   * @example\n   * ```typescript\n   * if (limiter.canProceed('products.create')) {\n   *   console.log('Request will execute immediately');\n   * } else {\n   *   console.log('Request will be queued');\n   * }\n   *\n   * // Still need to call waitForSlot before making request\n   * await limiter.waitForSlot('products.create');\n   * ```\n   */\n  canProceed(key: string): boolean {\n    // Get or create bucket if configuration exists\n    const bucket = this.getOrCreateBucket(key);\n    if (!bucket) {\n      return true; // No configuration = no limit\n    }\n\n    return bucket.getAvailableTokens() >= 1;\n  }\n\n  /**\n   * Get the number of tokens currently available for an endpoint.\n   *\n   * This is a monitoring/debugging method. The value can change rapidly\n   * as tokens are consumed and refilled.\n   *\n   * @param key - Endpoint identifier\n   * @returns Number of available tokens, or Infinity if unlimited\n   *\n   * @example\n   * ```typescript\n   * const remaining = limiter.getRemainingTokens('products.create');\n   * console.log(`${remaining} requests can execute immediately`);\n   * ```\n   */\n  getRemainingTokens(key: string): number {\n    // Get or create bucket if configuration exists\n    const bucket = this.getOrCreateBucket(key);\n    if (!bucket) {\n      return Infinity; // No configuration = unlimited\n    }\n\n    return bucket.getAvailableTokens();\n  }\n\n  /**\n   * Reset rate limiting state for an endpoint or all endpoints.\n   *\n   * Clears token buckets and queued requests. Use with caution as\n   * queued requests will never resolve (they'll hang indefinitely).\n   *\n   * This is primarily a testing utility.\n   *\n   * @param key - Optional endpoint identifier. If omitted, resets all endpoints.\n   *\n   * @example\n   * ```typescript\n   * // Reset specific endpoint\n   * limiter.reset('products.create');\n   *\n   * // Reset all endpoints\n   * limiter.reset();\n   * ```\n   */\n  reset(key?: string): void {\n    if (key) {\n      this.buckets.delete(key);\n    } else {\n      this.buckets.clear();\n    }\n  }\n}\n","/**\n * Operation Metadata Registry\n *\n * This module provides metadata for SDK operations extracted from Swagger/OpenAPI specifications.\n * The metadata includes:\n * - `readonly`: Whether the operation is safe to retry (from x-readonly-method)\n * - `category`: API category for the operation (from x-category)\n * - `rateLimitKey`: Key used for rate limiting configuration\n *\n * **Use Cases:**\n * - Retry logic: Only retry operations marked as readonly=true\n * - Request routing: Route requests based on category to correct API domain\n * - Monitoring: Track operations by category for analytics\n *\n * @packageDocumentation\n * @module config/operation-metadata\n */\n\n/**\n * Metadata for a single SDK operation\n *\n * @example\n * ```typescript\n * import { operationMetadata, type OperationMetadata } from 'daytona-wildberries-typescript-sdk';\n *\n * const pingMeta = operationMetadata['general.ping'];\n * if (pingMeta.readonly) {\n *   // Safe to retry on transient failures\n * }\n * ```\n */\nexport interface OperationMetadata {\n  /**\n   * Whether the operation is readonly (safe to retry)\n   *\n   * Operations marked as readonly=true are idempotent and safe to retry\n   * on transient failures (network errors, timeouts, 5xx errors).\n   *\n   * Operations with readonly=false may have side effects (create, update, delete)\n   * and should NOT be automatically retried.\n   */\n  readonly: boolean;\n\n  /**\n   * API category for the operation\n   *\n   * Categories map to different API domains:\n   * - 'all': Can be used with any API domain (e.g., /ping)\n   * - 'content': https://content-api.wildberries.ru\n   * - 'marketplace': https://marketplace-api.wildberries.ru\n   * - 'discountsandprices': https://discounts-prices-api.wildberries.ru\n   * - 'commonapi': https://common-api.wildberries.ru\n   * - 'usermanagement': https://user-management-api.wildberries.ru\n   */\n  category: string;\n\n  /**\n   * Rate limit key for the operation\n   *\n   * This key is used to look up rate limit configuration in the rate limits registry.\n   * Format: '{module}.{operationName}'\n   */\n  rateLimitKey: string;\n}\n\n/**\n * Registry of operation metadata for all SDK operations\n *\n * Keys follow the pattern: '{module}.{methodName}'\n *\n * @example\n * ```typescript\n * import { operationMetadata, isOperationReadonly, getOperationCategory } from 'daytona-wildberries-typescript-sdk';\n *\n * // Direct access\n * const meta = operationMetadata['products.getParentAll'];\n * console.log(meta.readonly); // true\n * console.log(meta.category); // 'content'\n *\n * // Helper functions\n * if (isOperationReadonly('products.getParentAll')) {\n *   // Safe to retry\n * }\n *\n * const category = getOperationCategory('products.getParentAll');\n * // Returns 'content'\n * ```\n */\nexport const operationMetadata: Record<string, OperationMetadata> = {\n  // ============================================================================\n  // General Module (from 01-general.yaml)\n  // ============================================================================\n\n  /**\n   * Ping - connectivity check\n   * x-readonly-method: true, x-category: all\n   */\n  'general.ping': {\n    readonly: true,\n    category: 'all',\n    rateLimitKey: 'general.ping',\n  },\n\n  /**\n   * Get news - portal seller news\n   * x-readonly-method: true, x-category: commonapi\n   */\n  'general.news': {\n    readonly: true,\n    category: 'commonapi',\n    rateLimitKey: 'general.communicationsNews',\n  },\n\n  /**\n   * Get seller info - seller name and profile ID\n   * x-readonly-method: true, x-category: commonapi\n   */\n  'general.sellerInfo': {\n    readonly: true,\n    category: 'commonapi',\n    rateLimitKey: 'general.sellerInfo',\n  },\n\n  // ============================================================================\n  // Products Module - Categories, Subjects, Characteristics (from 02-products.yaml)\n  // ============================================================================\n\n  /**\n   * Get parent categories\n   * x-readonly-method: true, x-category: content\n   */\n  'products.getParentAll': {\n    readonly: true,\n    category: 'content',\n    rateLimitKey: 'products.contentObjectParentAll',\n  },\n\n  /**\n   * Get all subjects (categories with items)\n   * x-readonly-method: true, x-category: content\n   */\n  'products.getObjectAll': {\n    readonly: true,\n    category: 'content',\n    rateLimitKey: 'products.contentObjectAll',\n  },\n\n  /**\n   * Get subject characteristics\n   * x-readonly-method: true, x-category: content\n   */\n  'products.getObjectCharc': {\n    readonly: true,\n    category: 'content',\n    rateLimitKey: 'products.contentObjectCharcs',\n  },\n\n  /**\n   * Get color directory\n   * x-readonly-method: true, x-category: content\n   */\n  'products.getDirectoryColors': {\n    readonly: true,\n    category: 'content',\n    rateLimitKey: 'products.contentDirectoryColors',\n  },\n\n  /**\n   * Get gender/kind directory\n   * x-readonly-method: true, x-category: content\n   */\n  'products.getDirectoryKinds': {\n    readonly: true,\n    category: 'content',\n    rateLimitKey: 'products.contentDirectoryKinds',\n  },\n\n  /**\n   * Get countries directory\n   * x-readonly-method: true, x-category: content\n   */\n  'products.getDirectoryCountries': {\n    readonly: true,\n    category: 'content',\n    rateLimitKey: 'products.contentDirectoryCountries',\n  },\n\n  /**\n   * Get seasons directory\n   * x-readonly-method: true, x-category: content\n   */\n  'products.getDirectorySeasons': {\n    readonly: true,\n    category: 'content',\n    rateLimitKey: 'products.contentDirectorySeasons',\n  },\n\n  /**\n   * Get VAT rates directory\n   * x-readonly-method: true, x-category: content\n   */\n  'products.getDirectoryVat': {\n    readonly: true,\n    category: 'content',\n    rateLimitKey: 'products.contentDirectoryVat',\n  },\n\n  /**\n   * Get TNVED codes directory\n   * x-readonly-method: true, x-category: content\n   */\n  'products.getDirectoryTnved': {\n    readonly: true,\n    category: 'content',\n    rateLimitKey: 'products.contentDirectoryTnved',\n  },\n\n  /**\n   * Get brands by subject\n   * x-readonly-method: true, x-category: content\n   */\n  'products.getBrands': {\n    readonly: true,\n    category: 'content',\n    rateLimitKey: 'products.brands',\n  },\n\n  // ============================================================================\n  // Products Module - Tags (Labels)\n  // ============================================================================\n\n  /**\n   * Get content tags list\n   * x-readonly-method: true, x-category: content\n   */\n  'products.getContentTags': {\n    readonly: true,\n    category: 'content',\n    rateLimitKey: 'products.contentTags',\n  },\n\n  /**\n   * Create content tag\n   * x-readonly-method: false, x-category: content\n   */\n  'products.createContentTag': {\n    readonly: false,\n    category: 'content',\n    rateLimitKey: 'products.postContentTag',\n  },\n\n  /**\n   * Update content tag\n   * x-readonly-method: false, x-category: content\n   */\n  'products.updateContentTag': {\n    readonly: false,\n    category: 'content',\n    rateLimitKey: 'products.patchContentTag',\n  },\n\n  /**\n   * Delete content tag\n   * x-readonly-method: false, x-category: content\n   */\n  'products.deleteContentTag': {\n    readonly: false,\n    category: 'content',\n    rateLimitKey: 'products.deleteContentTag',\n  },\n\n  /**\n   * Link tags to nomenclature\n   * x-readonly-method: false, x-category: content\n   */\n  'products.createNomenclatureLink': {\n    readonly: false,\n    category: 'content',\n    rateLimitKey: 'products.postContentTagNomenclatureLink',\n  },\n\n  // ============================================================================\n  // Products Module - Product Cards\n  // ============================================================================\n\n  /**\n   * Get product cards list\n   * x-readonly-method: true, x-category: content\n   */\n  'products.getCardsList': {\n    readonly: true,\n    category: 'content',\n    rateLimitKey: 'products.postContentGetCardsList',\n  },\n\n  /**\n   * Get error list for failed card creation\n   * x-readonly-method: true, x-category: content\n   */\n  'products.createErrorList': {\n    readonly: true,\n    category: 'content',\n    rateLimitKey: 'products.postContentCardsErrorList',\n  },\n\n  /**\n   * Update product cards\n   * x-readonly-method: false, x-category: content\n   */\n  'products.createCardsUpdate': {\n    readonly: false,\n    category: 'content',\n    rateLimitKey: 'products.postContentCardsUpdate',\n  },\n\n  /**\n   * Merge/split product cards by imtID\n   * x-readonly-method: false, x-category: content\n   */\n  'products.createCardsMovenm': {\n    readonly: false,\n    category: 'content',\n    rateLimitKey: 'products.postContentCardsMoveNm',\n  },\n\n  /**\n   * Move cards to trash\n   * x-readonly-method: false, x-category: content\n   */\n  'products.createDeleteTrash': {\n    readonly: false,\n    category: 'content',\n    rateLimitKey: 'products.postContentCardsDeleteTrash',\n  },\n\n  /**\n   * Recover cards from trash\n   * x-readonly-method: false, x-category: content\n   */\n  'products.createCardsRecover': {\n    readonly: false,\n    category: 'content',\n    rateLimitKey: 'products.postContentCardsRecover',\n  },\n\n  /**\n   * Get trashed cards list\n   * x-readonly-method: true, x-category: content\n   */\n  'products.getTrashedCards': {\n    readonly: true,\n    category: 'content',\n    rateLimitKey: 'products.postContentGetCardsTrash',\n  },\n\n  /**\n   * Get card creation limits\n   * x-readonly-method: true, x-category: content\n   */\n  'products.getCardsLimits': {\n    readonly: true,\n    category: 'content',\n    rateLimitKey: 'products.contentCardsLimits',\n  },\n\n  /**\n   * Generate barcodes\n   * x-readonly-method: false, x-category: content\n   */\n  'products.createContentBarcode': {\n    readonly: false,\n    category: 'content',\n    rateLimitKey: 'products.postContentBarcodes',\n  },\n\n  /**\n   * Create product cards (upload)\n   * x-readonly-method: false, x-category: content\n   */\n  'products.createCardsUpload': {\n    readonly: false,\n    category: 'content',\n    rateLimitKey: 'products.postContentCardsUpload',\n  },\n\n  /**\n   * Create cards and join to existing imtID\n   * x-readonly-method: false, x-category: content\n   */\n  'products.createUploadAdd': {\n    readonly: false,\n    category: 'content',\n    rateLimitKey: 'products.postContentCardsUploadAdd',\n  },\n\n  // ============================================================================\n  // Products Module - Media\n  // ============================================================================\n\n  /**\n   * Upload media file\n   * x-readonly-method: false, x-category: content\n   */\n  'products.createMediaFile': {\n    readonly: false,\n    category: 'content',\n    rateLimitKey: 'products.postContentMediaFile',\n  },\n\n  /**\n   * Upload media by URLs\n   * x-readonly-method: false, x-category: content\n   */\n  'products.createMediaSave': {\n    readonly: false,\n    category: 'content',\n    rateLimitKey: 'products.postContentMediaSave',\n  },\n\n  // ============================================================================\n  // Products Module - Prices and Discounts\n  // ============================================================================\n\n  /**\n   * Set prices and discounts\n   * x-readonly-method: false, x-category: discountsandprices\n   */\n  'products.createUploadTask': {\n    readonly: false,\n    category: 'discountsandprices',\n    rateLimitKey: 'products.postUploadTask',\n  },\n\n  /**\n   * Set prices per size\n   * x-readonly-method: false, x-category: discountsandprices\n   */\n  'products.createTaskSize': {\n    readonly: false,\n    category: 'discountsandprices',\n    rateLimitKey: 'products.postUploadTaskSize',\n  },\n\n  /**\n   * Set WB Club discounts\n   * x-readonly-method: false, x-category: discountsandprices\n   */\n  'products.createTaskClubDiscount': {\n    readonly: false,\n    category: 'discountsandprices',\n    rateLimitKey: 'products.postUploadTaskClubDiscount',\n  },\n\n  /**\n   * Get processed upload status (history tasks)\n   * x-readonly-method: true, x-category: discountsandprices\n   */\n  'products.getHistoryTasks': {\n    readonly: true,\n    category: 'discountsandprices',\n    rateLimitKey: 'products.historyTasks',\n  },\n\n  /**\n   * Get processed upload details (goods history)\n   * x-readonly-method: true, x-category: discountsandprices\n   */\n  'products.getGoodsTask': {\n    readonly: true,\n    category: 'discountsandprices',\n    rateLimitKey: 'products.historyGoodsTask',\n  },\n\n  /**\n   * Get pending upload status (buffer tasks)\n   * x-readonly-method: true, x-category: discountsandprices\n   */\n  'products.getBufferTasks': {\n    readonly: true,\n    category: 'discountsandprices',\n    rateLimitKey: 'products.bufferTasks',\n  },\n\n  /**\n   * Get pending upload details (buffer goods)\n   * x-readonly-method: true, x-category: discountsandprices\n   */\n  'products.getBufferGoodsTask': {\n    readonly: true,\n    category: 'discountsandprices',\n    rateLimitKey: 'products.bufferGoodsTask',\n  },\n\n  /**\n   * Get goods with prices (filter)\n   * x-readonly-method: true, x-category: discountsandprices\n   */\n  'products.getGoodsFilter': {\n    readonly: true,\n    category: 'discountsandprices',\n    rateLimitKey: 'products.listGoodsFilter',\n  },\n\n  /**\n   * Get goods with prices by nmIDs\n   * x-readonly-method: false, x-category: discountsandprices\n   * Note: POST method but conceptually a read operation\n   */\n  'products.createGoodsFilter': {\n    readonly: false,\n    category: 'discountsandprices',\n    rateLimitKey: 'products.postListGoodsFilter',\n  },\n\n  /**\n   * Get size prices for a product\n   * x-readonly-method: true, x-category: discountsandprices\n   */\n  'products.getSizeNm': {\n    readonly: true,\n    category: 'discountsandprices',\n    rateLimitKey: 'products.listGoodsSizeNm',\n  },\n\n  /**\n   * Get quarantined goods\n   * x-readonly-method: true, x-category: discountsandprices\n   */\n  'products.getQuarantineGoods': {\n    readonly: true,\n    category: 'discountsandprices',\n    rateLimitKey: 'products.quarantineGoods',\n  },\n\n  // ============================================================================\n  // Products Module - Stocks (Marketplace)\n  // ============================================================================\n\n  /**\n   * Get stocks for a warehouse\n   * x-readonly-method: false, x-category: marketplace\n   * Note: POST method but conceptually a read operation\n   */\n  'products.getStocks': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'products.postStocks',\n  },\n\n  /**\n   * Update stocks for a warehouse\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'products.updateStock': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'products.putStocks',\n  },\n\n  /**\n   * Delete stocks for a warehouse\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'products.deleteStock': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'products.deleteStocks',\n  },\n\n  // ============================================================================\n  // Products Module - Warehouses (Marketplace)\n  // ============================================================================\n\n  /**\n   * Get WB offices/warehouses\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'products.offices': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'products.offices',\n  },\n\n  /**\n   * Get seller warehouses\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'products.warehouses': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'products.warehouses',\n  },\n\n  /**\n   * Create seller warehouse\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'products.createWarehouse': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'products.postWarehouses',\n  },\n\n  /**\n   * Update seller warehouse\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'products.updateWarehouse': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'products.putWarehouses',\n  },\n\n  /**\n   * Delete seller warehouse\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'products.deleteWarehouse': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'products.deleteWarehouses',\n  },\n\n  /**\n   * Get warehouse contacts\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'products.getWarehousesContact': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'products.dbwWarehousesContacts',\n  },\n\n  /**\n   * Update warehouse contacts\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'products.updateWarehousesContact': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'products.putDbwWarehousesContacts',\n  },\n\n  // ============================================================================\n  // User Management Module (from 01-general.yaml)\n  // ============================================================================\n\n  /**\n   * Create user invitation\n   * x-readonly-method: false, x-category: usermanagement\n   */\n  'userManagement.createInvite': {\n    readonly: false,\n    category: 'usermanagement',\n    rateLimitKey: 'userManagement.createInvite',\n  },\n\n  /**\n   * Get users list\n   * x-readonly-method: true, x-category: usermanagement\n   */\n  'userManagement.getUsers': {\n    readonly: true,\n    category: 'usermanagement',\n    rateLimitKey: 'userManagement.getUsers',\n  },\n\n  /**\n   * Update user access\n   * x-readonly-method: false, x-category: usermanagement\n   */\n  'userManagement.updateUserAccess': {\n    readonly: false,\n    category: 'usermanagement',\n    rateLimitKey: 'userManagement.updateUserAccess',\n  },\n\n  /**\n   * Delete user\n   * x-readonly-method: false, x-category: usermanagement\n   */\n  'userManagement.deleteUser': {\n    readonly: false,\n    category: 'usermanagement',\n    rateLimitKey: 'userManagement.deleteUser',\n  },\n\n  // ============================================================================\n  // Orders FBS Module (from 03-orders-fbs.yaml)\n  // ============================================================================\n\n  // Passes (Пропуска FBS)\n\n  /**\n   * Get list of warehouses that require a pass\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersFBS.getPassesOffices': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.passesOffices',\n  },\n\n  /**\n   * Get list of seller passes\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersFBS.passes': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.passes',\n  },\n\n  /**\n   * Create a seller pass\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersFBS.createPass': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.postPasses',\n  },\n\n  /**\n   * Update a seller pass\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersFBS.updatePass': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.putPasses',\n  },\n\n  /**\n   * Delete a seller pass\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersFBS.deletePass': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.deletePasses',\n  },\n\n  // Assembly Tasks (Сборочные задания FBS)\n\n  /**\n   * Get list of new assembly tasks\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersFBS.getOrdersNew': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.ordersNew',\n  },\n\n  /**\n   * Get assembly tasks information\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersFBS.orders': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.orders',\n  },\n\n  /**\n   * Get assembly task statuses (deprecated)\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersFBS.createOrdersStatu': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.postOrdersStatus',\n  },\n\n  /**\n   * Get assembly task statuses (new replacement method)\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersFBS.getOrderStatuses': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.postOrdersStatus',\n  },\n\n  /**\n   * Get all assembly tasks requiring reshipment\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersFBS.getOrdersReshipment': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.suppliesOrdersReshipment',\n  },\n\n  /**\n   * Cancel an assembly task\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersFBS.updateOrdersCancel': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.patchOrdersCancel',\n  },\n\n  /**\n   * Get assembly task stickers\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersFBS.createOrdersSticker': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.postOrdersStickers',\n  },\n\n  /**\n   * Get cross-border assembly task stickers\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersFBS.createStickersCrossBorder': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.postOrdersStickersCrossBorder',\n  },\n\n  /**\n   * Get cross-border sticker links (deprecated)\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersFBS.createOrdersExternalSticker': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.postFilesOrdersExternalStickers',\n  },\n\n  /**\n   * Get cross-border assembly task status history\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersFBS.createStatusHistory': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.postOrdersStatusHistory',\n  },\n\n  /**\n   * Get orders with client information (Turkey cross-border)\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersFBS.createOrdersClient': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.postOrdersClient',\n  },\n\n  // Metadata (Метаданные FBS)\n\n  /**\n   * Get metadata for multiple assembly tasks (bulk)\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersFBS.getOrdersMetaBulk': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.postMarketplaceOrdersMeta',\n  },\n\n  /**\n   * Get metadata for an assembly task (deprecated)\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersFBS.getOrdersMeta': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.postMarketplaceOrdersMeta',\n  },\n\n  /**\n   * Delete assembly task metadata\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersFBS.deleteOrdersMeta': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.deleteOrdersMeta',\n  },\n\n  /**\n   * Attach marking codes (SGTIN) to an assembly task\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersFBS.updateMetaSgtin': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.putOrdersMetaSgtin',\n  },\n\n  /**\n   * Attach UIN to an assembly task\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersFBS.updateMetaUin': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.putOrdersMetaUin',\n  },\n\n  /**\n   * Attach IMEI to an assembly task\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersFBS.updateMetaImei': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.putOrdersMetaImei',\n  },\n\n  /**\n   * Attach GTIN to an assembly task\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersFBS.updateMetaGtin': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.putOrdersMetaGtin',\n  },\n\n  /**\n   * Attach expiration date to an assembly task\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersFBS.updateMetaExpiration': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.putOrdersMetaExpiration',\n  },\n\n  /**\n   * Attach customs declaration number to an assembly task\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersFBS.setCustomsDeclaration': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.putOrdersMetaCustomsDeclaration',\n  },\n\n  // Supplies (Поставки FBS)\n\n  /**\n   * Get list of supplies\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersFBS.supplies': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.supplies',\n  },\n\n  /**\n   * Create a new supply\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersFBS.createSupply': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.postSupplies',\n  },\n\n  /**\n   * Add an assembly task to a supply (deprecated)\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersFBS.updateSuppliesOrder': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.patchSuppliesOrders',\n  },\n\n  /**\n   * Add multiple assembly tasks to a supply (bulk)\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersFBS.addOrdersToSupply': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.patchMarketplaceSuppliesOrders',\n  },\n\n  /**\n   * Get supply information\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersFBS.getSupply': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.getSupply',\n  },\n\n  /**\n   * Delete a supply\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersFBS.deleteSupply': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.deleteSupplies',\n  },\n\n  /**\n   * Get assembly tasks in a supply (deprecated)\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersFBS.getSuppliesOrder': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.suppliesOrders',\n  },\n\n  /**\n   * Get assembly task IDs in a supply\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersFBS.getSupplyOrderIds': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.getMarketplaceSuppliesOrderIds',\n  },\n\n  /**\n   * Transfer supply to delivery\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersFBS.updateSuppliesDeliver': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.patchSuppliesDeliver',\n  },\n\n  /**\n   * Get supply QR code\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersFBS.getSuppliesBarcode': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.suppliesBarcode',\n  },\n\n  /**\n   * Get list of supply boxes (trbx)\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersFBS.getSuppliesTrbx': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.suppliesTrbx',\n  },\n\n  /**\n   * Add boxes to a supply\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersFBS.createSuppliesTrbx': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.postSuppliesTrbx',\n  },\n\n  /**\n   * Delete boxes from a supply\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersFBS.deleteSuppliesTrbx': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.deleteSuppliesTrbx',\n  },\n\n  /**\n   * Get supply box stickers\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersFBS.createTrbxSticker': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-fbs.postSuppliesTrbxStickers',\n  },\n\n  // ============================================================================\n  // Orders DBS Module (from 04-orders-dbs.yaml)\n  // ============================================================================\n\n  // Assembly Tasks (Сборочные задания DBS)\n\n  /**\n   * Get list of new DBS assembly tasks\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersDBS.getNewOrders': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.getNewOrders',\n  },\n\n  /**\n   * Get completed DBS orders with pagination and date filtering\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersDBS.getOrders': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.getOrders',\n  },\n\n  /**\n   * Get paid delivery group information\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersDBS.getGroupsInfo': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.getGroupsInfo',\n  },\n\n  /**\n   * Get customer contact information for DBS orders\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersDBS.getClientInfo': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.getClientInfo',\n  },\n\n  /**\n   * Get B2B buyer information for DBS orders\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersDBS.getB2BInfo': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.getB2BInfo',\n  },\n\n  /**\n   * Get delivery dates for DBS orders\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersDBS.getDeliveryDates': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.getDeliveryDates',\n  },\n\n  // Metadata (Метаданные DBS)\n\n  /**\n   * Get order metadata (deprecated)\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersDBS.getMeta': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.getMeta',\n  },\n\n  /**\n   * Get metadata for multiple orders (bulk)\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersDBS.getMetaBulk': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.getMetaBulk',\n  },\n\n  /**\n   * Delete specific metadata from an order (deprecated)\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersDBS.deleteMeta': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.deleteMeta',\n  },\n\n  /**\n   * Delete metadata for multiple orders (bulk)\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersDBS.deleteMetaBulk': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.deleteMetaBulk',\n  },\n\n  /**\n   * Set SGTIN marking codes for an order (deprecated)\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersDBS.setSgtin': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.setMeta',\n  },\n\n  /**\n   * Set SGTIN codes for multiple orders (bulk)\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersDBS.setSgtinBulk': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.setSgtinBulk',\n  },\n\n  /**\n   * Set UIN code for an order (deprecated)\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersDBS.setUin': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.setMeta',\n  },\n\n  /**\n   * Set UIN codes for multiple orders (bulk)\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersDBS.setUinBulk': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.setUinBulk',\n  },\n\n  /**\n   * Set IMEI code for an order (deprecated)\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersDBS.setImei': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.setMeta',\n  },\n\n  /**\n   * Set IMEI codes for multiple orders (bulk)\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersDBS.setImeiBulk': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.setImeiBulk',\n  },\n\n  /**\n   * Set GTIN code for an order (deprecated)\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersDBS.setGtin': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.setMeta',\n  },\n\n  /**\n   * Set GTIN codes for multiple orders (bulk)\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersDBS.setGtinBulk': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.setGtinBulk',\n  },\n\n  /**\n   * Set customs declaration for an order (deprecated)\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersDBS.setCustomsDeclaration': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.setMeta',\n  },\n\n  /**\n   * Set customs declaration for multiple orders (bulk)\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersDBS.setCustomsDeclarationBulk': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.setCustomsDeclarationBulk',\n  },\n\n  // Status Management\n\n  /**\n   * Get order statuses (deprecated)\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersDBS.getStatuses': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.getStatuses',\n  },\n\n  /**\n   * Get order statuses (bulk)\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'ordersDBS.getStatusesBulk': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.getStatusesBulk',\n  },\n\n  /**\n   * Confirm order (deprecated)\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersDBS.confirm': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.confirm',\n  },\n\n  /**\n   * Confirm orders (bulk)\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersDBS.confirmBulk': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.confirmBulk',\n  },\n\n  /**\n   * Deliver order (deprecated)\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersDBS.deliver': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.deliver',\n  },\n\n  /**\n   * Deliver orders (bulk)\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersDBS.deliverBulk': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.deliverBulk',\n  },\n\n  /**\n   * Receive order (deprecated)\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersDBS.receive': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.receive',\n  },\n\n  /**\n   * Receive orders (bulk)\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersDBS.receiveBulk': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.receiveBulk',\n  },\n\n  /**\n   * Reject order (deprecated)\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersDBS.reject': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.reject',\n  },\n\n  /**\n   * Reject orders (bulk)\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersDBS.rejectBulk': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.rejectBulk',\n  },\n\n  /**\n   * Cancel order (deprecated)\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersDBS.cancel': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.cancel',\n  },\n\n  /**\n   * Cancel orders (bulk)\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'ordersDBS.cancelBulk': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'orders-dbs.cancelBulk',\n  },\n\n  // ============================================================================\n  // Orders FBW Module (from 07-orders-fbw.yaml)\n  // ============================================================================\n\n  /**\n   * Get acceptance coefficients (deprecated - moved to tariffs module)\n   * x-readonly-method: true, x-category: supplies\n   */\n  'ordersFBW.getAcceptanceCoefficients': {\n    readonly: true,\n    category: 'supplies',\n    rateLimitKey: 'orders-fbw.acceptanceCoefficients',\n  },\n\n  /**\n   * Get acceptance options\n   * x-readonly-method: true, x-category: supplies\n   */\n  'ordersFBW.createAcceptanceOption': {\n    readonly: true,\n    category: 'supplies',\n    rateLimitKey: 'orders-fbw.postAcceptanceOptions',\n  },\n\n  /**\n   * Get list of warehouses\n   * x-readonly-method: true, x-category: supplies\n   */\n  'ordersFBW.warehouses': {\n    readonly: true,\n    category: 'supplies',\n    rateLimitKey: 'orders-fbw.warehouses',\n  },\n\n  /**\n   * Get transit tariffs\n   * x-readonly-method: true, x-category: supplies\n   */\n  'ordersFBW.transitTariffs': {\n    readonly: true,\n    category: 'supplies',\n    rateLimitKey: 'orders-fbw.transitTariffs',\n  },\n\n  /**\n   * Get list of supplies\n   * x-readonly-method: true, x-category: supplies\n   */\n  'ordersFBW.listSupplies': {\n    readonly: true,\n    category: 'supplies',\n    rateLimitKey: 'orders-fbw.postSupplies',\n  },\n\n  /**\n   * Get list of supplies (deprecated alias)\n   * x-readonly-method: true, x-category: supplies\n   */\n  'ordersFBW.createSupply': {\n    readonly: true,\n    category: 'supplies',\n    rateLimitKey: 'orders-fbw.postSupplies',\n  },\n\n  /**\n   * Get supply details\n   * x-readonly-method: true, x-category: supplies\n   */\n  'ordersFBW.getSupply': {\n    readonly: true,\n    category: 'supplies',\n    rateLimitKey: 'orders-fbw.supplies',\n  },\n\n  /**\n   * Get supply goods\n   * x-readonly-method: true, x-category: supplies\n   */\n  'ordersFBW.getSuppliesGood': {\n    readonly: true,\n    category: 'supplies',\n    rateLimitKey: 'orders-fbw.suppliesGoods',\n  },\n\n  /**\n   * Get supply package info\n   * x-readonly-method: true, x-category: supplies\n   */\n  'ordersFBW.getSuppliesPackage': {\n    readonly: true,\n    category: 'supplies',\n    rateLimitKey: 'orders-fbw.suppliesPackage',\n  },\n\n  // ============================================================================\n  // Promotion Module (from 08-promotion/*.yaml)\n  // ============================================================================\n\n  // --- Campaigns (kampanii.yaml) ---\n\n  /**\n   * Get campaign count by status\n   * x-readonly-method: true, x-category: advert\n   */\n  'promotion.getPromotionCount': {\n    readonly: true,\n    category: 'advert',\n    rateLimitKey: 'promotion.advPromotionCount',\n  },\n\n  /**\n   * Get campaign information (POST for filtering)\n   * x-readonly-method: true, x-category: advert\n   */\n  'promotion.createPromotionAdvert': {\n    readonly: true,\n    category: 'advert',\n    rateLimitKey: 'promotion.postAdvPromotionAdverts',\n  },\n\n  /**\n   * Get manual bid campaigns (V0)\n   * x-readonly-method: true, x-category: advert\n   */\n  'promotion.getAuctionAdverts': {\n    readonly: true,\n    category: 'advert',\n    rateLimitKey: 'promotion.advAuctionAdverts',\n  },\n\n  /**\n   * Get campaigns V2 (replacement for deprecated endpoints)\n   * x-readonly-method: true, x-category: advert\n   */\n  'promotion.getAdvertsV2': {\n    readonly: true,\n    category: 'advert',\n    rateLimitKey: 'promotion.advertsV2',\n  },\n\n  // --- Campaign Creation (sozdanie-kampaniy.yaml) ---\n\n  /**\n   * Get configuration values\n   * x-readonly-method: true, x-category: advert\n   */\n  'promotion.getAdvConfig': {\n    readonly: true,\n    category: 'advert',\n    rateLimitKey: 'promotion.advConfig',\n  },\n\n  /**\n   * Get minimum bids for product cards (V0)\n   * x-readonly-method: true, x-category: advert\n   */\n  'promotion.createBidsMin': {\n    readonly: true,\n    category: 'advert',\n    rateLimitKey: 'promotion.postAdvBidsMin',\n  },\n\n  /**\n   * Get minimum bids for product cards (V1)\n   * x-readonly-method: true, x-category: advert\n   */\n  'promotion.getBidsMinV2': {\n    readonly: true,\n    category: 'advert',\n    rateLimitKey: 'promotion.bidsMinV1',\n  },\n\n  /**\n   * Create unified bid campaign (V1)\n   * x-readonly-method: false, x-category: advert\n   */\n  'promotion.createAdvSaveAd': {\n    readonly: false,\n    category: 'advert',\n    rateLimitKey: 'promotion.postAdvSaveAd',\n  },\n\n  /**\n   * Create campaign (V2)\n   * x-readonly-method: false, x-category: advert\n   */\n  'promotion.createSeacatSaveAd': {\n    readonly: false,\n    category: 'advert',\n    rateLimitKey: 'promotion.postAdvSeacatSaveAd',\n  },\n\n  /**\n   * Get subjects for campaigns\n   * x-readonly-method: true, x-category: advert\n   */\n  'promotion.getSupplierSubjects': {\n    readonly: true,\n    category: 'advert',\n    rateLimitKey: 'promotion.advSupplierSubjects',\n  },\n\n  /**\n   * Get product cards for campaigns\n   * x-readonly-method: true, x-category: advert\n   */\n  'promotion.createSupplierNm': {\n    readonly: true,\n    category: 'advert',\n    rateLimitKey: 'promotion.postAdvSupplierNms',\n  },\n\n  // --- Campaign Management (upravlenie-kampaniyami.yaml) ---\n\n  /**\n   * Delete campaign\n   * x-readonly-method: false, x-category: advert\n   */\n  'promotion.getAdvDelete': {\n    readonly: false,\n    category: 'advert',\n    rateLimitKey: 'promotion.advDelete',\n  },\n\n  /**\n   * Rename campaign\n   * x-readonly-method: false, x-category: advert\n   */\n  'promotion.createAdvRename': {\n    readonly: false,\n    category: 'advert',\n    rateLimitKey: 'promotion.postAdvRename',\n  },\n\n  /**\n   * Start campaign\n   * x-readonly-method: false, x-category: advert\n   */\n  'promotion.getAdvStart': {\n    readonly: false,\n    category: 'advert',\n    rateLimitKey: 'promotion.advStart',\n  },\n\n  /**\n   * Pause campaign\n   * x-readonly-method: false, x-category: advert\n   */\n  'promotion.getAdvPause': {\n    readonly: false,\n    category: 'advert',\n    rateLimitKey: 'promotion.advPause',\n  },\n\n  /**\n   * Stop campaign\n   * x-readonly-method: false, x-category: advert\n   */\n  'promotion.getAdvStop': {\n    readonly: false,\n    category: 'advert',\n    rateLimitKey: 'promotion.advStop',\n  },\n\n  /**\n   * Update bids (V0)\n   * x-readonly-method: false, x-category: advert\n   */\n  'promotion.updateAdvBid': {\n    readonly: false,\n    category: 'advert',\n    rateLimitKey: 'promotion.patchAdvBids',\n  },\n\n  /**\n   * Update bids (V1)\n   * x-readonly-method: false, x-category: advert\n   */\n  'promotion.updateBidsV2': {\n    readonly: false,\n    category: 'advert',\n    rateLimitKey: 'promotion.bidsV1',\n  },\n\n  /**\n   * Update placement for manual bid campaigns\n   * x-readonly-method: false, x-category: advert\n   */\n  'promotion.updateAuctionPlacement': {\n    readonly: false,\n    category: 'advert',\n    rateLimitKey: 'promotion.putAdvAuctionPlacements',\n  },\n\n  /**\n   * Update auction bids\n   * x-readonly-method: false, x-category: advert\n   */\n  'promotion.updateAuctionBid': {\n    readonly: false,\n    category: 'advert',\n    rateLimitKey: 'promotion.patchAdvAuctionBids',\n  },\n\n  /**\n   * Update product list in campaigns\n   * x-readonly-method: false, x-category: advert\n   */\n  'promotion.updateAuctionNm': {\n    readonly: false,\n    category: 'advert',\n    rateLimitKey: 'promotion.patchAdvAuctionNms',\n  },\n\n  // --- Finances (finansy.yaml) ---\n\n  /**\n   * Get promotion balance\n   * x-readonly-method: true, x-category: advert\n   */\n  'promotion.getAdvBalance': {\n    readonly: true,\n    category: 'advert',\n    rateLimitKey: 'promotion.advBalance',\n  },\n\n  /**\n   * Get campaign budget\n   * x-readonly-method: true, x-category: advert\n   */\n  'promotion.getAdvBudget': {\n    readonly: true,\n    category: 'advert',\n    rateLimitKey: 'promotion.advBudget',\n  },\n\n  /**\n   * Deposit campaign budget\n   * x-readonly-method: false, x-category: advert\n   */\n  'promotion.createBudgetDeposit': {\n    readonly: false,\n    category: 'advert',\n    rateLimitKey: 'promotion.postAdvBudgetDeposit',\n  },\n\n  /**\n   * Get expense history\n   * x-readonly-method: true, x-category: advert\n   */\n  'promotion.getAdvUpd': {\n    readonly: true,\n    category: 'advert',\n    rateLimitKey: 'promotion.advUpd',\n  },\n\n  /**\n   * Get payment history\n   * x-readonly-method: true, x-category: advert\n   */\n  'promotion.getAdvPayments': {\n    readonly: true,\n    category: 'advert',\n    rateLimitKey: 'promotion.advPayments',\n  },\n\n  // --- Campaign Parameters (parametry-kampaniy.yaml) ---\n\n  /**\n   * Set fixed phrase activity\n   * x-readonly-method: false, x-category: advert\n   */\n  'promotion.getSearchSetPlus': {\n    readonly: false,\n    category: 'advert',\n    rateLimitKey: 'promotion.advSearchSetPlus',\n  },\n\n  /**\n   * Set/remove fixed phrases\n   * x-readonly-method: false, x-category: advert\n   */\n  'promotion.createSearchSetPlu': {\n    readonly: false,\n    category: 'advert',\n    rateLimitKey: 'promotion.postAdvSearchSetPlus',\n  },\n\n  /**\n   * Set/remove minus-phrases for search campaigns\n   * x-readonly-method: false, x-category: advert\n   */\n  'promotion.createSearchSetExcluded': {\n    readonly: false,\n    category: 'advert',\n    rateLimitKey: 'promotion.postAdvSearchSetExcluded',\n  },\n\n  /**\n   * Set/remove minus-phrases for auto campaigns\n   * x-readonly-method: false, x-category: advert\n   */\n  'promotion.createAutoSetExcluded': {\n    readonly: false,\n    category: 'advert',\n    rateLimitKey: 'promotion.postAdvAutoSetExcluded',\n  },\n\n  /**\n   * Get product list for auto campaign\n   * x-readonly-method: true, x-category: advert\n   */\n  'promotion.getAutoGetnmtoadd': {\n    readonly: true,\n    category: 'advert',\n    rateLimitKey: 'promotion.advAutoGetnmtoadd',\n  },\n\n  /**\n   * Update product list in auto campaign\n   * x-readonly-method: false, x-category: advert\n   */\n  'promotion.createAutoUpdatenm': {\n    readonly: false,\n    category: 'advert',\n    rateLimitKey: 'promotion.postAdvAutoUpdatenm',\n  },\n\n  // --- Media Campaigns (media.yaml) ---\n\n  /**\n   * Get media campaign count\n   * x-readonly-method: true, x-category: advert\n   */\n  'promotion.getAdvCount': {\n    readonly: true,\n    category: 'advert',\n    rateLimitKey: 'promotion.advCount',\n  },\n\n  /**\n   * Get media campaigns list\n   * x-readonly-method: true, x-category: advert\n   */\n  'promotion.getAdvAdverts': {\n    readonly: true,\n    category: 'advert',\n    rateLimitKey: 'promotion.advAdverts',\n  },\n\n  /**\n   * Get media campaign info\n   * x-readonly-method: true, x-category: advert\n   */\n  'promotion.getAdvAdvert': {\n    readonly: true,\n    category: 'advert',\n    rateLimitKey: 'promotion.advAdvert',\n  },\n\n  // --- Statistics (statistika.yaml) ---\n\n  /**\n   * Get campaign full stats (V2)\n   * x-readonly-method: true, x-category: advert\n   */\n  'promotion.createAdvFullstat': {\n    readonly: true,\n    category: 'advert',\n    rateLimitKey: 'promotion.postAdvFullstats',\n  },\n\n  /**\n   * Get campaign full stats (V3)\n   * x-readonly-method: true, x-category: advert\n   */\n  'promotion.getAdvFullstats': {\n    readonly: true,\n    category: 'advert',\n    rateLimitKey: 'promotion.advFullstats',\n  },\n\n  /**\n   * Get auto campaign stat words\n   * x-readonly-method: true, x-category: advert\n   */\n  'promotion.getAutoStatWords': {\n    readonly: true,\n    category: 'advert',\n    rateLimitKey: 'promotion.advAutoStatWords',\n  },\n\n  /**\n   * Get stat words for manual bid campaigns\n   * x-readonly-method: true, x-category: advert\n   */\n  'promotion.getStatWords': {\n    readonly: true,\n    category: 'advert',\n    rateLimitKey: 'promotion.advStatWords',\n  },\n\n  /**\n   * Get keyword statistics\n   * x-readonly-method: true, x-category: advert\n   */\n  'promotion.getStatsKeywords': {\n    readonly: true,\n    category: 'advert',\n    rateLimitKey: 'promotion.advStatsKeywords',\n  },\n\n  /**\n   * Get media campaign statistics\n   * x-readonly-method: true, x-category: advert\n   */\n  'promotion.createAdvStat': {\n    readonly: true,\n    category: 'advert',\n    rateLimitKey: 'promotion.postAdvStats',\n  },\n\n  // --- Calendar Promotions (kalendar-aktsiy.yaml) ---\n\n  /**\n   * Get promotions list\n   * x-readonly-method: true, x-category: discountsandprices\n   */\n  'promotion.getCalendarPromotions': {\n    readonly: true,\n    category: 'discountsandprices',\n    rateLimitKey: 'promotion.calendarPromotions',\n  },\n\n  /**\n   * Get promotion details\n   * x-readonly-method: true, x-category: discountsandprices\n   */\n  'promotion.getPromotionsDetails': {\n    readonly: true,\n    category: 'discountsandprices',\n    rateLimitKey: 'promotion.calendarPromotionsDetails',\n  },\n\n  /**\n   * Get nomenclatures for promotion\n   * x-readonly-method: true, x-category: discountsandprices\n   */\n  'promotion.getPromotionsNomenclatures': {\n    readonly: true,\n    category: 'discountsandprices',\n    rateLimitKey: 'promotion.calendarPromotionsNomenclatures',\n  },\n\n  /**\n   * Add product to promotion\n   * x-readonly-method: false, x-category: discountsandprices\n   */\n  'promotion.createPromotionsUpload': {\n    readonly: false,\n    category: 'discountsandprices',\n    rateLimitKey: 'promotion.postCalendarPromotionsUpload',\n  },\n\n  // --- Search Clusters (poiskovye-klastery.yaml) ---\n\n  /**\n   * Get normquery statistics\n   * x-readonly-method: true, x-category: advert\n   */\n  'promotion.getNormqueryStats': {\n    readonly: true,\n    category: 'advert',\n    rateLimitKey: 'promotion.normqueryStats',\n  },\n\n  /**\n   * Get normquery bids\n   * x-readonly-method: true, x-category: advert\n   */\n  'promotion.getNormqueryBids': {\n    readonly: true,\n    category: 'advert',\n    rateLimitKey: 'promotion.normqueryGetBids',\n  },\n\n  /**\n   * Set normquery bids\n   * x-readonly-method: false, x-category: advert\n   */\n  'promotion.setNormqueryBids': {\n    readonly: false,\n    category: 'advert',\n    rateLimitKey: 'promotion.normquerySetBids',\n  },\n\n  /**\n   * Delete normquery bids\n   * x-readonly-method: false, x-category: advert\n   */\n  'promotion.deleteNormqueryBids': {\n    readonly: false,\n    category: 'advert',\n    rateLimitKey: 'promotion.normqueryDeleteBids',\n  },\n\n  /**\n   * Get normquery minus-phrases\n   * x-readonly-method: true, x-category: advert\n   */\n  'promotion.getNormqueryMinus': {\n    readonly: true,\n    category: 'advert',\n    rateLimitKey: 'promotion.normqueryGetMinus',\n  },\n\n  /**\n   * Set normquery minus-phrases\n   * x-readonly-method: false, x-category: advert\n   */\n  'promotion.setNormqueryMinus': {\n    readonly: false,\n    category: 'advert',\n    rateLimitKey: 'promotion.normquerySetMinus',\n  },\n\n  // ============================================================================\n  // Communications Module (from 09-communications/*.yaml)\n  // ============================================================================\n\n  // --- Questions (voprosy.yaml) ---\n\n  /**\n   * Check for new feedbacks and questions\n   * x-readonly-method: true, x-category: questionsandfeedback\n   */\n  'communications.newFeedbacksQuestions': {\n    readonly: true,\n    category: 'questionsandfeedback',\n    rateLimitKey: 'communications.newFeedbacksQuestions',\n  },\n\n  /**\n   * Get unanswered questions count\n   * x-readonly-method: true, x-category: questionsandfeedback\n   */\n  'communications.getQuestionsCountUnanswered': {\n    readonly: true,\n    category: 'questionsandfeedback',\n    rateLimitKey: 'communications.questionsCountUnanswered',\n  },\n\n  /**\n   * Get questions count\n   * x-readonly-method: true, x-category: questionsandfeedback\n   */\n  'communications.getQuestionsCount': {\n    readonly: true,\n    category: 'questionsandfeedback',\n    rateLimitKey: 'communications.questionsCount',\n  },\n\n  /**\n   * Get questions list\n   * x-readonly-method: true, x-category: questionsandfeedback\n   */\n  'communications.questions': {\n    readonly: true,\n    category: 'questionsandfeedback',\n    rateLimitKey: 'communications.questions',\n  },\n\n  /**\n   * Update question (answer, mark viewed, etc.)\n   * x-readonly-method: false, x-category: questionsandfeedback\n   */\n  'communications.updateQuestion': {\n    readonly: false,\n    category: 'questionsandfeedback',\n    rateLimitKey: 'communications.patchQuestions',\n  },\n\n  /**\n   * Get question by ID\n   * x-readonly-method: true, x-category: questionsandfeedback\n   */\n  'communications.question': {\n    readonly: true,\n    category: 'questionsandfeedback',\n    rateLimitKey: 'communications.question',\n  },\n\n  // --- Feedbacks/Reviews (otzyvy.yaml) ---\n\n  /**\n   * Get unanswered feedbacks count\n   * x-readonly-method: true, x-category: questionsandfeedback\n   */\n  'communications.getFeedbacksCountUnanswered': {\n    readonly: true,\n    category: 'questionsandfeedback',\n    rateLimitKey: 'communications.feedbacksCountUnanswered',\n  },\n\n  /**\n   * Get feedbacks count\n   * x-readonly-method: true, x-category: questionsandfeedback\n   */\n  'communications.getFeedbacksCount': {\n    readonly: true,\n    category: 'questionsandfeedback',\n    rateLimitKey: 'communications.feedbacksCount',\n  },\n\n  /**\n   * Get feedbacks list\n   * x-readonly-method: true, x-category: questionsandfeedback\n   */\n  'communications.feedbacks': {\n    readonly: true,\n    category: 'questionsandfeedback',\n    rateLimitKey: 'communications.feedbacks',\n  },\n\n  /**\n   * Get supplier valuations (complaint reasons)\n   * x-readonly-method: true, x-category: questionsandfeedback\n   */\n  'communications.supplierValuations': {\n    readonly: true,\n    category: 'questionsandfeedback',\n    rateLimitKey: 'communications.supplierValuations',\n  },\n\n  /**\n   * Report feedback/product issue\n   * x-readonly-method: false, x-category: questionsandfeedback\n   */\n  'communications.createFeedbacksAction': {\n    readonly: false,\n    category: 'questionsandfeedback',\n    rateLimitKey: 'communications.postFeedbacksActions',\n  },\n\n  /**\n   * Answer feedback\n   * x-readonly-method: false, x-category: questionsandfeedback\n   */\n  'communications.createFeedbacksAnswer': {\n    readonly: false,\n    category: 'questionsandfeedback',\n    rateLimitKey: 'communications.postFeedbacksAnswer',\n  },\n\n  /**\n   * Update feedback answer\n   * x-readonly-method: false, x-category: questionsandfeedback\n   */\n  'communications.updateFeedbacksAnswer': {\n    readonly: false,\n    category: 'questionsandfeedback',\n    rateLimitKey: 'communications.patchFeedbacksAnswer',\n  },\n\n  /**\n   * Request product return by feedback ID\n   * x-readonly-method: false, x-category: questionsandfeedback\n   */\n  'communications.createOrderReturn': {\n    readonly: false,\n    category: 'questionsandfeedback',\n    rateLimitKey: 'communications.postFeedbacksOrderReturn',\n  },\n\n  /**\n   * Get feedback by ID\n   * x-readonly-method: true, x-category: questionsandfeedback\n   */\n  'communications.feedback': {\n    readonly: true,\n    category: 'questionsandfeedback',\n    rateLimitKey: 'communications.feedback',\n  },\n\n  /**\n   * Get archived feedbacks\n   * x-readonly-method: true, x-category: questionsandfeedback\n   */\n  'communications.getFeedbacksArchive': {\n    readonly: true,\n    category: 'questionsandfeedback',\n    rateLimitKey: 'communications.feedbacksArchive',\n  },\n\n  // --- Templates (removed from API but kept for compatibility) ---\n\n  /**\n   * Get response templates\n   * x-readonly-method: true, x-category: questionsandfeedback\n   */\n  'communications.templates': {\n    readonly: true,\n    category: 'questionsandfeedback',\n    rateLimitKey: 'communications.templates',\n  },\n\n  /**\n   * Create response template\n   * x-readonly-method: false, x-category: questionsandfeedback\n   */\n  'communications.createTemplate': {\n    readonly: false,\n    category: 'questionsandfeedback',\n    rateLimitKey: 'communications.postTemplates',\n  },\n\n  /**\n   * Update response template\n   * x-readonly-method: false, x-category: questionsandfeedback\n   */\n  'communications.updateTemplate': {\n    readonly: false,\n    category: 'questionsandfeedback',\n    rateLimitKey: 'communications.patchTemplates',\n  },\n\n  /**\n   * Delete response template\n   * x-readonly-method: false, x-category: questionsandfeedback\n   */\n  'communications.deleteTemplate': {\n    readonly: false,\n    category: 'questionsandfeedback',\n    rateLimitKey: 'communications.deleteTemplates',\n  },\n\n  // --- Buyer Chat (chat-s-pokupatelyami.yaml) ---\n\n  /**\n   * Get seller chats list\n   * x-readonly-method: true, x-category: buyerchat\n   */\n  'communications.getSellerChats': {\n    readonly: true,\n    category: 'buyerchat',\n    rateLimitKey: 'communications.sellerChats',\n  },\n\n  /**\n   * Get chat events\n   * x-readonly-method: true, x-category: buyerchat\n   */\n  'communications.getSellerEvents': {\n    readonly: true,\n    category: 'buyerchat',\n    rateLimitKey: 'communications.sellerEvents',\n  },\n\n  /**\n   * Send message to buyer\n   * x-readonly-method: false, x-category: buyerchat\n   */\n  'communications.createSellerMessage': {\n    readonly: false,\n    category: 'buyerchat',\n    rateLimitKey: 'communications.postSellerMessage',\n  },\n\n  /**\n   * Download file from message\n   * x-readonly-method: true, x-category: buyerchat\n   */\n  'communications.getSellerDownload': {\n    readonly: true,\n    category: 'buyerchat',\n    rateLimitKey: 'communications.sellerDownload',\n  },\n\n  // --- Returns (vozvraty-pokupatelyami.yaml) ---\n\n  /**\n   * Get buyer return claims\n   * x-readonly-method: true, x-category: returns\n   */\n  'communications.claims': {\n    readonly: true,\n    category: 'returns',\n    rateLimitKey: 'communications.claims',\n  },\n\n  /**\n   * Respond to buyer claim\n   * x-readonly-method: false, x-category: returns\n   */\n  'communications.updateClaim': {\n    readonly: false,\n    category: 'returns',\n    rateLimitKey: 'communications.patchClaim',\n  },\n\n  // --- Pinned Reviews (zakreplyonnye-otzyvy.yaml) ---\n\n  /**\n   * Get pinned feedbacks count\n   * x-readonly-method: true, x-category: questionsandfeedback\n   */\n  'communications.getPinnedFeedbacksCount': {\n    readonly: true,\n    category: 'questionsandfeedback',\n    rateLimitKey: 'communications.getPinnedFeedbacksCount',\n  },\n\n  /**\n   * Get pinned feedbacks limits\n   * x-readonly-method: true, x-category: questionsandfeedback\n   */\n  'communications.getPinnedFeedbacksLimits': {\n    readonly: true,\n    category: 'questionsandfeedback',\n    rateLimitKey: 'communications.getPinnedFeedbacksLimits',\n  },\n\n  /**\n   * Get pinned feedbacks list\n   * x-readonly-method: true, x-category: questionsandfeedback\n   */\n  'communications.getPinnedFeedbacks': {\n    readonly: true,\n    category: 'questionsandfeedback',\n    rateLimitKey: 'communications.getPinnedFeedbacks',\n  },\n\n  /**\n   * Pin feedback to product\n   * x-readonly-method: false, x-category: questionsandfeedback\n   */\n  'communications.pinFeedback': {\n    readonly: false,\n    category: 'questionsandfeedback',\n    rateLimitKey: 'communications.pinFeedback',\n  },\n\n  /**\n   * Unpin feedback from product\n   * x-readonly-method: false, x-category: questionsandfeedback\n   */\n  'communications.unpinFeedback': {\n    readonly: false,\n    category: 'questionsandfeedback',\n    rateLimitKey: 'communications.unpinFeedback',\n  },\n\n  // ============================================================================\n  // Tariffs Module (from 10-tariffs/*.yaml)\n  // ============================================================================\n\n  /**\n   * Get commission by category\n   * x-readonly-method: true, x-category: commonapi\n   */\n  'tariffs.getTariffsCommission': {\n    readonly: true,\n    category: 'commonapi',\n    rateLimitKey: 'tariffs.tariffsCommission',\n  },\n\n  /**\n   * Get box tariffs\n   * x-readonly-method: true, x-category: commonapi\n   */\n  'tariffs.getTariffsBox': {\n    readonly: true,\n    category: 'commonapi',\n    rateLimitKey: 'tariffs.tariffsBox',\n  },\n\n  /**\n   * Get pallet tariffs\n   * x-readonly-method: true, x-category: commonapi\n   */\n  'tariffs.getTariffsPallet': {\n    readonly: true,\n    category: 'commonapi',\n    rateLimitKey: 'tariffs.tariffsPallet',\n  },\n\n  /**\n   * Get return tariffs\n   * x-readonly-method: true, x-category: commonapi\n   */\n  'tariffs.getTariffsReturn': {\n    readonly: true,\n    category: 'commonapi',\n    rateLimitKey: 'tariffs.tariffsReturn',\n  },\n\n  /**\n   * Get supply/acceptance coefficients\n   * x-readonly-method: true, x-category: commonapi\n   */\n  'tariffs.getAcceptanceCoefficients': {\n    readonly: true,\n    category: 'commonapi',\n    rateLimitKey: 'tariffs.acceptanceCoefficients',\n  },\n\n  // ============================================================================\n  // Analytics Module Operations\n  // From: wildberries_api_doc/11-analytics.yaml\n  // ============================================================================\n\n  /**\n   * Create NM report detail\n   * x-readonly-method: false, x-category: contentanalytics\n   */\n  'analytics.createNmReportDetail': {\n    readonly: false,\n    category: 'contentanalytics',\n    rateLimitKey: 'analytics.createNmReportDetail',\n  },\n\n  /**\n   * Create detail history\n   * x-readonly-method: false, x-category: contentanalytics\n   */\n  'analytics.createDetailHistory': {\n    readonly: false,\n    category: 'contentanalytics',\n    rateLimitKey: 'analytics.createDetailHistory',\n  },\n\n  /**\n   * Create grouped history\n   * x-readonly-method: false, x-category: contentanalytics\n   */\n  'analytics.createGroupedHistory': {\n    readonly: false,\n    category: 'contentanalytics',\n    rateLimitKey: 'analytics.createGroupedHistory',\n  },\n\n  /**\n   * Get sales funnel products\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'analytics.getSalesFunnelProducts': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'analytics.getSalesFunnelProducts',\n  },\n\n  /**\n   * Get sales funnel products history\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'analytics.getSalesFunnelProductsHistory': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'analytics.getSalesFunnelProductsHistory',\n  },\n\n  /**\n   * Get sales funnel grouped history\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'analytics.getSalesFunnelGroupedHistory': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'analytics.getSalesFunnelGroupedHistory',\n  },\n\n  /**\n   * Get NM report downloads\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'analytics.getNmReportDownloads': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'analytics.getNmReportDownloads',\n  },\n\n  /**\n   * Create NM report download\n   * x-readonly-method: false, x-category: contentanalytics\n   */\n  'analytics.createNmReportDownload': {\n    readonly: false,\n    category: 'contentanalytics',\n    rateLimitKey: 'analytics.createNmReportDownload',\n  },\n\n  /**\n   * Create downloads retry\n   * x-readonly-method: false, x-category: contentanalytics\n   */\n  'analytics.createDownloadsRetry': {\n    readonly: false,\n    category: 'contentanalytics',\n    rateLimitKey: 'analytics.createDownloadsRetry',\n  },\n\n  /**\n   * Get downloads file\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'analytics.getDownloadsFile': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'analytics.getDownloadsFile',\n  },\n\n  /**\n   * Create search report\n   * x-readonly-method: false, x-category: contentanalytics\n   */\n  'analytics.createSearchReportReport': {\n    readonly: false,\n    category: 'contentanalytics',\n    rateLimitKey: 'analytics.createSearchReportReport',\n  },\n\n  /**\n   * Create table group\n   * x-readonly-method: false, x-category: contentanalytics\n   */\n  'analytics.createTableGroup': {\n    readonly: false,\n    category: 'contentanalytics',\n    rateLimitKey: 'analytics.createTableGroup',\n  },\n\n  /**\n   * Create table detail\n   * x-readonly-method: false, x-category: contentanalytics\n   */\n  'analytics.createTableDetail': {\n    readonly: false,\n    category: 'contentanalytics',\n    rateLimitKey: 'analytics.createTableDetail',\n  },\n\n  /**\n   * Create product search text\n   * x-readonly-method: false, x-category: contentanalytics\n   */\n  'analytics.createProductSearchText': {\n    readonly: false,\n    category: 'contentanalytics',\n    rateLimitKey: 'analytics.createProductSearchText',\n  },\n\n  /**\n   * Create product order\n   * x-readonly-method: false, x-category: contentanalytics\n   */\n  'analytics.createProductOrder': {\n    readonly: false,\n    category: 'contentanalytics',\n    rateLimitKey: 'analytics.createProductOrder',\n  },\n\n  /**\n   * Create products group\n   * x-readonly-method: false, x-category: contentanalytics\n   */\n  'analytics.createProductsGroup': {\n    readonly: false,\n    category: 'contentanalytics',\n    rateLimitKey: 'analytics.createProductsGroup',\n  },\n\n  /**\n   * Create products product\n   * x-readonly-method: false, x-category: contentanalytics\n   */\n  'analytics.createProductsProduct': {\n    readonly: false,\n    category: 'contentanalytics',\n    rateLimitKey: 'analytics.createProductsProduct',\n  },\n\n  /**\n   * Create products size\n   * x-readonly-method: false, x-category: contentanalytics\n   */\n  'analytics.createProductsSize': {\n    readonly: false,\n    category: 'contentanalytics',\n    rateLimitKey: 'analytics.createProductsSize',\n  },\n\n  /**\n   * Create stocks report office\n   * x-readonly-method: false, x-category: contentanalytics\n   */\n  'analytics.createStocksReportOffice': {\n    readonly: false,\n    category: 'contentanalytics',\n    rateLimitKey: 'analytics.createStocksReportOffice',\n  },\n\n  // ============================================================================\n  // Reports Module Operations\n  // From: wildberries_api_doc/12-reports.yaml\n  // ============================================================================\n\n  /**\n   * Get supplier incomes\n   * x-readonly-method: true, x-category: statistics\n   */\n  'reports.getSupplierIncomes': {\n    readonly: true,\n    category: 'statistics',\n    rateLimitKey: 'reports.supplierIncomes',\n  },\n\n  /**\n   * Get supplier stocks\n   * x-readonly-method: true, x-category: statistics\n   */\n  'reports.getSupplierStocks': {\n    readonly: true,\n    category: 'statistics',\n    rateLimitKey: 'reports.supplierStocks',\n  },\n\n  /**\n   * Get supplier orders\n   * x-readonly-method: true, x-category: statistics\n   */\n  'reports.getSupplierOrders': {\n    readonly: true,\n    category: 'statistics',\n    rateLimitKey: 'reports.supplierOrders',\n  },\n\n  /**\n   * Get supplier sales\n   * x-readonly-method: true, x-category: statistics\n   */\n  'reports.getSupplierSales': {\n    readonly: true,\n    category: 'statistics',\n    rateLimitKey: 'reports.supplierSales',\n  },\n\n  /**\n   * Create analytics excise report\n   * x-readonly-method: false, x-category: contentanalytics\n   */\n  'reports.createAnalyticsExciseReport': {\n    readonly: false,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.createAnalyticsExciseReport',\n  },\n\n  /**\n   * Create warehouse remains report\n   * x-readonly-method: false, x-category: contentanalytics\n   */\n  'reports.warehouseRemains': {\n    readonly: false,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.warehouseRemains',\n  },\n\n  /**\n   * Get warehouse remains task status\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'reports.getWarehouseRemainsTaskStatus': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.getWarehouseRemainsTaskStatus',\n  },\n\n  /**\n   * Download warehouse remains report\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'reports.downloadWarehouseRemainsReport': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.downloadWarehouseRemainsReport',\n  },\n\n  /**\n   * Get analytics antifraud details\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'reports.getAnalyticsAntifraudDetails': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.getAnalyticsAntifraudDetails',\n  },\n\n  /**\n   * Get analytics goods labeling\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'reports.getAnalyticsGoodsLabeling': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.getAnalyticsGoodsLabeling',\n  },\n\n  /**\n   * Get acceptance report\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'reports.acceptanceReport': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.acceptanceReport',\n  },\n\n  /**\n   * Get paid storage report\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'reports.paidStorage': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.paidStorage',\n  },\n\n  /**\n   * Get analytics region sale\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'reports.getAnalyticsRegionSale': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.getAnalyticsRegionSale',\n  },\n\n  /**\n   * Get brand share brands\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'reports.getBrandShareBrands': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.getBrandShareBrands',\n  },\n\n  /**\n   * Get banned products blocked\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'reports.getBannedProductsBlocked': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.getBannedProductsBlocked',\n  },\n\n  /**\n   * Get measurement penalties\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'reports.getMeasurementPenalties': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.getMeasurementPenalties',\n  },\n\n  /**\n   * Get warehouse measurements V2\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'reports.getWarehouseMeasurementsV2': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.getWarehouseMeasurementsV2',\n  },\n\n  /**\n   * Get deductions\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'reports.getDeductions': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.getDeductions',\n  },\n\n  /**\n   * Get warehouse remains task status (deprecated alias)\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'reports.getTasksStatu': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.getWarehouseRemainsTaskStatus',\n  },\n\n  /**\n   * Download warehouse remains report (deprecated alias)\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'reports.getTasksDownload': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.downloadWarehouseRemainsReport',\n  },\n\n  /**\n   * Get analytics warehouse measurements (deprecated)\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'reports.getAnalyticsWarehouseMeasurements': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.getAnalyticsWarehouseMeasurements',\n  },\n\n  /**\n   * Get analytics incorrect attachments\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'reports.getAnalyticsIncorrectAttachments': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.getAnalyticsIncorrectAttachments',\n  },\n\n  /**\n   * Get analytics characteristics change\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'reports.getAnalyticsCharacteristicsChange': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.getAnalyticsCharacteristicsChange',\n  },\n\n  /**\n   * Get acceptance report task status\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'reports.getAcceptanceReportTaskStatus': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.getAcceptanceReportTaskStatus',\n  },\n\n  /**\n   * Download acceptance report\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'reports.downloadAcceptanceReport': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.downloadAcceptanceReport',\n  },\n\n  /**\n   * Get paid storage task status\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'reports.getPaidStorageTaskStatus': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.getPaidStorageTaskStatus',\n  },\n\n  /**\n   * Download paid storage report\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'reports.downloadPaidStorageReport': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.downloadPaidStorageReport',\n  },\n\n  /**\n   * Get brand share parent subjects\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'reports.getBrandShareParentSubjects': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.getBrandShareParentSubjects',\n  },\n\n  /**\n   * Get analytics brand share\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'reports.getAnalyticsBrandShare': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.getAnalyticsBrandShare',\n  },\n\n  /**\n   * Get banned products shadowed\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'reports.getBannedProductsShadowed': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.getBannedProductsShadowed',\n  },\n\n  /**\n   * Get analytics goods return\n   * x-readonly-method: true, x-category: contentanalytics\n   */\n  'reports.getAnalyticsGoodsReturn': {\n    readonly: true,\n    category: 'contentanalytics',\n    rateLimitKey: 'reports.getAnalyticsGoodsReturn',\n  },\n\n  // ============================================================================\n  // Finances Module Operations\n  // From: wildberries_api_doc/13-finances.yaml\n  // ============================================================================\n\n  /**\n   * Get account balance\n   * x-readonly-method: true, x-category: finance\n   */\n  'finances.getAccountBalance': {\n    readonly: true,\n    category: 'finance',\n    rateLimitKey: 'finances.accountBalance',\n  },\n\n  /**\n   * Get supplier report detail by period\n   * x-readonly-method: true, x-category: statistics\n   */\n  'finances.getSupplierReportDetailByPeriod': {\n    readonly: true,\n    category: 'statistics',\n    rateLimitKey: 'finances.supplierReportDetailByPeriod',\n  },\n\n  /**\n   * Get documents categories\n   * x-readonly-method: true, x-category: documents\n   */\n  'finances.getDocumentsCategories': {\n    readonly: true,\n    category: 'documents',\n    rateLimitKey: 'finances.documentsCategories',\n  },\n\n  /**\n   * Get documents list\n   * x-readonly-method: true, x-category: documents\n   */\n  'finances.getDocumentsList': {\n    readonly: true,\n    category: 'documents',\n    rateLimitKey: 'finances.documentsList',\n  },\n\n  /**\n   * Get documents download\n   * x-readonly-method: true, x-category: documents\n   */\n  'finances.getDocumentsDownload': {\n    readonly: true,\n    category: 'documents',\n    rateLimitKey: 'finances.documentsDownload',\n  },\n\n  /**\n   * Create download all documents\n   * x-readonly-method: false, x-category: documents\n   */\n  'finances.createDownloadAll': {\n    readonly: false,\n    category: 'documents',\n    rateLimitKey: 'finances.createDownloadAll',\n  },\n\n  // ============================================================================\n  // In-Store Pickup Module Operations\n  // From: wildberries_api_doc/06-in-store-pickup.yaml\n  // ============================================================================\n\n  /**\n   * Get new orders for pickup\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'inStorePickup.getOrdersNew': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'in-store-pickup.ordersNew',\n  },\n\n  /**\n   * Confirm orders\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'inStorePickup.updateOrdersConfirm': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'in-store-pickup.ordersConfirm',\n  },\n\n  /**\n   * Prepare orders\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'inStorePickup.updateOrdersPrepare': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'in-store-pickup.ordersPrepare',\n  },\n\n  /**\n   * Create order client notification\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'inStorePickup.createOrdersClient': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'in-store-pickup.ordersClient',\n  },\n\n  /**\n   * Create client identity verification\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'inStorePickup.createClientIdentity': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'in-store-pickup.clientIdentity',\n  },\n\n  /**\n   * Receive orders\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'inStorePickup.updateOrdersReceive': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'in-store-pickup.ordersReceive',\n  },\n\n  /**\n   * Reject orders\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'inStorePickup.updateOrdersReject': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'in-store-pickup.ordersReject',\n  },\n\n  /**\n   * Get order status\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'inStorePickup.createOrdersStatus': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'in-store-pickup.ordersStatus',\n  },\n\n  /**\n   * Get click & collect orders\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'inStorePickup.getClickCollectOrders': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'in-store-pickup.clickCollectOrders',\n  },\n\n  /**\n   * Cancel orders\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'inStorePickup.updateOrdersCancel': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'in-store-pickup.ordersCancel',\n  },\n\n  /**\n   * Get orders meta\n   * x-readonly-method: true, x-category: marketplace\n   */\n  'inStorePickup.getOrdersMeta': {\n    readonly: true,\n    category: 'marketplace',\n    rateLimitKey: 'in-store-pickup.ordersMeta',\n  },\n\n  /**\n   * Delete orders meta\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'inStorePickup.deleteOrdersMeta': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'in-store-pickup.deleteOrdersMeta',\n  },\n\n  /**\n   * Update meta SGTIN\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'inStorePickup.updateMetaSgtin': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'in-store-pickup.metaSgtin',\n  },\n\n  /**\n   * Update meta UIN\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'inStorePickup.updateMetaUin': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'in-store-pickup.metaUin',\n  },\n\n  /**\n   * Update meta IMEI\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'inStorePickup.updateMetaImei': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'in-store-pickup.metaImei',\n  },\n\n  /**\n   * Update meta GTIN\n   * x-readonly-method: false, x-category: marketplace\n   */\n  'inStorePickup.updateMetaGtin': {\n    readonly: false,\n    category: 'marketplace',\n    rateLimitKey: 'in-store-pickup.metaGtin',\n  },\n};\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Check if an operation is readonly (safe to retry)\n *\n * @param operationKey - Operation key in format '{module}.{methodName}'\n * @returns true if the operation is readonly, false otherwise\n *\n * @example\n * ```typescript\n * import { isOperationReadonly } from 'daytona-wildberries-typescript-sdk';\n *\n * if (isOperationReadonly('products.getParentAll')) {\n *   // Safe to retry on transient failures\n * }\n *\n * if (!isOperationReadonly('products.createCardsUpload')) {\n *   // Should NOT auto-retry - may cause duplicate cards\n * }\n * ```\n */\nexport function isOperationReadonly(operationKey: string): boolean {\n  const metadata = operationMetadata[operationKey] as OperationMetadata | undefined;\n  return metadata ? metadata.readonly : false;\n}\n\n/**\n * Get the API category for an operation\n *\n * @param operationKey - Operation key in format '{module}.{methodName}'\n * @returns The category string, or undefined if operation not found\n *\n * @example\n * ```typescript\n * import { getOperationCategory } from 'daytona-wildberries-typescript-sdk';\n *\n * const category = getOperationCategory('products.getParentAll');\n * // Returns 'content'\n *\n * // Map category to API domain\n * const domains: Record<string, string> = {\n *   'content': 'https://content-api.wildberries.ru',\n *   'marketplace': 'https://marketplace-api.wildberries.ru',\n *   'discountsandprices': 'https://discounts-prices-api.wildberries.ru',\n * };\n * const domain = domains[category!];\n * ```\n */\nexport function getOperationCategory(operationKey: string): string | undefined {\n  const metadata = operationMetadata[operationKey] as OperationMetadata | undefined;\n  return metadata ? metadata.category : undefined;\n}\n\n/**\n * Get the rate limit key for an operation\n *\n * @param operationKey - Operation key in format '{module}.{methodName}'\n * @returns The rate limit key, or undefined if operation not found\n *\n * @example\n * ```typescript\n * import { getOperationRateLimitKey, productsRateLimits } from 'daytona-wildberries-typescript-sdk';\n *\n * const rateLimitKey = getOperationRateLimitKey('products.getParentAll');\n * // Returns 'products.contentObjectParentAll'\n *\n * const config = productsRateLimits[rateLimitKey!];\n * console.log(config.requestsPerMinute); // 100\n * ```\n */\nexport function getOperationRateLimitKey(operationKey: string): string | undefined {\n  const metadata = operationMetadata[operationKey] as OperationMetadata | undefined;\n  return metadata ? metadata.rateLimitKey : undefined;\n}\n\n/**\n * Get full metadata for an operation\n *\n * @param operationKey - Operation key in format '{module}.{methodName}'\n * @returns The full OperationMetadata object, or undefined if not found\n *\n * @example\n * ```typescript\n * import { getOperationMetadata } from 'daytona-wildberries-typescript-sdk';\n *\n * const meta = getOperationMetadata('products.createCardsUpload');\n * if (meta) {\n *   console.log('Readonly:', meta.readonly);        // false\n *   console.log('Category:', meta.category);        // 'content'\n *   console.log('Rate limit key:', meta.rateLimitKey); // 'products.postContentCardsUpload'\n * }\n * ```\n */\nexport function getOperationMetadata(operationKey: string): OperationMetadata | undefined {\n  return operationMetadata[operationKey];\n}\n\n/**\n * Get all operations for a specific category\n *\n * @param category - API category (e.g., 'content', 'marketplace', 'discountsandprices')\n * @returns Array of operation keys matching the category\n *\n * @example\n * ```typescript\n * import { getOperationsByCategory } from 'daytona-wildberries-typescript-sdk';\n *\n * const contentOps = getOperationsByCategory('content');\n * // Returns: ['products.getParentAll', 'products.getObjectAll', ...]\n *\n * const marketplaceOps = getOperationsByCategory('marketplace');\n * // Returns: ['products.getStocks', 'products.updateStock', ...]\n * ```\n */\nexport function getOperationsByCategory(category: string): string[] {\n  return Object.entries(operationMetadata)\n    .filter(([, meta]) => meta.category === category)\n    .map(([key]) => key);\n}\n\n/**\n * Get all readonly operations\n *\n * @returns Array of operation keys that are safe to retry\n *\n * @example\n * ```typescript\n * import { getReadonlyOperations } from 'daytona-wildberries-typescript-sdk';\n *\n * const safeToRetry = getReadonlyOperations();\n * // Returns: ['general.ping', 'general.news', 'products.getParentAll', ...]\n * ```\n */\nexport function getReadonlyOperations(): string[] {\n  return Object.entries(operationMetadata)\n    .filter(([, meta]) => meta.readonly)\n    .map(([key]) => key);\n}\n\n/**\n * Get all write operations (not readonly)\n *\n * @returns Array of operation keys that have side effects\n *\n * @example\n * ```typescript\n * import { getWriteOperations } from 'daytona-wildberries-typescript-sdk';\n *\n * const writeOps = getWriteOperations();\n * // Returns: ['products.createContentTag', 'products.createCardsUpload', ...]\n *\n * // These operations should NOT be automatically retried\n * ```\n */\nexport function getWriteOperations(): string[] {\n  return Object.entries(operationMetadata)\n    .filter(([, meta]) => !meta.readonly)\n    .map(([key]) => key);\n}\n","/**\n * Retry Handler with Exponential Backoff\n *\n * Provides resilience against transient failures through automatic retry\n * with configurable exponential backoff strategy.\n *\n * @module client/retry-handler\n */\n\nimport {\n  AuthenticationError,\n  ValidationError,\n  RateLimitError,\n  NetworkError,\n  MetaValidationFailError,\n} from '../errors';\nimport { isOperationReadonly } from '../config/operation-metadata';\n\n/**\n * Configuration options for retry behavior\n *\n * Controls how the RetryHandler responds to failures, including\n * maximum retry attempts, delay timing, and backoff strategy.\n *\n * @example\n * ```typescript\n * // Default behavior (3 retries with exponential backoff)\n * const defaultConfig = {};\n *\n * // Custom: More aggressive retries\n * const aggressive: RetryConfig = {\n *   maxRetries: 5,\n *   retryDelay: 500,\n *   exponentialBackoff: true\n * };\n *\n * // Custom: Linear backoff (no exponential)\n * const linear: RetryConfig = {\n *   maxRetries: 3,\n *   retryDelay: 2000,\n *   exponentialBackoff: false\n * };\n * ```\n */\nexport interface RetryConfig {\n  /**\n   * Maximum number of retry attempts after initial failure\n   *\n   * @default 3\n   * Minimum: 0\n   * @example\n   * ```typescript\n   * maxRetries: 3  // Initial attempt + 3 retries = 4 total attempts\n   * maxRetries: 0  // Disable retries completely\n   * ```\n   */\n  maxRetries?: number;\n\n  /**\n   * Initial delay in milliseconds before first retry\n   *\n   * With exponential backoff, subsequent delays are calculated as:\n   * `retryDelay * 2^attempt * jitter`\n   *\n   * @default 1000 (1 second)\n   * Minimum: 0\n   * @example\n   * ```typescript\n   * retryDelay: 1000  // 1s, 2s, 4s, 8s with exponential backoff\n   * retryDelay: 500   // 500ms, 1s, 2s, 4s with exponential backoff\n   * ```\n   */\n  retryDelay?: number;\n\n  /**\n   * Whether to use exponential backoff for retry delays\n   *\n   * - `true`: Delays increase exponentially (1s, 2s, 4s, 8s...)\n   * - `false`: Delays remain constant (1s, 1s, 1s, 1s...)\n   *\n   * Exponential backoff gives APIs time to recover from overload\n   * and reduces load during incidents.\n   *\n   * @default true\n   * @example\n   * ```typescript\n   * exponentialBackoff: true   // 1s → 2s → 4s → 8s\n   * exponentialBackoff: false  // 1s → 1s → 1s → 1s\n   * ```\n   */\n  exponentialBackoff?: boolean;\n}\n\n/**\n * Options for controlling retry behavior per-operation\n *\n * Allows callers to specify operation metadata for readonly-aware retry logic\n * and to force retries even for write operations when explicitly intended.\n *\n * @example\n * ```typescript\n * // Retry with operation key lookup\n * await handler.executeWithRetry(\n *   () => api.getProducts(),\n *   'getProducts',\n *   { operationKey: 'products.getCardsList' }\n * );\n *\n * // Force retry for write operation (use with caution)\n * await handler.executeWithRetry(\n *   () => api.createProduct(data),\n *   'createProduct',\n *   { operationKey: 'products.createCardsUpload', forceRetry: true }\n * );\n * ```\n */\nexport interface RetryOptions {\n  /**\n   * Operation key for metadata lookup (format: '{module}.{methodName}')\n   *\n   * Used to check if the operation is readonly (safe to retry).\n   * If the operation is NOT readonly (write operation), retries will be\n   * skipped unless `forceRetry` is true.\n   *\n   * @example 'products.getCardsList', 'products.createCardsUpload'\n   */\n  operationKey?: string;\n\n  /**\n   * Force retry even for write operations\n   *\n   * **Use with extreme caution!** Write operations may have side effects\n   * and retrying could cause duplicate data (e.g., duplicate product cards).\n   *\n   * Only set to true when you have idempotency guarantees or are certain\n   * the operation can be safely retried.\n   *\n   * @default false\n   */\n  forceRetry?: boolean;\n}\n\n/**\n * Context information for a retry operation\n *\n * Provides metadata about the current retry attempt, used\n * for logging and debugging purposes.\n */\nexport interface RetryContext {\n  /**\n   * Current retry attempt number (0-indexed)\n   *\n   * - Attempt 0: Initial try\n   * - Attempt 1: First retry\n   * - Attempt 2: Second retry\n   * - etc.\n   *\n   * Minimum: 0\n   */\n  attempt: number;\n\n  /**\n   * Human-readable description of the operation being retried\n   *\n   * Used for logging and debugging to identify which operation\n   * is experiencing retries.\n   *\n   * @example\n   * ```typescript\n   * operation: 'GET https://api.example.com/products'\n   * operation: 'POST https://api.example.com/orders'\n   * ```\n   */\n  operation: string;\n}\n\n/**\n * RetryHandler - Automatic retry with exponential backoff\n *\n * Provides resilience against transient failures by automatically retrying\n * failed operations with configurable delays and backoff strategies.\n *\n * **Retry Policy:**\n * - ✅ Retries: 5xx errors, 429 rate limits, network timeouts, connection failures\n * - ❌ NO Retry: 401/403 auth errors, 400/422 validation errors, other 4xx errors\n *\n * **Exponential Backoff:**\n * - Formula: `delay = retryDelay * 2^attempt * jitter`\n * - Jitter: Random ±10% to prevent thundering herd\n * - Max delay: Capped at 30 seconds\n *\n * @example\n * ```typescript\n * const handler = new RetryHandler({\n *   maxRetries: 3,\n *   retryDelay: 1000,\n *   exponentialBackoff: true\n * });\n *\n * const result = await handler.executeWithRetry(\n *   async () => await fetchData(),\n *   'fetchData'\n * );\n * ```\n */\nexport class RetryHandler {\n  private config: Required<RetryConfig>;\n  private logLevel: 'debug' | 'info' | 'warn' | 'error';\n\n  /**\n   * Creates a new RetryHandler instance\n   *\n   * @param config - Optional retry configuration (uses defaults if not provided)\n   * @param logLevel - Log level to control retry log verbosity (inherits from SDKConfig)\n   *\n   * @example\n   * ```typescript\n   * // Use defaults (3 retries, 1s delay, exponential backoff)\n   * const handler = new RetryHandler();\n   *\n   * // Custom configuration\n   * const handler = new RetryHandler({\n   *   maxRetries: 5,\n   *   retryDelay: 500,\n   *   exponentialBackoff: true\n   * });\n   * ```\n   */\n  constructor(config?: RetryConfig, logLevel?: 'debug' | 'info' | 'warn' | 'error') {\n    this.config = {\n      maxRetries: config?.maxRetries ?? 3,\n      retryDelay: config?.retryDelay ?? 1000,\n      exponentialBackoff: config?.exponentialBackoff ?? true,\n    };\n    this.logLevel = logLevel ?? 'warn';\n  }\n\n  /**\n   * Executes an async operation with automatic retry on transient failures\n   *\n   * Wraps the provided operation and automatically retries on failures that\n   * are likely to be transient (network errors, server errors, rate limits).\n   *\n   * **Retry Behavior:**\n   * - Retries on: NetworkError (5xx, timeout, no status), RateLimitError (429)\n   * - NO retry on: AuthenticationError, ValidationError, other 4xx errors\n   * - Uses exponential backoff with jitter (if configured)\n   * - Preserves and re-throws final error after max retries exhausted\n   *\n   * @typeParam T - The return type of the operation\n   * @param operation - Async function to execute (and retry on failure)\n   * @param operationName - Description of operation for logging (optional)\n   * @returns The result of the successful operation\n   * @throws The final error if all retry attempts are exhausted\n   *\n   * @example\n   * ```typescript\n   * // Basic usage\n   * const data = await handler.executeWithRetry(\n   *   async () => await api.getData(),\n   *   'getData'\n   * );\n   *\n   * // With arrow function\n   * const result = await handler.executeWithRetry(\n   *   () => fetch('https://api.example.com/data').then(r => r.json()),\n   *   'fetch data'\n   * );\n   *\n   * // With readonly-aware retry (recommended for SDK operations)\n   * const products = await handler.executeWithRetry(\n   *   () => api.getProducts(),\n   *   'getProducts',\n   *   { operationKey: 'products.getCardsList' }\n   * );\n   *\n   * // Force retry for write operation (use with caution)\n   * const created = await handler.executeWithRetry(\n   *   () => api.createProduct(data),\n   *   'createProduct',\n   *   { operationKey: 'products.createCardsUpload', forceRetry: true }\n   * );\n   * ```\n   */\n  async executeWithRetry<T>(\n    operation: () => Promise<T>,\n    operationName = 'operation',\n    options?: RetryOptions\n  ): Promise<T> {\n    let lastError: Error | undefined;\n\n    for (let attempt = 0; attempt <= this.config.maxRetries; attempt++) {\n      try {\n        const result = await operation();\n\n        // Log success after retries\n        if (attempt > 0) {\n          this.log('info', `Operation succeeded after ${String(attempt)} retries`, {\n            operationName,\n          });\n        }\n\n        return result;\n      } catch (error) {\n        lastError = error as Error;\n\n        // Check if we should retry this error\n        if (!this.shouldRetry(error, attempt, options)) {\n          if (attempt > 0) {\n            this.log(\n              'warn',\n              `All retries exhausted for ${operationName} after ${String(attempt)} attempts`,\n              {\n                operationName,\n                attempts: attempt,\n                maxRetries: this.config.maxRetries,\n                finalError: error instanceof Error ? error.message : String(error),\n              }\n            );\n          }\n          throw error;\n        }\n\n        // Calculate delay for next retry\n        const delay = this.calculateDelay(attempt);\n\n        // Info-level: concise retry status for users\n        this.log(\n          'info',\n          `Retrying ${operationName} (attempt ${String(attempt + 1)}/${String(this.config.maxRetries)}, waiting ${String(Math.round(delay))}ms)`,\n          {\n            operationName,\n            attempt: attempt + 1,\n            maxRetries: this.config.maxRetries,\n            delay: Math.round(delay),\n          }\n        );\n\n        // Debug-level: full error context for developers\n        this.log('debug', `Retry context for ${operationName}`, {\n          operationName,\n          attempt: attempt + 1,\n          maxRetries: this.config.maxRetries,\n          delay: Math.round(delay),\n          errorMessage: error instanceof Error ? error.message : String(error),\n          errorType: error instanceof Error ? error.constructor.name : typeof error,\n          statusCode: error instanceof NetworkError ? error.statusCode : undefined,\n          isTimeout: error instanceof NetworkError ? error.isTimeout : undefined,\n        });\n\n        await this.sleep(delay);\n      }\n    }\n\n    // All retries exhausted\n    this.log('warn', `Max retries exhausted for ${operationName}`, {\n      maxRetries: this.config.maxRetries,\n    });\n\n    // This should never happen due to loop logic, but TypeScript needs the check\n    if (!lastError) {\n      throw new Error('Unexpected: No error captured after retry exhaustion');\n    }\n\n    throw lastError;\n  }\n\n  /**\n   * Determines if an error should be retried\n   *\n   * Classifies errors into retryable (transient) and non-retryable (permanent).\n   *\n   * **Retryable Errors:**\n   * - NetworkError with 5xx status (500-599)\n   * - NetworkError with timeout flag\n   * - NetworkError with no status (network failure)\n   * - RateLimitError (429)\n   *\n   * **Non-Retryable Errors:**\n   * - AuthenticationError (401, 403) - invalid credentials won't fix with retry\n   * - ValidationError (400, 422) - bad request data won't fix with retry\n   * - Other 4xx errors - client errors are permanent failures\n   * - Write operations (unless forceRetry is true) - may cause duplicate data\n   *\n   * @param error - The error to classify\n   * @param attempt - Current attempt number (0-indexed)\n   * @param options - Optional retry options with operation metadata\n   * @returns true if error should be retried, false otherwise\n   *\n   * @private\n   */\n  private shouldRetry(error: unknown, attempt: number, options?: RetryOptions): boolean {\n    // Exhausted retries\n    if (attempt >= this.config.maxRetries) {\n      return false;\n    }\n\n    // Type-safe error checking using instanceof\n    if (error instanceof AuthenticationError) {\n      return false; // Permanent failure - invalid credentials\n    }\n\n    // MetaValidationFailError is never retried — 409 responses on FBS deliver-supply\n    // count as 10 requests against the rate-limit budget; retry storms would exhaust\n    // quota 10× faster than for any other error class.\n    if (error instanceof MetaValidationFailError) {\n      return false;\n    }\n\n    if (error instanceof ValidationError) {\n      return false; // Permanent failure - bad request data\n    }\n\n    // Check readonly safety for write operations\n    // This check happens BEFORE error type checks to prevent any retry of write operations\n    if (options?.operationKey) {\n      const isReadonly = isOperationReadonly(options.operationKey);\n      if (!isReadonly && !options.forceRetry) {\n        this.log('info', `Skipping retry for write operation: ${options.operationKey}`, {\n          operationKey: options.operationKey,\n          readonly: isReadonly,\n          forceRetry: options.forceRetry ?? false,\n        });\n        return false;\n      }\n    }\n\n    if (error instanceof RateLimitError) {\n      return true; // Transient - should retry with backoff\n    }\n\n    if (error instanceof NetworkError) {\n      // Retry on 5xx, timeouts, and network failures\n      const status = error.statusCode;\n\n      // No status = network failure (retry)\n      if (!status || status === 0) return true;\n\n      // 5xx errors are transient server errors\n      if (status >= 500 && status < 600) return true;\n\n      // Timeouts are transient\n      if (error.isTimeout) return true;\n\n      // Other status codes (4xx except 429) are permanent failures\n      return false;\n    }\n\n    // Unknown error type - default to no retry (conservative approach)\n    return false;\n  }\n\n  /**\n   * Calculates the delay before the next retry attempt\n   *\n   * **Exponential Backoff (when enabled):**\n   * - Formula: `delay = retryDelay * 2^attempt * jitter`\n   * - Example: 1s → 2s → 4s → 8s (with default 1000ms retryDelay)\n   *\n   * **Linear Backoff (when disabled):**\n   * - Formula: `delay = retryDelay * jitter`\n   * - Example: 1s → 1s → 1s → 1s (constant delay)\n   *\n   * **Jitter:**\n   * - Adds random ±10% variation to prevent thundering herd\n   * - Multiple clients won't retry simultaneously after service recovery\n   *\n   * **Max Cap:**\n   * - Delays are capped at 30 seconds to prevent excessive waits\n   *\n   * @param attempt - Current attempt number (0-indexed)\n   * @returns Delay in milliseconds before next retry\n   *\n   * @example\n   * ```typescript\n   * // With exponentialBackoff: true, retryDelay: 1000\n   * calculateDelay(0) // ~1000ms (1s * 2^0 * jitter)\n   * calculateDelay(1) // ~2000ms (1s * 2^1 * jitter)\n   * calculateDelay(2) // ~4000ms (1s * 2^2 * jitter)\n   *\n   * // With exponentialBackoff: false, retryDelay: 1000\n   * calculateDelay(0) // ~1000ms\n   * calculateDelay(1) // ~1000ms\n   * calculateDelay(2) // ~1000ms\n   * ```\n   *\n   * @private\n   */\n  private calculateDelay(attempt: number): number {\n    let delay: number;\n\n    if (this.config.exponentialBackoff) {\n      // Exponential: delay * 2^attempt\n      delay = this.config.retryDelay * Math.pow(2, attempt);\n    } else {\n      // Linear: constant delay\n      delay = this.config.retryDelay;\n    }\n\n    // Add jitter (±10%) to prevent thundering herd\n    const jitter = 1 + (Math.random() * 0.2 - 0.1);\n    delay = delay * jitter;\n\n    // Cap at 30 seconds to prevent excessive waits\n    return Math.min(delay, 30000);\n  }\n\n  /**\n   * Sleeps for the specified number of milliseconds\n   *\n   * @param ms - Milliseconds to sleep\n   * @returns Promise that resolves after the delay\n   *\n   * @private\n   */\n  private async sleep(ms: number): Promise<void> {\n    return new Promise((resolve) => setTimeout(resolve, ms));\n  }\n\n  /**\n   * Logs retry-related messages respecting SDK logLevel configuration\n   *\n   * Uses structured JSON logging format consistent with BaseClient.\n   * Only emits logs when the message level meets or exceeds the configured threshold.\n   *\n   * @param level - Log level for this message\n   * @param message - Human-readable log message\n   * @param meta - Optional structured metadata to include\n   *\n   * @private\n   */\n  private log(\n    level: 'debug' | 'info' | 'warn' | 'error',\n    message: string,\n    meta?: Record<string, unknown>\n  ): void {\n    const levels = { debug: 0, info: 1, warn: 2, error: 3 };\n    if (levels[level] < levels[this.logLevel]) return;\n\n    const consoleMethods = {\n      // eslint-disable-next-line no-console\n      debug: console.debug,\n      // eslint-disable-next-line no-console\n      info: console.info,\n      // eslint-disable-next-line no-console\n      warn: console.warn,\n      // eslint-disable-next-line no-console\n      error: console.error,\n    };\n\n    consoleMethods[level](\n      JSON.stringify({\n        timestamp: new Date().toISOString(),\n        level,\n        service: 'RetryHandler',\n        message,\n        ...(meta ?? {}),\n      })\n    );\n  }\n}\n","/**\n * Auto-generated rate limit configuration for general module\n * Generated from: wildberries_api_doc/01-general.yaml\n * DO NOT EDIT MANUALLY - Changes will be overwritten on regeneration\n *\n * This file contains rate limit configurations extracted from OpenAPI operation descriptions.\n * Rate limits are enforced by the RateLimiter (Story 1.4) using the token bucket algorithm.\n *\n * @see {@link ../../src/client/rate-limiter!RateLimiter RateLimiter Documentation}\n * @module config/general-rate-limits\n * @generated\n */\n\nimport type { RateLimitConfig } from '../client/rate-limiter';\n\nexport const generalRateLimits: Record<string, RateLimitConfig> = {\n  'general.ping': {\n    requestsPerMinute: 6,\n    intervalSeconds: 10,\n    burstLimit: 3,\n  },\n  'general.communicationsNews': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 10,\n  },\n  'general.sellerInfo': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 10,\n  },\n  'general.createInvite': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 5,\n  },\n  'general.getUsers': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 5,\n  },\n  'general.updateUserAccess': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 5,\n  },\n  'general.deleteUser': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 10,\n  },\n  // GET /api/common/v1/subscriptions — Jam subscription details\n  'general.getJamSubscription': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 10,\n  },\n  // GET /api/common/v1/rating — seller rating and review count\n  'general.getSellerRating': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 1,\n  },\n};\n","/**\n * Auto-generated rate limit configuration for products module\n * Generated from: wildberries_api_doc/02-products.yaml\n * DO NOT EDIT MANUALLY - Changes will be overwritten on regeneration\n *\n * This file contains rate limit configurations extracted from OpenAPI operation descriptions.\n * Rate limits are enforced by the RateLimiter (Story 1.4) using the token bucket algorithm.\n *\n * @see {@link ../../src/client/rate-limiter!RateLimiter RateLimiter Documentation}\n * @module config/products-rate-limits\n * @generated\n */\n\nimport type { RateLimitConfig } from '../client/rate-limiter';\n\nexport const productsRateLimits: Record<string, RateLimitConfig> = {\n  // === Content Standard Tier: 100 req/min, 600ms interval, burst 5 ===\n  'products.contentObjectParentAll': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.contentObjectAll': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.contentObjectCharcs': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.contentDirectoryColors': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.contentDirectoryKinds': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.contentDirectoryCountries': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.contentDirectorySeasons': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.contentDirectoryVat': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.contentDirectoryTnved': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.contentTags': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.postContentTag': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.patchContentTag': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.deleteContentTag': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.postContentTagNomenclatureLink': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  // === Brands Tier: 1 req/sec (60 req/min), 1s interval, burst 5 ===\n  'products.brands': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 5,\n  },\n  'products.postContentGetCardsList': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  // === Content Exceptions Tier: 10 req/min, 6s interval, burst 5 ===\n  'products.postContentCardsErrorList': {\n    requestsPerMinute: 10,\n    intervalSeconds: 6,\n    burstLimit: 5,\n  },\n  'products.postContentCardsUpdate': {\n    requestsPerMinute: 10,\n    intervalSeconds: 6,\n    burstLimit: 5,\n  },\n  'products.postContentCardsMoveNm': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.postContentCardsDeleteTrash': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.postContentCardsRecover': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.postContentCardsDelete': {\n    // Sandbox-only at v3.13.1 release; rate limits assumed parity with\n    // products.postContentCardsRecover (sibling operation). Re-check after WB\n    // production release per WL-5 in `backlog/watch-list.md`.\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.postContentGetCardsTrash': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.contentCardsLimits': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.postContentBarcodes': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.postContentCardsUpload': {\n    requestsPerMinute: 10,\n    intervalSeconds: 6,\n    burstLimit: 5,\n  },\n  'products.postContentCardsUploadAdd': {\n    requestsPerMinute: 10,\n    intervalSeconds: 6,\n    burstLimit: 5,\n  },\n  'products.postContentMediaFile': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.postContentMediaSave': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  // === Prices & Discounts Tier ===\n  // API enforces: 10 requests per 6-second window, 600ms minimum interval, burst 5\n  // RateLimiter equivalent: 100 req/min (10/6s = 100/60s)\n  // Server: https://discounts-prices-api.wildberries.ru\n  'products.postUploadTask': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.postUploadTaskSize': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.postUploadTaskClubDiscount': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.historyTasks': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.historyGoodsTask': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.bufferTasks': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.bufferGoodsTask': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.listGoodsFilter': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.postListGoodsFilter': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.listGoodsSizeNm': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'products.quarantineGoods': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  // === Marketplace Tier (Stocks & Warehouses): 300 req/min, 200ms interval, burst 20 ===\n  /** POST /api/v3/stocks/{warehouseId} — 409 response counts as 10 requests against rate limit */\n  'products.postStocks': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  /** PUT /api/v3/stocks/{warehouseId} — 409 response counts as 10 requests against rate limit */\n  'products.putStocks': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  /** DELETE /api/v3/stocks/{warehouseId} — 409 response counts as 10 requests against rate limit */\n  'products.deleteStocks': {\n    requestsPerMinute: 10,\n    intervalSeconds: 6,\n    burstLimit: 2,\n    penaltyMultiplier: 10,\n  },\n  'products.offices': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'products.warehouses': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'products.postWarehouses': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'products.putWarehouses': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'products.deleteWarehouses': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'products.dbwWarehousesContacts': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'products.putDbwWarehousesContacts': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n};\n","/**\n * Auto-generated rate limit configuration for orders-fbs module\n * Generated from: wildberries_api_doc/03-orders-fbs.yaml\n * DO NOT EDIT MANUALLY - Changes will be overwritten on regeneration\n *\n * This file contains rate limit configurations extracted from OpenAPI operation descriptions.\n * Rate limits are enforced by the RateLimiter (Story 1.4) using the token bucket algorithm.\n *\n * @see {@link ../../src/client/rate-limiter!RateLimiter RateLimiter Documentation}\n * @module config/orders-fbs-rate-limits\n * @generated\n */\n\nimport type { RateLimitConfig } from '../client/rate-limiter';\n\nexport const ordersFbsRateLimits: Record<string, RateLimitConfig> = {\n  // === Tier 1: General FBS — 300 req/min, 200ms interval, burst 20 (409 = 10 requests) ===\n  'orders-fbs.ordersNew': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.orders': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.postOrdersStatus': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.suppliesOrdersReshipment': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.postOrdersStickers': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.postOrdersStickersCrossBorder': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.postOrdersStatusHistory': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.postOrdersClient': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.ordersMeta': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.deleteOrdersMeta': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.supplies': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.postSupplies': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.getSupply': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.deleteSupplies': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.suppliesOrders': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.patchSuppliesDeliver': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.suppliesBarcode': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.suppliesTrbx': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.postSuppliesTrbx': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.deleteSuppliesTrbx': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.postSuppliesTrbxStickers': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.passesOffices': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.passes': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.putPasses': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.deletePasses': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.patchSuppliesOrders': {\n    requestsPerMinute: 1000,\n    intervalSeconds: 0.06,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  /** @deprecated Endpoint removed from API */\n  'orders-fbs.postFilesOrdersExternalStickers': {\n    requestsPerMinute: 10,\n    intervalSeconds: 6,\n    burstLimit: 5,\n    penaltyMultiplier: 10,\n  },\n  /** PATCH /api/marketplace/v3/supplies/{supplyId}/orders — Add assembly tasks to supply (bulk) */\n  'orders-fbs.patchMarketplaceSuppliesOrders': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  /** GET /api/marketplace/v3/supplies/{supplyId}/order-ids — Get supply order IDs */\n  'orders-fbs.getMarketplaceSuppliesOrderIds': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n\n  // === Tier 2: Cancel Order — 100 req/min, 600ms interval, burst 20 (409 = 10 requests) ===\n  'orders-fbs.patchOrdersCancel': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n\n  // === Tier 3: Meta Attachment — 1000 req/min, 60ms interval, burst 20 (409 = 10 requests) ===\n  'orders-fbs.putOrdersMetaSgtin': {\n    requestsPerMinute: 1000,\n    intervalSeconds: 0.06,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.putOrdersMetaUin': {\n    requestsPerMinute: 1000,\n    intervalSeconds: 0.06,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.putOrdersMetaImei': {\n    requestsPerMinute: 1000,\n    intervalSeconds: 0.06,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.putOrdersMetaGtin': {\n    requestsPerMinute: 1000,\n    intervalSeconds: 0.06,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.putOrdersMetaExpiration': {\n    requestsPerMinute: 1000,\n    intervalSeconds: 0.06,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'orders-fbs.putOrdersMetaCustomsDeclaration': {\n    requestsPerMinute: 1000,\n    intervalSeconds: 0.06,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  /** POST /api/marketplace/v3/orders/meta — Get metadata for assembly tasks (bulk)\n   * Same rate limit group as GET/DELETE metadata operations */\n  'orders-fbs.postMarketplaceOrdersMeta': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n\n  // === Tier 4: Create Pass — 1 req/10min (409 = 10 requests) ===\n  'orders-fbs.postPasses': {\n    requestsPerMinute: 0.1,\n    intervalSeconds: 600,\n    burstLimit: 1,\n    penaltyMultiplier: 10,\n  },\n};\n","/**\n * Auto-generated rate limit configuration for orders-fbw module\n * Generated from: wildberries_api_doc/07-orders-fbw.yaml\n * DO NOT EDIT MANUALLY - Changes will be overwritten on regeneration\n *\n * This file contains rate limit configurations extracted from OpenAPI operation descriptions.\n * Rate limits are enforced by the RateLimiter (Story 1.4) using the token bucket algorithm.\n *\n * @see {@link ../../src/client/rate-limiter!RateLimiter RateLimiter Documentation}\n * @module config/orders-fbw-rate-limits\n * @generated\n */\n\nimport type { RateLimitConfig } from '../client/rate-limiter';\n\nexport const ordersFbwRateLimits: Record<string, RateLimitConfig> = {\n  'orders-fbw.acceptanceCoefficients': {\n    requestsPerMinute: 6,\n    intervalSeconds: 10,\n    burstLimit: 6,\n  },\n  'orders-fbw.postAcceptanceOptions': {\n    requestsPerMinute: 6,\n    intervalSeconds: 10,\n    burstLimit: 6,\n  },\n  'orders-fbw.warehouses': {\n    requestsPerMinute: 6,\n    intervalSeconds: 10,\n    burstLimit: 6,\n  },\n  'orders-fbw.transitTariffs': {\n    requestsPerMinute: 6,\n    intervalSeconds: 10,\n    burstLimit: 10,\n  },\n  'orders-fbw.postSupplies': {\n    requestsPerMinute: 30,\n    intervalSeconds: 2,\n    burstLimit: 10,\n  },\n  'orders-fbw.supplies': {\n    requestsPerMinute: 30,\n    intervalSeconds: 2,\n    burstLimit: 10,\n  },\n  'orders-fbw.suppliesGoods': {\n    requestsPerMinute: 30,\n    intervalSeconds: 2,\n    burstLimit: 10,\n  },\n  'orders-fbw.suppliesPackage': {\n    requestsPerMinute: 30,\n    intervalSeconds: 2,\n    burstLimit: 10,\n  },\n  // POST /api/marketplace/v3/dbw/orders/client — buyer info for DBW orders\n  // Note: 409 response counts as 10 requests (penaltyMultiplier)\n  'orders-fbw.getClientInfo': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n\n  // DBW bulk endpoints — defaults inherited from `orders-fbw.getClientInfo` (the existing DBW\n  // endpoint), NOT from DBS bulk endpoints (which use 60/1/10). These are best-effort estimates\n  // pending the WB swagger update by task-15.5; regenerate this section when canonical limits\n  // are published.\n  // 409 response counts as 10 requests (penaltyMultiplier)\n  'orders-fbw.deleteMetaBulkDBW': {\n    requestsPerMinute: 150,\n    intervalSeconds: 0.4,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  // 409 response counts as 10 requests (penaltyMultiplier)\n  'orders-fbw.setSgtinBulkDBW': {\n    requestsPerMinute: 500,\n    intervalSeconds: 0.12,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  // 409 response counts as 10 requests (penaltyMultiplier)\n  'orders-fbw.deliverBulkDBW': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  // POST /api/marketplace/v3/dbw/orders/meta/details — pre-flight metadata validation\n  // 409 response counts as 10 requests (penaltyMultiplier — same as deliverBulk DBW)\n  'orders-fbw.checkMetaValidationDBW': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n};\n","/**\n * Rate limit configuration for orders-dbs module\n * Source: wildberries_api_doc/04-orders-dbs/ (OpenAPI operation descriptions)\n *\n * This file contains rate limit configurations for all DBS (Delivery by Seller)\n * endpoints. Rate limits are enforced by the RateLimiter (Story 1.4) using\n * the token bucket algorithm.\n *\n * DBS API uses a 4-tier rate limit system:\n *\n * | Tier | Name             | RPM     | Interval | Burst | Entries |\n * |------|------------------|---------|----------|-------|---------|\n * | T1   | Assembly Read    | 300/min | 200ms    | 20    | 6       |\n * | T2   | Status Write     | 60/min  | 1s       | 10    | 10      |\n * | T3   | Meta Read/Delete | 150/min | 400ms    | 20    | 2       |\n * | T4   | Meta Set         | 500/min | 120ms    | 20    | 1       |\n *\n * Total entries: 19\n *\n * @see {@link ../../src/client/rate-limiter!RateLimiter RateLimiter Documentation}\n * @module config/orders-dbs-rate-limits\n */\n\nimport type { RateLimitConfig } from '../client/rate-limiter';\n\nexport const ordersDbsRateLimits: Record<string, RateLimitConfig> = {\n  // ============================================================================\n  // T1: Assembly Read (300 req/min, 200ms interval, burst 20)\n  // Core read operations, status queries, B2B info\n  // ============================================================================\n\n  /** Get new DBS orders awaiting delivery */\n  'orders-dbs.getNewOrders': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n\n  /** Get completed DBS orders with pagination */\n  'orders-dbs.getOrders': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n\n  /** Get customer contact information */\n  'orders-dbs.getClientInfo': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n\n  /** Get status info for multiple orders (bulk) */\n  'orders-dbs.getStatusesBulk': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n\n  /** Get order statuses (legacy, deprecated 13.04.2026) */\n  'orders-dbs.getStatuses': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n\n  /** Get B2B buyer information */\n  'orders-dbs.getB2BInfo': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n\n  // ============================================================================\n  // T2: Status Write (60 req/min, 1s interval, burst 10)\n  // Bulk and legacy status mutation operations\n  // ============================================================================\n\n  /** Confirm multiple orders (bulk) */\n  'orders-dbs.confirmBulk': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 10,\n    penaltyMultiplier: 10,\n  },\n\n  /** Mark multiple orders as delivered (bulk) */\n  'orders-dbs.deliverBulk': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 10,\n    penaltyMultiplier: 10,\n  },\n\n  /** Complete handover for multiple orders (bulk) */\n  'orders-dbs.receiveBulk': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 10,\n    penaltyMultiplier: 10,\n  },\n\n  /** Reject multiple orders (bulk) */\n  'orders-dbs.rejectBulk': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 10,\n    penaltyMultiplier: 10,\n  },\n\n  /** Cancel multiple orders (bulk) */\n  'orders-dbs.cancelBulk': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 10,\n    penaltyMultiplier: 10,\n  },\n\n  /** Confirm single order (legacy, deprecated 13.04.2026) */\n  'orders-dbs.confirm': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 10,\n    penaltyMultiplier: 10,\n  },\n\n  /** Mark single order as delivered (legacy, deprecated 13.04.2026) */\n  'orders-dbs.deliver': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 10,\n    penaltyMultiplier: 10,\n  },\n\n  /** Complete handover for single order (legacy, deprecated 13.04.2026) */\n  'orders-dbs.receive': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 10,\n    penaltyMultiplier: 10,\n  },\n\n  /** Reject single order (legacy, deprecated 13.04.2026) */\n  'orders-dbs.reject': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 10,\n    penaltyMultiplier: 10,\n  },\n\n  /** Cancel single order (legacy, deprecated 13.04.2026) */\n  'orders-dbs.cancel': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 10,\n    penaltyMultiplier: 10,\n  },\n\n  // ============================================================================\n  // T3: Meta Read/Delete (150 req/min, 400ms interval, burst 20)\n  // Metadata retrieval and deletion operations\n  // ============================================================================\n\n  /** Get order metadata */\n  'orders-dbs.getMeta': {\n    requestsPerMinute: 150,\n    intervalSeconds: 0.4,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n\n  /** Delete order metadata */\n  'orders-dbs.deleteMeta': {\n    requestsPerMinute: 150,\n    intervalSeconds: 0.4,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n\n  // ============================================================================\n  // T4: Meta Set (500 req/min, 120ms interval, burst 20)\n  // Shared key for all metadata set operations:\n  //   setSgtin, setUin, setImei, setGtin, setCustomsDeclaration\n  // ============================================================================\n\n  /** Set order metadata (shared key for sgtin, uin, imei, gtin, customs declaration) */\n  'orders-dbs.setMeta': {\n    requestsPerMinute: 500,\n    intervalSeconds: 0.12,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n\n  // ============================================================================\n  // T5: New Info Endpoints (300 req/min, 200ms interval, burst 20) - Story 26.1\n  // ============================================================================\n\n  /** Get paid delivery groups info */\n  'orders-dbs.getGroupsInfo': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n\n  /** Get delivery dates for orders */\n  'orders-dbs.getDeliveryDates': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n\n  // ============================================================================\n  // T6: Bulk Metadata Read/Delete (150 req/min, 400ms interval, burst 20) - Story 26.2\n  // ============================================================================\n\n  /** Get metadata bulk */\n  'orders-dbs.getMetaBulk': {\n    requestsPerMinute: 150,\n    intervalSeconds: 0.4,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n\n  /** Delete metadata bulk */\n  'orders-dbs.deleteMetaBulk': {\n    requestsPerMinute: 150,\n    intervalSeconds: 0.4,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n\n  // ============================================================================\n  // T7: Bulk Metadata Set (500 req/min, 120ms interval, burst 20) - Story 26.2\n  // ============================================================================\n\n  /** Set SGTIN bulk */\n  'orders-dbs.setSgtinBulk': {\n    requestsPerMinute: 500,\n    intervalSeconds: 0.12,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n\n  /** Set UIN bulk */\n  'orders-dbs.setUinBulk': {\n    requestsPerMinute: 500,\n    intervalSeconds: 0.12,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n\n  /** Set IMEI bulk */\n  'orders-dbs.setImeiBulk': {\n    requestsPerMinute: 500,\n    intervalSeconds: 0.12,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n\n  /** Set GTIN bulk */\n  'orders-dbs.setGtinBulk': {\n    requestsPerMinute: 500,\n    intervalSeconds: 0.12,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n\n  /** Set customs declaration bulk */\n  'orders-dbs.setCustomsDeclarationBulk': {\n    requestsPerMinute: 500,\n    intervalSeconds: 0.12,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n};\n","/**\n * Auto-generated rate limit configuration for user-management module\n * Generated from: wildberries_api_doc/01-general.yaml (User Management endpoints)\n * DO NOT EDIT MANUALLY - Changes will be overwritten on regeneration\n *\n * This file contains rate limit configurations extracted from OpenAPI operation descriptions.\n * Rate limits are enforced by the RateLimiter (Story 1.4) using the token bucket algorithm.\n *\n * @see {@link ../../src/client/rate-limiter!RateLimiter RateLimiter Documentation}\n * @module config/user-management-rate-limits\n * @generated\n */\n\nimport type { RateLimitConfig } from '../client/rate-limiter';\n\nexport const userManagementRateLimits: Record<string, RateLimitConfig> = {\n  'userManagement.createInvite': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 5,\n  },\n  'userManagement.getUsers': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 5,\n  },\n  'userManagement.updateAccess': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 5,\n  },\n  'userManagement.deleteUser': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 10,\n  },\n};\n","/**\n * Auto-generated rate limit configuration for finances module\n * Generated from: wildberries_api_doc/13-finances.yaml\n * DO NOT EDIT MANUALLY - Changes will be overwritten on regeneration\n *\n * This file contains rate limit configurations extracted from OpenAPI operation descriptions.\n * Rate limits are enforced by the RateLimiter (Story 1.4) using the token bucket algorithm.\n *\n * @see {@link ../../src/client/rate-limiter!RateLimiter RateLimiter Documentation}\n * @module config/finances-rate-limits\n * @generated\n */\n\nimport type { RateLimitConfig } from '../client/rate-limiter';\n\nexport const financesRateLimits: Record<string, RateLimitConfig> = {\n  'finances.accountBalance': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 1,\n  },\n  'finances.supplierReportDetailByPeriod': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 1,\n  },\n  'finances.documentsCategories': {\n    requestsPerMinute: 6,\n    intervalSeconds: 10,\n    burstLimit: 5,\n  },\n  'finances.documentsList': {\n    requestsPerMinute: 6,\n    intervalSeconds: 10,\n    burstLimit: 5,\n  },\n  'finances.documentsDownload': {\n    requestsPerMinute: 6,\n    intervalSeconds: 10,\n    burstLimit: 5,\n  },\n  'finances.createDownloadAll': {\n    requestsPerMinute: 1,\n    intervalSeconds: 300,\n    burstLimit: 5,\n  },\n  // v1 Sales Reports (since v3.7.0) — 1 req/min per WB spec\n  'finances.salesReportsList': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 1,\n  },\n  'finances.salesReportsDetailed': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 1,\n  },\n  'finances.salesReportsDetailedByReportId': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 1,\n  },\n  // v1 Acquiring Reports (since v3.7.0) — RU-only, 1 req/min per WB spec\n  'finances.acquiringReportsList': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 1,\n  },\n  'finances.acquiringReportsDetailed': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 1,\n  },\n  'finances.acquiringReportsDetailedByReportId': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 1,\n  },\n};\n","/**\n * Auto-generated rate limit configuration for promotion module\n * Generated from: wildberries_api_doc/08-promotion.yaml\n * DO NOT EDIT MANUALLY - Changes will be overwritten on regeneration\n *\n * This file contains rate limit configurations extracted from OpenAPI operation descriptions.\n * Rate limits are enforced by the RateLimiter (Story 1.4) using the token bucket algorithm.\n *\n * @see {@link ../../src/client/rate-limiter!RateLimiter RateLimiter Documentation}\n * @module config/promotion-rate-limits\n * @generated\n */\n\nimport type { RateLimitConfig } from '../client/rate-limiter';\n\nexport const promotionRateLimits: Record<string, RateLimitConfig> = {\n  'promotion.advPromotionCount': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 5,\n  },\n  'promotion.postAdvPromotionAdverts': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 5,\n  },\n  'promotion.advAuctionAdverts': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 5,\n  },\n  'promotion.advConfig': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 1,\n  },\n  'promotion.postAdvBidsMin': {\n    requestsPerMinute: 20,\n    intervalSeconds: 3,\n    burstLimit: 5,\n  },\n  'promotion.postAdvSaveAd': {\n    requestsPerMinute: 3,\n    intervalSeconds: 20,\n    burstLimit: 5,\n  },\n  'promotion.postAdvSeacatSaveAd': {\n    requestsPerMinute: 5,\n    intervalSeconds: 12,\n    burstLimit: 5,\n  },\n  'promotion.advSupplierSubjects': {\n    requestsPerMinute: 5,\n    intervalSeconds: 12,\n    burstLimit: 5,\n  },\n  'promotion.postAdvSupplierNms': {\n    requestsPerMinute: 5,\n    intervalSeconds: 12,\n    burstLimit: 5,\n  },\n  'promotion.advDelete': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 5,\n  },\n  'promotion.postAdvRename': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 5,\n  },\n  'promotion.advStart': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 5,\n  },\n  'promotion.advPause': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 5,\n  },\n  'promotion.advStop': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 5,\n  },\n  'promotion.patchAdvBids': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 5,\n  },\n  'promotion.putAdvAuctionPlacements': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 1,\n  },\n  'promotion.patchAdvAuctionBids': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 5,\n  },\n  // GET /api/advert/v0/bids/recommendations — recommended bids for product cards and search clusters (cpm only)\n  'promotion.getBidsRecommendations': {\n    requestsPerMinute: 5,\n    intervalSeconds: 12,\n    burstLimit: 5,\n  },\n  'promotion.advBalance': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 5,\n  },\n  'promotion.advBudget': {\n    requestsPerMinute: 240,\n    intervalSeconds: 0.25,\n    burstLimit: 4,\n  },\n  'promotion.postAdvBudgetDeposit': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 5,\n  },\n  'promotion.advUpd': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 5,\n  },\n  'promotion.advPayments': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 5,\n  },\n  'promotion.advSearchSetPlus': {\n    requestsPerMinute: 10,\n    intervalSeconds: 6,\n    burstLimit: 5,\n  },\n  'promotion.postAdvSearchSetPlus': {\n    requestsPerMinute: 10,\n    intervalSeconds: 6,\n    burstLimit: 5,\n  },\n  'promotion.postAdvSearchSetExcluded': {\n    requestsPerMinute: 120,\n    intervalSeconds: 0.5,\n    burstLimit: 2,\n  },\n  'promotion.postAdvAutoSetExcluded': {\n    requestsPerMinute: 10,\n    intervalSeconds: 6,\n    burstLimit: 5,\n  },\n  'promotion.advAutoGetnmtoadd': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 5,\n  },\n  'promotion.postAdvAutoUpdatenm': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 5,\n  },\n  'promotion.patchAdvAuctionNms': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 1,\n  },\n  'promotion.advCount': {\n    requestsPerMinute: 600,\n    intervalSeconds: 0.1,\n    burstLimit: 10,\n  },\n  'promotion.advAdverts': {\n    requestsPerMinute: 600,\n    intervalSeconds: 0.1,\n    burstLimit: 10,\n  },\n  'promotion.advAdvert': {\n    requestsPerMinute: 600,\n    intervalSeconds: 0.1,\n    burstLimit: 10,\n  },\n  'promotion.postAdvFullstats': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 5,\n  },\n  'promotion.advFullstats': {\n    requestsPerMinute: 3,\n    intervalSeconds: 20,\n    burstLimit: 1,\n  },\n  'promotion.advAutoStatWords': {\n    requestsPerMinute: 240,\n    intervalSeconds: 0.25,\n    burstLimit: 4,\n  },\n  'promotion.advStatWords': {\n    requestsPerMinute: 240,\n    intervalSeconds: 0.25,\n    burstLimit: 4,\n  },\n  'promotion.advStatsKeywords': {\n    requestsPerMinute: 240,\n    intervalSeconds: 0.25,\n    burstLimit: 4,\n  },\n  'promotion.postAdvStats': {\n    requestsPerMinute: 600,\n    intervalSeconds: 0.1,\n    burstLimit: 10,\n  },\n  'promotion.calendarPromotions': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'promotion.calendarPromotionsDetails': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'promotion.calendarPromotionsNomenclatures': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n  'promotion.postCalendarPromotionsUpload': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 5,\n  },\n\n  // ============================================================================\n  // Search Clusters (NormQuery) Rate Limits - NEW in Feb 2026\n  // ============================================================================\n\n  /** POST /adv/v0/normquery/stats - Get search cluster statistics */\n  'promotion.normqueryStats': {\n    requestsPerMinute: 10,\n    intervalSeconds: 6,\n    burstLimit: 20,\n  },\n\n  /** POST /adv/v0/normquery/get-bids - Get current bids for clusters */\n  'promotion.normqueryGetBids': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 10,\n  },\n\n  /** POST /adv/v0/normquery/bids - Set bids for clusters */\n  'promotion.normquerySetBids': {\n    requestsPerMinute: 120,\n    intervalSeconds: 0.5,\n    burstLimit: 4,\n  },\n\n  /** DELETE /adv/v0/normquery/bids - Delete cluster bids */\n  'promotion.normqueryDeleteBids': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 10,\n  },\n\n  /** POST /adv/v0/normquery/get-minus - Get minus-phrases */\n  'promotion.normqueryGetMinus': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 10,\n  },\n\n  /** POST /adv/v0/normquery/set-minus - Set minus-phrases */\n  'promotion.normquerySetMinus': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 10,\n  },\n\n  // ============================================================================\n  // V2 Replacement Endpoints Rate Limits - NEW in Feb 2026\n  // ============================================================================\n\n  /** GET /api/advert/v2/adverts - Get adverts (replaces deprecated v1) */\n  'promotion.advertsV2': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 5,\n  },\n\n  /** POST /api/advert/v1/bids/min - Get min bids (new API path) */\n  'promotion.bidsMinV1': {\n    requestsPerMinute: 20,\n    intervalSeconds: 3,\n    burstLimit: 5,\n  },\n\n  /** PATCH /api/advert/v1/bids - Update bids (new API path) */\n  'promotion.bidsV1': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 10,\n  },\n\n  // ============================================================================\n  // Campaign Management Rate Limits - NEW\n  // ============================================================================\n\n  /** GET /adv/v1/promotion/count - Get campaign count and list */\n  'promotion.getCampaignCount': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 5,\n  },\n\n  /** POST /adv/v2/seacat/save-ad - Create campaign */\n  'promotion.createCampaign': {\n    requestsPerMinute: 5,\n    intervalSeconds: 12,\n    burstLimit: 5,\n  },\n\n  /** GET /adv/v1/supplier/subjects - Get supplier subjects */\n  'promotion.getSupplierSubjects': {\n    requestsPerMinute: 5,\n    intervalSeconds: 12,\n    burstLimit: 5,\n  },\n\n  /** POST /adv/v2/supplier/nms - Get supplier product cards */\n  'promotion.getSupplierNms': {\n    requestsPerMinute: 5,\n    intervalSeconds: 12,\n    burstLimit: 5,\n  },\n\n  /** GET /adv/v0/start - Start campaign */\n  'promotion.startCampaign': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 5,\n  },\n\n  /** GET /adv/v0/pause - Pause campaign */\n  'promotion.pauseCampaign': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 5,\n  },\n\n  // ============================================================================\n  // New Methods Rate Limits - Feb 2026\n  // ============================================================================\n\n  /** PATCH /api/advert/v1/bids - Update bids with bid_kopecks */\n  'promotion.updateBids': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 10,\n  },\n\n  /** PATCH /adv/v0/auction/nms - Add/remove products from campaigns */\n  'promotion.updateCampaignProducts': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 1,\n  },\n\n  // ============================================================================\n  // Aliases for New Method Names (task-54, task-55)\n  // ============================================================================\n\n  /** POST /adv/v0/normquery/get-minus - Alias for getMinusPhrases() */\n  'promotion.getMinusPhrases': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 10,\n  },\n\n  /** POST /adv/v0/normquery/set-minus - Alias for setMinusPhrases() */\n  'promotion.setMinusPhrases': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 10,\n  },\n\n  /** POST /adv/v0/normquery/stats - Alias for getSearchClusterStats() */\n  'promotion.getSearchClusterStats': {\n    requestsPerMinute: 10,\n    intervalSeconds: 6,\n    burstLimit: 20,\n  },\n};\n","/**\n * Auto-generated rate limit configuration for tariffs module\n * Generated from: wildberries_api_doc/10-tariffs.yaml\n * DO NOT EDIT MANUALLY - Changes will be overwritten on regeneration\n *\n * This file contains rate limit configurations extracted from OpenAPI operation descriptions.\n * Rate limits are enforced by the RateLimiter (Story 1.4) using the token bucket algorithm.\n *\n * @see {@link ../../src/client/rate-limiter!RateLimiter RateLimiter Documentation}\n * @module config/tariffs-rate-limits\n * @generated\n */\n\nimport type { RateLimitConfig } from '../client/rate-limiter';\n\nexport const tariffsRateLimits: Record<string, RateLimitConfig> = {\n  'tariffs.tariffsCommission': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 2\n  },\n  'tariffs.tariffsBox': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 5\n  },\n  'tariffs.tariffsPallet': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 5\n  },\n  'tariffs.tariffsReturn': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 5\n  },\n  'tariffs.acceptanceCoefficients': {\n    requestsPerMinute: 6,\n    intervalSeconds: 10,\n    burstLimit: 6\n  }\n};\n","/**\n * Auto-generated rate limit configuration for in-store-pickup module\n * Generated from: wildberries_api_doc/06-in-store-pickup.yaml\n * DO NOT EDIT MANUALLY - Changes will be overwritten on regeneration\n *\n * This file contains rate limit configurations extracted from OpenAPI operation descriptions.\n * Rate limits are enforced by the RateLimiter (Story 1.4) using the token bucket algorithm.\n *\n * @see {@link ../../src/client/rate-limiter!RateLimiter RateLimiter Documentation}\n * @module config/in-store-pickup-rate-limits\n * @generated\n */\n\nimport type { RateLimitConfig } from '../client/rate-limiter';\n\nexport const inStorePickupRateLimits: Record<string, RateLimitConfig> = {\n  'in-store-pickup.clickCollectOrdersNew': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'in-store-pickup.patchClickCollectOrdersConfirm': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'in-store-pickup.patchClickCollectOrdersPrepare': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'in-store-pickup.postClickCollectOrdersClient': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'in-store-pickup.postClickCollectOrdersClientIdentity': {\n    requestsPerMinute: 30,\n    intervalSeconds: 2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'in-store-pickup.patchClickCollectOrdersReceive': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'in-store-pickup.patchClickCollectOrdersReject': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'in-store-pickup.postClickCollectOrdersStatus': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'in-store-pickup.clickCollectOrders': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'in-store-pickup.patchClickCollectOrdersCancel': {\n    requestsPerMinute: 100,\n    intervalSeconds: 0.6,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'in-store-pickup.clickCollectOrdersMeta': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'in-store-pickup.deleteClickCollectOrdersMeta': {\n    requestsPerMinute: 300,\n    intervalSeconds: 0.2,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'in-store-pickup.putClickCollectOrdersMetaSgtin': {\n    requestsPerMinute: 1000,\n    intervalSeconds: 0.06,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'in-store-pickup.putClickCollectOrdersMetaUin': {\n    requestsPerMinute: 1000,\n    intervalSeconds: 0.06,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'in-store-pickup.putClickCollectOrdersMetaImei': {\n    requestsPerMinute: 1000,\n    intervalSeconds: 0.06,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n  'in-store-pickup.putClickCollectOrdersMetaGtin': {\n    requestsPerMinute: 1000,\n    intervalSeconds: 0.06,\n    burstLimit: 20,\n    penaltyMultiplier: 10,\n  },\n};\n","/**\n * Auto-generated rate limit configuration for analytics module\n * Generated from: wildberries_api_doc/11-analytics.yaml\n * DO NOT EDIT MANUALLY - Changes will be overwritten on regeneration\n *\n * This file contains rate limit configurations extracted from OpenAPI operation descriptions.\n * Rate limits are enforced by the RateLimiter (Story 1.4) using the token bucket algorithm.\n *\n * @see {@link ../../src/client/rate-limiter!RateLimiter RateLimiter Documentation}\n * @module config/analytics-rate-limits\n * @generated\n */\n\nimport type { RateLimitConfig } from '../client/rate-limiter';\n\nexport const analyticsRateLimits: Record<string, RateLimitConfig> = {\n  /**\n   * @deprecated v2 endpoint is dead (404). Wrapper delegates to postSalesFunnelProducts.\n   */\n  'analytics.postNmReportDetail': {\n    requestsPerMinute: 3,\n    intervalSeconds: 20,\n    burstLimit: 3,\n  },\n  /**\n   * @deprecated v2 endpoint is dead (404). Wrapper delegates to postSalesFunnelProductsHistory.\n   */\n  'analytics.postNmReportDetailHistory': {\n    requestsPerMinute: 3,\n    intervalSeconds: 20,\n    burstLimit: 3,\n  },\n  /**\n   * @deprecated v2 endpoint is dead (404). Wrapper delegates to postSalesFunnelGroupedHistory.\n   */\n  'analytics.postNmReportGroupedHistory': {\n    requestsPerMinute: 3,\n    intervalSeconds: 20,\n    burstLimit: 3,\n  },\n  'analytics.nmReportDownloads': {\n    requestsPerMinute: 3,\n    intervalSeconds: 20,\n    burstLimit: 3,\n  },\n  'analytics.postNmReportDownloads': {\n    requestsPerMinute: 3,\n    intervalSeconds: 20,\n    burstLimit: 3,\n  },\n  'analytics.postNmReportDownloadsRetry': {\n    requestsPerMinute: 3,\n    intervalSeconds: 20,\n    burstLimit: 3,\n  },\n  'analytics.nmReportDownloadsFile': {\n    requestsPerMinute: 3,\n    intervalSeconds: 20,\n    burstLimit: 3,\n  },\n  'analytics.postSearchReportReport': {\n    requestsPerMinute: 3,\n    intervalSeconds: 20,\n    burstLimit: 3,\n  },\n  'analytics.postSearchReportTableGroups': {\n    requestsPerMinute: 3,\n    intervalSeconds: 20,\n    burstLimit: 3,\n  },\n  'analytics.postSearchReportTableDetails': {\n    requestsPerMinute: 3,\n    intervalSeconds: 20,\n    burstLimit: 3,\n  },\n  'analytics.postSearchReportProductSearchTexts': {\n    requestsPerMinute: 3,\n    intervalSeconds: 20,\n    burstLimit: 3,\n  },\n  'analytics.postSearchReportProductOrders': {\n    requestsPerMinute: 3,\n    intervalSeconds: 20,\n    burstLimit: 3,\n  },\n  'analytics.postStocksReportProductsGroups': {\n    requestsPerMinute: 3,\n    intervalSeconds: 20,\n    burstLimit: 3,\n  },\n  'analytics.postStocksReportProductsProducts': {\n    requestsPerMinute: 3,\n    intervalSeconds: 20,\n    burstLimit: 3,\n  },\n  'analytics.postStocksReportProductsSizes': {\n    requestsPerMinute: 3,\n    intervalSeconds: 20,\n    burstLimit: 3,\n  },\n  'analytics.postStocksReportOffices': {\n    requestsPerMinute: 3,\n    intervalSeconds: 20,\n    burstLimit: 3,\n  },\n  // v1 WB Warehouses Inventory (new endpoint, replaces deprecated /api/v1/supplier/stocks)\n  'analytics.postStocksReportWbWarehouses': {\n    requestsPerMinute: 3,\n    intervalSeconds: 20,\n    burstLimit: 1,\n  },\n  // v3 Sales Funnel endpoints\n  'analytics.postSalesFunnelProducts': {\n    requestsPerMinute: 3,\n    intervalSeconds: 20,\n    burstLimit: 3,\n  },\n  'analytics.postSalesFunnelProductsHistory': {\n    requestsPerMinute: 3,\n    intervalSeconds: 20,\n    burstLimit: 3,\n  },\n  'analytics.postSalesFunnelGroupedHistory': {\n    requestsPerMinute: 3,\n    intervalSeconds: 20,\n    burstLimit: 3,\n  },\n};\n","/**\n * Auto-generated rate limit configuration for reports module\n * Generated from: wildberries_api_doc/12-reports.yaml\n * DO NOT EDIT MANUALLY - Changes will be overwritten on regeneration\n *\n * This file contains rate limit configurations extracted from OpenAPI operation descriptions.\n * Rate limits are enforced by the RateLimiter (Story 1.4) using the token bucket algorithm.\n *\n * @see {@link ../../src/client/rate-limiter!RateLimiter RateLimiter Documentation}\n * @module config/reports-rate-limits\n * @generated\n */\n\nimport type { RateLimitConfig } from '../client/rate-limiter';\n\nexport const reportsRateLimits: Record<string, RateLimitConfig> = {\n  'reports.supplierIncomes': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 1,\n  },\n  'reports.supplierStocks': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 1,\n  },\n  'reports.supplierOrders': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 1,\n  },\n  'reports.supplierSales': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 1,\n  },\n  'reports.postAnalyticsExciseReport': {\n    requestsPerMinute: 0,\n    intervalSeconds: 1800,\n    burstLimit: 10,\n  },\n  'reports.warehouse_remains': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 5,\n  },\n  'reports.warehouse_remainsTasksStatus': {\n    requestsPerMinute: 12,\n    intervalSeconds: 5,\n    burstLimit: 5,\n  },\n  'reports.warehouse_remainsTasksDownload': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 1,\n  },\n  'reports.analyticsWarehouseMeasurements': {\n    requestsPerMinute: 5,\n    intervalSeconds: 12,\n    burstLimit: 1,\n  },\n  'reports.analyticsAntifraudDetails': {\n    requestsPerMinute: 0,\n    intervalSeconds: 600,\n    burstLimit: 10,\n  },\n  'reports.analyticsIncorrectAttachments': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 10,\n  },\n  'reports.analyticsGoodsLabeling': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 10,\n  },\n  // @deprecated - endpoint removed from swagger, kept for backward compatibility\n  'reports.analyticsCharacteristicsChange': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 10,\n  },\n  'reports.acceptance_report': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 1,\n  },\n  'reports.acceptance_reportTasksStatus': {\n    requestsPerMinute: 12,\n    intervalSeconds: 5,\n    burstLimit: 1,\n  },\n  'reports.acceptance_reportTasksDownload': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 1,\n  },\n  'reports.paid_storage': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 5,\n  },\n  'reports.paid_storageTasksStatus': {\n    requestsPerMinute: 12,\n    intervalSeconds: 5,\n    burstLimit: 5,\n  },\n  'reports.paid_storageTasksDownload': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 1,\n  },\n  'reports.analyticsRegionSale': {\n    requestsPerMinute: 6,\n    intervalSeconds: 10,\n    burstLimit: 5,\n  },\n  'reports.analyticsBrandShareBrands': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 10,\n  },\n  'reports.analyticsBrandShareParentSubjects': {\n    requestsPerMinute: 12,\n    intervalSeconds: 5,\n    burstLimit: 20,\n  },\n  'reports.analyticsBrandShare': {\n    requestsPerMinute: 12,\n    intervalSeconds: 5,\n    burstLimit: 20,\n  },\n  'reports.analyticsBannedProductsBlocked': {\n    requestsPerMinute: 6,\n    intervalSeconds: 10,\n    burstLimit: 6,\n  },\n  'reports.analyticsBannedProductsShadowed': {\n    requestsPerMinute: 6,\n    intervalSeconds: 10,\n    burstLimit: 6,\n  },\n  'reports.analyticsGoodsReturn': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 10,\n  },\n  // EPIC 44: New endpoints\n  'reports.measurementPenalties': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 1,\n  },\n  'reports.warehouseMeasurementsV2': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 1,\n  },\n  'reports.deductions': {\n    requestsPerMinute: 1,\n    intervalSeconds: 60,\n    burstLimit: 1,\n  },\n};\n","/**\n * Auto-generated rate limit configuration for communications module\n * Generated from: wildberries_api_doc/09-communications.yaml\n * DO NOT EDIT MANUALLY - Changes will be overwritten on regeneration\n *\n * This file contains rate limit configurations extracted from OpenAPI operation descriptions.\n * Rate limits are enforced by the RateLimiter (Story 1.4) using the token bucket algorithm.\n *\n * @see {@link ../../src/client/rate-limiter!RateLimiter RateLimiter Documentation}\n * @module config/communications-rate-limits\n * @generated\n */\n\nimport type { RateLimitConfig } from '../client/rate-limiter';\n\nexport const communicationsRateLimits: Record<string, RateLimitConfig> = {\n  'communications.newFeedbacksQuestions': {\n    requestsPerMinute: 180,\n    intervalSeconds: 0.333,\n    burstLimit: 6,\n  },\n  'communications.questionsCountUnanswered': {\n    requestsPerMinute: 180,\n    intervalSeconds: 0.333,\n    burstLimit: 6,\n  },\n  'communications.questionsCount': {\n    requestsPerMinute: 180,\n    intervalSeconds: 0.333,\n    burstLimit: 6,\n  },\n  'communications.questions': {\n    requestsPerMinute: 180,\n    intervalSeconds: 0.333,\n    burstLimit: 6,\n  },\n  'communications.patchQuestions': {\n    requestsPerMinute: 180,\n    intervalSeconds: 0.333,\n    burstLimit: 6,\n  },\n  'communications.question': {\n    requestsPerMinute: 180,\n    intervalSeconds: 0.333,\n    burstLimit: 6,\n  },\n  'communications.feedbacksCountUnanswered': {\n    requestsPerMinute: 180,\n    intervalSeconds: 0.333,\n    burstLimit: 6,\n  },\n  'communications.feedbacksCount': {\n    requestsPerMinute: 180,\n    intervalSeconds: 0.333,\n    burstLimit: 6,\n  },\n  'communications.feedbacks': {\n    requestsPerMinute: 180,\n    intervalSeconds: 0.333,\n    burstLimit: 6,\n  },\n  'communications.supplierValuations': {\n    requestsPerMinute: 180,\n    intervalSeconds: 0.333,\n    burstLimit: 6,\n  },\n  'communications.postFeedbacksActions': {\n    requestsPerMinute: 180,\n    intervalSeconds: 0.333,\n    burstLimit: 6,\n  },\n  'communications.postFeedbacksAnswer': {\n    requestsPerMinute: 180,\n    intervalSeconds: 0.333,\n    burstLimit: 6,\n  },\n  'communications.patchFeedbacksAnswer': {\n    requestsPerMinute: 180,\n    intervalSeconds: 0.333,\n    burstLimit: 6,\n  },\n  'communications.postFeedbacksOrderReturn': {\n    requestsPerMinute: 180,\n    intervalSeconds: 0.333,\n    burstLimit: 6,\n  },\n  'communications.feedback': {\n    requestsPerMinute: 180,\n    intervalSeconds: 0.333,\n    burstLimit: 6,\n  },\n  'communications.feedbacksArchive': {\n    requestsPerMinute: 180,\n    intervalSeconds: 0.333,\n    burstLimit: 6,\n  },\n  'communications.templates': {\n    requestsPerMinute: 180,\n    intervalSeconds: 0.333,\n    burstLimit: 6,\n  },\n  'communications.postTemplates': {\n    requestsPerMinute: 180,\n    intervalSeconds: 0.333,\n    burstLimit: 6,\n  },\n  'communications.patchTemplates': {\n    requestsPerMinute: 180,\n    intervalSeconds: 0.333,\n    burstLimit: 6,\n  },\n  'communications.deleteTemplates': {\n    requestsPerMinute: 180,\n    intervalSeconds: 0.333,\n    burstLimit: 6,\n  },\n  'communications.sellerChats': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 10,\n  },\n  'communications.sellerEvents': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 10,\n  },\n  'communications.postSellerMessage': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 10,\n  },\n  'communications.sellerDownload': {\n    requestsPerMinute: 60,\n    intervalSeconds: 1,\n    burstLimit: 10,\n  },\n  'communications.claims': {\n    requestsPerMinute: 20,\n    intervalSeconds: 3,\n    burstLimit: 10,\n  },\n  'communications.patchClaim': {\n    requestsPerMinute: 20,\n    intervalSeconds: 3,\n    burstLimit: 10,\n  },\n  'communications.getPinnedFeedbacksCount': {\n    requestsPerMinute: 180,\n    intervalSeconds: 0.333,\n    burstLimit: 6,\n  },\n  'communications.getPinnedFeedbacksLimits': {\n    requestsPerMinute: 180,\n    intervalSeconds: 0.333,\n    burstLimit: 6,\n  },\n  'communications.getPinnedFeedbacks': {\n    requestsPerMinute: 180,\n    intervalSeconds: 0.333,\n    burstLimit: 6,\n  },\n  'communications.pinFeedback': {\n    requestsPerMinute: 180,\n    intervalSeconds: 0.333,\n    burstLimit: 6,\n  },\n  'communications.unpinFeedback': {\n    requestsPerMinute: 180,\n    intervalSeconds: 0.333,\n    burstLimit: 6,\n  },\n};\n","/**\n * Aggregated Rate Limit Configuration\n *\n * Central export of all module-specific rate limit configurations.\n * This file combines auto-generated rate limits from all SDK modules for use by the RateLimiter.\n *\n * **Auto-Generation (Story 1.8):**\n * Individual module configs are automatically generated from OpenAPI specifications.\n * This aggregator imports and combines them into a single configuration object.\n *\n * **Module Structure:**\n * - Each module has its own rate limit file: `{module}-rate-limits.ts`\n * - Rate limits are parsed from OpenAPI operation descriptions (Russian rate limit tables)\n * - Conservative defaults (10 req/min, 6s interval, burst: 5) used when parsing fails\n *\n * @module config/rate-limits\n * @see {@link ../client/rate-limiter!RateLimiter RateLimiter Documentation}\n * @see {@link https://dev.wildberries.ru/openapi Wildberries API Documentation}\n */\n\nimport type { RateLimitConfig } from '../client/rate-limiter';\nimport { generalRateLimits } from './general-rate-limits';\nimport { productsRateLimits } from './products-rate-limits';\nimport { ordersFbsRateLimits } from './orders-fbs-rate-limits';\nimport { ordersFbwRateLimits } from './orders-fbw-rate-limits';\nimport { ordersDbsRateLimits } from './orders-dbs-rate-limits';\nimport { userManagementRateLimits } from './user-management-rate-limits';\nimport { financesRateLimits } from './finances-rate-limits';\nimport { promotionRateLimits } from './promotion-rate-limits';\nimport { tariffsRateLimits } from './tariffs-rate-limits';\nimport { inStorePickupRateLimits } from './in-store-pickup-rate-limits';\nimport { analyticsRateLimits } from './analytics-rate-limits';\nimport { reportsRateLimits } from './reports-rate-limits';\nimport { communicationsRateLimits } from './communications-rate-limits';\n\n/**\n * Aggregated rate limit configuration for all SDK modules.\n *\n * Combines rate limits from all generated modules into a single object.\n * Endpoint keys follow the format: `{moduleName}.{methodName}`\n *\n * **Current Modules:**\n * - general: General API endpoints (ping, news, seller info)\n * - products: Product management endpoints (categories, CRUD, media, pricing, stock)\n * - ordersFBS: FBS order retrieval and status management endpoints\n * - ordersFBW: FBW warehouse supply and acceptance endpoints\n *\n * **Future Modules (will be added as generated):**\n * - finances: Financial reporting endpoints\n * - analytics: Sales analytics endpoints\n * - reports: Async report generation endpoints\n * - communications: Chat, Q&A, reviews endpoints\n * - promotion: Marketing campaigns endpoints\n * - tariffs: Commission and fee endpoints\n * - inStorePickup: Pickup point management endpoints\n *\n * @example\n * ```typescript\n * import { ALL_RATE_LIMITS } from './config/rate-limits';\n * import { RateLimiter } from './client/rate-limiter';\n *\n * const limiter = new RateLimiter(ALL_RATE_LIMITS);\n * await limiter.waitForSlot('general.ping');\n * ```\n *\n * @example\n * ```typescript\n * // Access individual module limits\n * import { generalRateLimits } from './config/general-rate-limits';\n * console.log(generalRateLimits['general.ping']);\n * ```\n */\nexport const ALL_RATE_LIMITS = {\n  ...generalRateLimits,\n  ...productsRateLimits,\n  ...ordersFbsRateLimits,\n  ...ordersFbwRateLimits,\n  ...ordersDbsRateLimits,\n  ...userManagementRateLimits,\n  ...financesRateLimits,\n  ...promotionRateLimits,\n  ...tariffsRateLimits,\n  ...inStorePickupRateLimits,\n  ...analyticsRateLimits,\n  ...reportsRateLimits,\n  ...communicationsRateLimits,\n};\n\n/**\n * Type representing all possible endpoint keys.\n *\n * Automatically inferred from ALL_RATE_LIMITS object.\n * Provides type safety when referencing endpoint keys in code.\n *\n * @example\n * ```typescript\n * const endpointKey: EndpointKey = 'general.ping'; // Type-safe ✓\n * const invalid: EndpointKey = 'invalid.key'; // TypeScript error ✗\n * ```\n */\nexport type EndpointKey = keyof typeof ALL_RATE_LIMITS;\n\n/**\n * Legacy export for backwards compatibility.\n * @deprecated Use ALL_RATE_LIMITS instead\n */\nexport const DEFAULT_RATE_LIMITS = ALL_RATE_LIMITS;\n\n/**\n * Category-level rate limit multipliers for Basic/Test tokens.\n *\n * WB enforces significantly reduced limits for Basic and Test tokens since March 30, 2026.\n * These multipliers approximate the reduction per API category.\n * WB defines limits per-endpoint, but most endpoints within a category share\n * similar ratios. Category-level multipliers are a pragmatic approximation.\n *\n * @see {@link https://dev.wildberries.ru/news/281}\n * @since 3.5.0\n */\nconst BASIC_TOKEN_CATEGORY_MULTIPLIERS: Record<string, number> = {\n  general: 0.001, // ~1/24h vs 1/min\n  products: 0.01, // ~1-10/hour vs 100/min\n  'orders-fbs': 0.003, // ~10-50/hour vs 300/min\n  'orders-dbw': 0.003,\n  'orders-dbs': 0.003,\n  'click-collect': 0.003,\n  'in-store-pickup': 0.003,\n  'orders-fbw': 0.01,\n  promotion: 0.02, // ~1-5/hour vs 5/min\n  communications: 0.05,\n  tariffs: 0.01,\n  analytics: 0.05, // ~1-10/hour vs 3/min\n  reports: 0.01,\n  documents: 0.01,\n  finances: 0.01,\n  'user-management': 0.01,\n};\n\n/** Default multiplier for categories not in the map */\nconst DEFAULT_BASIC_MULTIPLIER = 0.01;\n\n/**\n * Applies Basic/Test token rate limit multipliers to all endpoint configs.\n *\n * For each endpoint, determines its category from the rateLimitKey prefix\n * (e.g., 'orders-fbs.xxx' → 'orders-fbs') and reduces requestsPerMinute\n * accordingly. Burst limit is set to 1 for all endpoints.\n *\n * @param limits - Original rate limit configs (for Personal/Service tokens)\n * @returns New config object with reduced limits for Basic/Test tokens\n * @since 3.5.0\n */\nexport function applyBasicTokenMultipliers(\n  limits: Record<string, RateLimitConfig>\n): Record<string, RateLimitConfig> {\n  const result: Record<string, RateLimitConfig> = {};\n\n  for (const [key, config] of Object.entries(limits)) {\n    const category = key.split('.')[0];\n    const multiplier = BASIC_TOKEN_CATEGORY_MULTIPLIERS[category] ?? DEFAULT_BASIC_MULTIPLIER;\n\n    result[key] = {\n      ...config,\n      requestsPerMinute: Math.max(1, Math.ceil(config.requestsPerMinute * multiplier)),\n      burstLimit: 1,\n    };\n  }\n\n  return result;\n}\n","/**\n * BaseClient - Core HTTP infrastructure for Wildberries API SDK\n *\n * Provides centralized HTTP client with authentication, timeout configuration,\n * error transformation, and debug logging for all SDK modules.\n *\n * @packageDocumentation\n */\n\nimport axios, { type AxiosInstance, type AxiosError } from 'axios';\nimport type { SDKConfig, RequestOptions } from '../config';\nimport {\n  WBAPIError,\n  AuthenticationError,\n  RateLimitError,\n  ValidationError,\n  NetworkError,\n} from '../errors';\nimport { MetaValidationFailError } from '../errors/meta-validation-fail-error';\nimport { RateLimiter } from './rate-limiter';\nimport { RetryHandler } from './retry-handler';\nimport { ALL_RATE_LIMITS, applyBasicTokenMultipliers } from '../config/rate-limits';\n\n/**\n * Parsed fields from an RFC 7807 problem+json error response.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc7807}\n */\ninterface ProblemJsonFields {\n  title?: string;\n  detail?: string;\n  code?: string;\n  requestId?: string;\n  origin?: string;\n  status?: number;\n  statusText?: string;\n  timestamp?: string;\n}\n\n/**\n * Base HTTP client for all Wildberries API modules\n *\n * This class provides a unified HTTP interface with:\n * - Automatic authentication header injection\n * - Configurable timeouts\n * - Typed error transformation\n * - Debug logging with PII sanitization\n *\n * All API modules receive a BaseClient instance via dependency injection\n * to ensure consistent behavior across the SDK.\n *\n * @example Basic usage\n * ```typescript\n * const config: SDKConfig = {\n *   apiKey: 'your-api-key',\n *   timeout: 30000,\n *   logLevel: 'debug'\n * };\n *\n * const client = new BaseClient(config);\n *\n * // Make GET request\n * const data = await client.get<ProductResponse>(\n *   'https://content-api.wildberries.ru/api/v1/products'\n * );\n * ```\n *\n * @example With custom headers\n * ```typescript\n * const data = await client.post<CreateProductResponse>(\n *   'https://content-api.wildberries.ru/api/v1/products',\n *   { brandName: 'MyBrand', title: 'Product Title' },\n *   { headers: { 'X-Request-ID': '123' } }\n * );\n * ```\n */\nexport class BaseClient {\n  private axios: AxiosInstance;\n  private apiKey: string;\n  private logLevel: 'debug' | 'info' | 'warn' | 'error';\n  private rateLimiter: RateLimiter;\n  private retryHandler: RetryHandler;\n\n  /**\n   * Creates a new BaseClient instance\n   *\n   * @param config - SDK configuration object\n   *\n   * @throws {Error} If apiKey is not provided or invalid\n   *\n   * @example\n   * ```typescript\n   * const client = new BaseClient({\n   *   apiKey: process.env.WB_API_KEY || '',\n   *   timeout: 60000,\n   *   logLevel: 'info'\n   * });\n   * ```\n   */\n  constructor(config: SDKConfig) {\n    this.apiKey = config.apiKey;\n    this.logLevel = config.logLevel ?? 'warn';\n\n    // Initialize Axios instance with configuration\n    this.axios = axios.create({\n      timeout: config.timeout ?? 30000,\n      headers: {\n        'Content-Type': 'application/json',\n        'User-Agent': 'WildberriesSDK/0.1.0',\n      },\n    });\n\n    // Set up request interceptor for authentication\n    this.setupRequestInterceptor();\n\n    // Initialize rate limiter with predefined limits, adjusted for token type\n    const tokenType = config.tokenType ?? 'personal';\n    const effectiveLimits =\n      tokenType === 'basic' || tokenType === 'test'\n        ? applyBasicTokenMultipliers(ALL_RATE_LIMITS)\n        : ALL_RATE_LIMITS;\n    this.rateLimiter = new RateLimiter(effectiveLimits);\n\n    // Initialize retry handler with configuration and log level\n    this.retryHandler = new RetryHandler(config.retryConfig, this.logLevel);\n  }\n\n  /**\n   * Make a GET request with automatic retry on transient failures\n   *\n   * Automatically retries on network errors, 5xx server errors, and 429 rate limits.\n   * Does NOT retry on authentication errors (401/403) or validation errors (400/422).\n   *\n   * @typeParam T - Expected response type\n   * @param url - Full URL for the request\n   * @param options - Optional request options\n   * @returns Promise resolving to typed response data\n   *\n   * @throws {AuthenticationError} On 401/403 responses\n   * @throws {RateLimitError} On 429 responses (after retries exhausted)\n   * @throws {ValidationError} On 400/422 responses\n   * @throws {NetworkError} On network failures or 5xx responses (after retries exhausted)\n   *\n   * @example\n   * ```typescript\n   * interface Product {\n   *   id: string;\n   *   name: string;\n   * }\n   *\n   * const product = await client.get<Product>(\n   *   'https://content-api.wildberries.ru/api/v1/products/123'\n   * );\n   * console.log(product.name);\n   * ```\n   */\n  async get<T>(url: string, options?: RequestOptions): Promise<T> {\n    return this.retryHandler.executeWithRetry(async () => {\n      // Apply rate limiting if rateLimitKey provided\n      if (options?.rateLimitKey) {\n        await this.rateLimiter.waitForSlot(options.rateLimitKey);\n      }\n\n      try {\n        this.log('debug', 'GET request', { url });\n\n        const response = await this.axios.get<T>(url, {\n          headers: options?.headers,\n          params: options?.params,\n          responseType: options?.responseType,\n          ...(options?.timeout !== undefined && { timeout: options.timeout }),\n        });\n\n        this.log('debug', 'GET response', {\n          url,\n          status: response.status,\n        });\n\n        return response.data;\n      } catch (error) {\n        this.transformError(error);\n      }\n    }, `GET ${url}`);\n  }\n\n  /**\n   * Make a POST request with automatic retry on transient failures\n   *\n   * Automatically retries on network errors, 5xx server errors, and 429 rate limits.\n   * Does NOT retry on authentication errors (401/403) or validation errors (400/422).\n   *\n   * @typeParam T - Expected response type\n   * @param url - Full URL for the request\n   * @param data - Request body data\n   * @param options - Optional request options\n   * @returns Promise resolving to typed response data\n   *\n   * @throws {AuthenticationError} On 401/403 responses\n   * @throws {RateLimitError} On 429 responses (after retries exhausted)\n   * @throws {ValidationError} On 400/422 responses\n   * @throws {NetworkError} On network failures or 5xx responses (after retries exhausted)\n   *\n   * @example\n   * ```typescript\n   * interface CreateProductRequest {\n   *   brandName: string;\n   *   title: string;\n   * }\n   *\n   * interface CreateProductResponse {\n   *   id: string;\n   * }\n   *\n   * const result = await client.post<CreateProductResponse>(\n   *   'https://content-api.wildberries.ru/api/v1/products',\n   *   { brandName: 'MyBrand', title: 'New Product' }\n   * );\n   * ```\n   */\n  async post<T>(url: string, data?: unknown, options?: RequestOptions): Promise<T> {\n    return this.retryHandler.executeWithRetry(async () => {\n      // Apply rate limiting if rateLimitKey provided\n      if (options?.rateLimitKey) {\n        await this.rateLimiter.waitForSlot(options.rateLimitKey);\n      }\n\n      try {\n        this.log('debug', 'POST request', { url });\n\n        const response = await this.axios.post<T>(url, data, {\n          headers: options?.headers,\n          params: options?.params,\n          ...(options?.timeout !== undefined && { timeout: options.timeout }),\n        });\n\n        this.log('debug', 'POST response', {\n          url,\n          status: response.status,\n        });\n\n        return response.data;\n      } catch (error) {\n        this.transformError(error);\n      }\n    }, `POST ${url}`);\n  }\n\n  /**\n   * Make a PUT request with automatic retry on transient failures\n   *\n   * Automatically retries on network errors, 5xx server errors, and 429 rate limits.\n   * Does NOT retry on authentication errors (401/403) or validation errors (400/422).\n   *\n   * @typeParam T - Expected response type\n   * @param url - Full URL for the request\n   * @param data - Request body data\n   * @param options - Optional request options\n   * @returns Promise resolving to typed response data\n   *\n   * @throws {AuthenticationError} On 401/403 responses\n   * @throws {RateLimitError} On 429 responses (after retries exhausted)\n   * @throws {ValidationError} On 400/422 responses\n   * @throws {NetworkError} On network failures or 5xx responses (after retries exhausted)\n   *\n   * @example\n   * ```typescript\n   * const updated = await client.put<ProductResponse>(\n   *   'https://content-api.wildberries.ru/api/v1/products/123',\n   *   { title: 'Updated Title' }\n   * );\n   * ```\n   */\n  async put<T>(url: string, data?: unknown, options?: RequestOptions): Promise<T> {\n    return this.retryHandler.executeWithRetry(async () => {\n      // Apply rate limiting if rateLimitKey provided\n      if (options?.rateLimitKey) {\n        await this.rateLimiter.waitForSlot(options.rateLimitKey);\n      }\n\n      try {\n        this.log('debug', 'PUT request', { url });\n\n        const response = await this.axios.put<T>(url, data, {\n          headers: options?.headers,\n          params: options?.params,\n          ...(options?.timeout !== undefined && { timeout: options.timeout }),\n        });\n\n        this.log('debug', 'PUT response', {\n          url,\n          status: response.status,\n        });\n\n        return response.data;\n      } catch (error) {\n        this.transformError(error);\n      }\n    }, `PUT ${url}`);\n  }\n\n  /**\n   * Make a PATCH request with automatic retry on transient failures\n   *\n   * Automatically retries on network errors, 5xx server errors, and 429 rate limits.\n   * Does NOT retry on authentication errors (401/403) or validation errors (400/422).\n   *\n   * @typeParam T - Expected response type\n   * @param url - Full URL for the request\n   * @param data - Request body data\n   * @param options - Optional request options\n   * @returns Promise resolving to typed response data\n   *\n   * @throws {AuthenticationError} On 401/403 responses\n   * @throws {RateLimitError} On 429 responses (after retries exhausted)\n   * @throws {ValidationError} On 400/422 responses\n   * @throws {NetworkError} On network failures or 5xx responses (after retries exhausted)\n   *\n   * @example\n   * ```typescript\n   * const patched = await client.patch<ProductResponse>(\n   *   'https://content-api.wildberries.ru/api/v1/products/123',\n   *   { stock: 100 }\n   * );\n   * ```\n   */\n  async patch<T>(url: string, data?: unknown, options?: RequestOptions): Promise<T> {\n    return this.retryHandler.executeWithRetry(async () => {\n      // Apply rate limiting if rateLimitKey provided\n      if (options?.rateLimitKey) {\n        await this.rateLimiter.waitForSlot(options.rateLimitKey);\n      }\n\n      try {\n        this.log('debug', 'PATCH request', { url });\n\n        const response = await this.axios.patch<T>(url, data, {\n          headers: options?.headers,\n          params: options?.params,\n          ...(options?.timeout !== undefined && { timeout: options.timeout }),\n        });\n\n        this.log('debug', 'PATCH response', {\n          url,\n          status: response.status,\n        });\n\n        return response.data;\n      } catch (error) {\n        this.transformError(error);\n      }\n    }, `PATCH ${url}`);\n  }\n\n  /**\n   * Make a DELETE request with automatic retry on transient failures\n   *\n   * Automatically retries on network errors, 5xx server errors, and 429 rate limits.\n   * Does NOT retry on authentication errors (401/403) or validation errors (400/422).\n   *\n   * @typeParam T - Expected response type\n   * @param url - Full URL for the request\n   * @param data - Optional request body data (RFC 7231 allows DELETE with body)\n   * @param options - Optional request options\n   * @returns Promise resolving to typed response data\n   *\n   * @throws {AuthenticationError} On 401/403 responses\n   * @throws {RateLimitError} On 429 responses (after retries exhausted)\n   * @throws {ValidationError} On 400/422 responses\n   * @throws {NetworkError} On network failures or 5xx responses (after retries exhausted)\n   *\n   * @example\n   * ```typescript\n   * // DELETE without body\n   * await client.delete<void>(\n   *   'https://content-api.wildberries.ru/api/v1/products/123'\n   * );\n   *\n   * // DELETE with body (RFC 7231 allows this)\n   * await client.delete<void>(\n   *   'https://marketplace-api.wildberries.ru/api/v3/stocks/123',\n   *   { skus: ['SKU123', 'SKU456'] }\n   * );\n   * ```\n   */\n  async delete<T>(url: string, data?: unknown, options?: RequestOptions): Promise<T> {\n    return this.retryHandler.executeWithRetry(async () => {\n      // Apply rate limiting if rateLimitKey provided\n      if (options?.rateLimitKey) {\n        await this.rateLimiter.waitForSlot(options.rateLimitKey);\n      }\n\n      try {\n        this.log('debug', 'DELETE request', { url, hasBody: !!data });\n\n        const response = await this.axios.delete<T>(url, {\n          headers: options?.headers,\n          params: options?.params,\n          data,\n          ...(options?.timeout !== undefined && { timeout: options.timeout }),\n        });\n\n        this.log('debug', 'DELETE response', {\n          url,\n          status: response.status,\n        });\n\n        return response.data;\n      } catch (error) {\n        this.transformError(error);\n      }\n    }, `DELETE ${url}`);\n  }\n\n  /**\n   * Set up Axios request interceptor for authentication\n   *\n   * Automatically injects the Authorization header on all requests\n   * and logs request details in debug mode.\n   *\n   * @private\n   */\n  private setupRequestInterceptor(): void {\n    this.axios.interceptors.request.use((config) => {\n      // Inject authentication header\n      config.headers.Authorization = `Bearer ${this.apiKey}`;\n\n      // Debug logging with sanitized headers\n      if (this.logLevel === 'debug') {\n        this.log('debug', 'HTTP Request Interceptor', {\n          method: config.method?.toUpperCase(),\n          url: config.url,\n          headers: this.sanitizeHeaders(config.headers),\n        });\n      }\n\n      return config;\n    });\n  }\n\n  /**\n   * Transform Axios errors to typed SDK errors\n   *\n   * Maps HTTP status codes and network errors to appropriate error classes:\n   * - 401/403 → AuthenticationError\n   * - 429 → RateLimitError\n   * - 400/422 → ValidationError\n   * - 5xx → NetworkError\n   * - Network failures → NetworkError\n   * - All other 4xx (including **409**) → generic `WBAPIError` fallback\n   *\n   * **IMPORTANT — application-level error codes inside 200 OK bodies (since v3.10.2):**\n   *\n   * Several WB endpoints return HTTP 200 with an **application-level** error code\n   * embedded in the response body (most notably `code: 409` with `detail: 'MetaValidationFail'`\n   * for `ordersDBS.deliverBulk()` and `ordersFBW.deliverBulk()`). Because these arrive\n   * as HTTP 200 the BaseClient does NOT throw — the body is returned to the caller intact.\n   *\n   * Consumers must inspect the per-order shape, not catch a thrown error. Canonical paths:\n   * - `result.results[].errors[].code === 409`\n   * - `result.results[].errors[].detail === 'MetaValidationFail'`\n   * - `result.results[].errors[].metaDetails[]` (per-order SGTIN/IMEI/UIN validation status)\n   *\n   * Endpoint-level JSDoc on `deliverBulk()` and `checkMetaValidation()` documents this\n   * pattern explicitly. Do NOT add `@throws` annotations referencing this 409 pattern\n   * (it does not throw); use prose instead.\n   *\n   * If you change BaseClient to throw on HTTP 409, update every `deliverBulk()` JSDoc and\n   * the corresponding error-path tests across `orders-dbs` and `orders-fbw` modules in lockstep.\n   *\n   * @param error - Error from Axios request\n   * @throws Typed SDK error\n   *\n   * @private\n   */\n  private transformError(error: unknown): never {\n    // Type guard for Axios errors\n    if (!axios.isAxiosError(error)) {\n      this.log('error', 'Unknown error occurred', { error });\n      throw new NetworkError('Unknown error occurred', false, 0, error as Error);\n    }\n\n    const axiosError = error as AxiosError;\n\n    // No response = network failure\n    if (!axiosError.response) {\n      const isTimeout = axiosError.code === 'ECONNABORTED' || axiosError.code === 'ETIMEDOUT';\n\n      if (isTimeout) {\n        const url = axiosError.config?.url ?? 'unknown';\n        const timeoutMs = axiosError.config?.timeout ?? 'unknown';\n        this.log('warn', `Request timed out: ${url} after ${String(timeoutMs)}ms`, {\n          url,\n          timeout: timeoutMs,\n          code: axiosError.code,\n        });\n      } else {\n        this.log('error', 'Network error', {\n          code: axiosError.code,\n          message: axiosError.message,\n        });\n      }\n\n      throw new NetworkError(\n        isTimeout ? 'Request timed out' : 'Network error occurred',\n        isTimeout,\n        0,\n        axiosError\n      );\n    }\n\n    const status = axiosError.response.status;\n    const responseData = axiosError.response.data;\n\n    this.log('warn', 'HTTP error response', {\n      status,\n      url: axiosError.config?.url,\n    });\n\n    // Detect RFC 7807 problem+json responses\n    const contentTypeHeader: unknown = axiosError.response.headers['content-type'];\n    const contentType = typeof contentTypeHeader === 'string' ? contentTypeHeader : '';\n    const isProblemJson = contentType.includes('application/problem+json');\n\n    // Extract RFC 7807 fields when available (problem+json or standard json with RFC 7807 shape)\n    const pf = this.extractProblemJsonFields(responseData, isProblemJson);\n\n    // Transform based on status code\n    if (status === 401 || status === 403) {\n      const message = pf.detail ?? pf.title ?? 'Authentication failed. Please verify your API key.';\n      throw new AuthenticationError(\n        message,\n        status,\n        responseData,\n        pf.requestId,\n        pf.origin,\n        pf.timestamp\n      );\n    }\n\n    if (status === 429) {\n      const retryAfter = this.parseRetryAfter(\n        axiosError.response.headers['retry-after'] as string | undefined\n      );\n      const message =\n        pf.detail ?? pf.title ?? `Rate limit exceeded. Retry after ${retryAfter.toString()}ms`;\n      throw new RateLimitError(\n        message,\n        retryAfter,\n        responseData,\n        pf.requestId,\n        pf.origin,\n        pf.timestamp\n      );\n    }\n\n    if (status === 409) {\n      // Check for marking-code validation failure: body must have a metaDetails array\n      if (\n        responseData != null &&\n        typeof responseData === 'object' &&\n        Array.isArray((responseData as Record<string, unknown>).metaDetails)\n      ) {\n        const body = responseData as Record<string, unknown>;\n        const msg =\n          typeof body.message === 'string'\n            ? body.message\n            : pf.detail ?? pf.title ?? 'Meta validation failed';\n        const code = typeof body.code === 'string' ? body.code : 'Unknown';\n        // metaDetails is confirmed as an array above; cast to the constructor parameter\n        // type. MetaDetail shape is validated server-side by the WB API.\n        type MetaDetailsParam = ConstructorParameters<typeof MetaValidationFailError>[2];\n        const metaDetails = body.metaDetails as MetaDetailsParam;\n        throw new MetaValidationFailError(\n          msg,\n          code,\n          metaDetails,\n          responseData,\n          pf.requestId,\n          pf.origin,\n          pf.timestamp\n        );\n      }\n      // Fall through to WBAPIError for 409s without metaDetails (e.g. SupplyHasZeroOrders)\n    }\n\n    if (status === 400 || status === 422) {\n      const fieldErrors = this.extractFieldErrors(responseData);\n      const message = pf.detail ?? pf.title ?? 'Validation failed';\n      throw new ValidationError(message, fieldErrors, status, responseData, pf.requestId);\n    }\n\n    if (status >= 500) {\n      throw new NetworkError(`Server error: ${status.toString()}`, false, status, axiosError);\n    }\n\n    // Fallback for unexpected status codes\n    throw new WBAPIError(\n      `HTTP error ${status.toString()}`,\n      status,\n      responseData,\n      pf.requestId,\n      pf.origin,\n      pf.timestamp\n    );\n  }\n\n  /**\n   * Parse Retry-After header to milliseconds\n   *\n   * @param header - Retry-After header value (in seconds)\n   * @returns Retry delay in milliseconds\n   *\n   * @private\n   */\n  private parseRetryAfter(header?: string): number {\n    if (!header) return 5000; // Default 5 seconds\n    const seconds = parseInt(header, 10);\n    return isNaN(seconds) ? 5000 : seconds * 1000; // Convert to milliseconds\n  }\n\n  /**\n   * Extract RFC 7807 problem+json fields from response data.\n   *\n   * Handles both `application/problem+json` and `application/json` responses\n   * that contain RFC 7807-shaped bodies (with title, detail, etc.).\n   *\n   * @param responseData - API response body\n   * @param isProblemJson - Whether the Content-Type is application/problem+json\n   * @returns Extracted problem fields with string-safe values\n   *\n   * @private\n   */\n  private extractProblemJsonFields(\n    responseData: unknown,\n    isProblemJson: boolean\n  ): ProblemJsonFields {\n    const empty: ProblemJsonFields = {};\n\n    // Only attempt extraction if response looks like an object\n    if (!responseData || typeof responseData !== 'object') {\n      return empty;\n    }\n\n    const data = responseData as Record<string, unknown>;\n\n    // For application/problem+json, always extract fields.\n    // For application/json, only extract if the body has RFC 7807 shape (has 'title' or 'detail').\n    const hasRfc7807Shape = typeof data.title === 'string' || typeof data.detail === 'string';\n\n    if (!isProblemJson && !hasRfc7807Shape) {\n      return empty;\n    }\n\n    return {\n      title: typeof data.title === 'string' ? data.title : undefined,\n      detail: typeof data.detail === 'string' ? data.detail : undefined,\n      code: typeof data.code === 'string' ? data.code : undefined,\n      requestId: typeof data.requestId === 'string' ? data.requestId : undefined,\n      origin: typeof data.origin === 'string' ? data.origin : undefined,\n      status: typeof data.status === 'number' ? data.status : undefined,\n      statusText: typeof data.statusText === 'string' ? data.statusText : undefined,\n      timestamp: typeof data.timestamp === 'string' ? data.timestamp : undefined,\n    };\n  }\n\n  /**\n   * Extract field-level validation errors from API response\n   *\n   * @param responseData - API response data\n   * @returns Field errors map or undefined\n   *\n   * @private\n   */\n  private extractFieldErrors(responseData: unknown): Record<string, string> | undefined {\n    // Parse API-specific error format\n    if (\n      responseData &&\n      typeof responseData === 'object' &&\n      'errors' in responseData &&\n      responseData.errors &&\n      typeof responseData.errors === 'object'\n    ) {\n      return responseData.errors as Record<string, string>;\n    }\n    return undefined;\n  }\n\n  /**\n   * Log message with structured format and sanitization\n   *\n   * Only logs if message level meets or exceeds configured logLevel.\n   * Automatically sanitizes sensitive information (API keys, PII).\n   *\n   * @param level - Log level\n   * @param message - Log message\n   * @param meta - Optional metadata\n   *\n   * @private\n   */\n  private log(level: 'debug' | 'info' | 'warn' | 'error', message: string, meta?: unknown): void {\n    const levels = { debug: 0, info: 1, warn: 2, error: 3 };\n    const currentLevel = levels[this.logLevel];\n    const messageLevel = levels[level];\n\n    if (messageLevel < currentLevel) return; // Skip if below threshold\n\n    const logData = {\n      timestamp: new Date().toISOString(),\n      level,\n      service: 'WildberriesSDK',\n      message,\n      meta: this.sanitizeMeta(meta),\n    };\n\n    const consoleMethods = {\n      // eslint-disable-next-line no-console\n      debug: console.debug,\n      // eslint-disable-next-line no-console\n      info: console.info,\n      // eslint-disable-next-line no-console\n      warn: console.warn,\n      // eslint-disable-next-line no-console\n      error: console.error,\n    };\n\n    consoleMethods[level](JSON.stringify(logData));\n  }\n\n  /**\n   * Sanitize metadata to remove sensitive information\n   *\n   * @param meta - Raw metadata object\n   * @returns Sanitized metadata\n   *\n   * @private\n   */\n  private sanitizeMeta(meta: unknown): unknown {\n    if (!meta) return undefined;\n\n    try {\n      // Deep clone to avoid modifying original\n      const sanitized: unknown = JSON.parse(JSON.stringify(meta));\n\n      // Sanitize Authorization headers with proper type guards\n      if (\n        sanitized &&\n        typeof sanitized === 'object' &&\n        'headers' in sanitized &&\n        sanitized.headers &&\n        typeof sanitized.headers === 'object'\n      ) {\n        const headers = sanitized.headers as Record<string, unknown>;\n        if ('Authorization' in headers) {\n          headers.Authorization = 'Bearer ***';\n        }\n      }\n\n      return sanitized;\n    } catch {\n      return undefined;\n    }\n  }\n\n  /**\n   * Sanitize headers for logging\n   *\n   * @param headers - Request headers\n   * @returns Sanitized headers\n   *\n   * @private\n   */\n  private sanitizeHeaders(headers: Record<string, string>): Record<string, string> {\n    const sanitized = { ...headers };\n    if (sanitized.Authorization) {\n      sanitized.Authorization = 'Bearer ***';\n    }\n    return sanitized;\n  }\n}\n","/**\n * Auto-generated module\n * Generated from: wildberries_api_doc/01-general.yaml\n * DO NOT EDIT MANUALLY - Changes will be overwritten on next generation\n */\n\nimport { BaseClient } from '../../client/base-client';\nimport { ValidationError } from '../../errors/validation-error';\nimport type {\n  PingResponse,\n  NewsResponse,\n  NewsRequestParams,\n  SellerInfoResponse,\n  CreateInviteRequest,\n  CreateInviteResponse,\n  GetUsersParams,\n  GetUsersResponse,\n  UpdateUserAccessRequest,\n  GetJamSubscriptionStatusParams,\n  JamSubscriptionStatus,\n  JamSubscriptionTier,\n  JamSubscriptionDetails,\n  SellerRatingResponse,\n} from '../../types/general.types';\n\nexport class GeneralModule {\n  constructor(private client: BaseClient) {}\n\n  /**\n   * Проверка подключения к WB API\n   *\n   * Метод проверяет три вещи:\n   * 1. Запрос доходит до WB API\n   * 2. Валидность токена (не истёк, не отозван)\n   * 3. Совпадение категории токена и сервиса\n   *\n   * Метод НЕ предназначен для проверки доступности конкретного сервиса.\n   * Для каждой категории API используется свой домен:\n   *\n   * | Категория | Домен |\n   * | --- | --- |\n   * | Контент | content-api.wildberries.ru |\n   * | Маркетплейс | marketplace-api.wildberries.ru |\n   * | Статистика | statistics-api.wildberries.ru |\n   * | Аналитика | seller-analytics-api.wildberries.ru |\n   * | Рекомендации | recommend-api.wildberries.ru |\n   * | Вопросы и отзывы | feedbacks-api.wildberries.ru |\n   * | Цены и скидки | discounts-prices-api.wildberries.ru |\n   * | Продвижение | advert-api.wildberries.ru |\n   * | Чат с покупателями | buyer-chat-api.wildberries.ru |\n   * | Тарифы | common-api.wildberries.ru |\n   * | Общее | common-api.wildberries.ru |\n   * | Возвраты покупателям | returns-api.wildberries.ru |\n   * | Документы | document-api.wildberries.ru |\n   * | Финансы | finance-api.wildberries.ru |\n   *\n   * Rate limit: Максимум 3 запроса за 30 секунд (6 req/min, 10s interval, burst 3)\n   *\n   * @readonly\n   * @returns Ответ с временной меткой и статусом подключения\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/api-information#tag/Proverka-podklyucheniya-k-WB-API}\n   * @example\n   * ```typescript\n   * const result = await sdk.general.ping();\n   * console.log(result.Status); // 'OK'\n   * ```\n   */\n  async ping(): Promise<PingResponse> {\n    return this.client.get<PingResponse>('https://common-api.wildberries.ru/ping', {\n      rateLimitKey: 'general.ping',\n    });\n  }\n\n  /**\n   * Получение новостей портала продавцов\n   *\n   * Возвращает список новостей портала продавцов Wildberries.\n   * В запросе необходимо указать один из параметров: `from` (дата) или `fromID` (ID новости).\n   * Максимум 100 новостей за один запрос.\n   *\n   * Rate limit:\n   * | Период | Лимит | Интервал | Всплеск |\n   * | --- | --- | --- | --- |\n   * | 1 мин | 1 запрос | 1 мин | 10 запросов |\n   *\n   * @readonly\n   * @param [options] - Параметры запроса\n   * @param [options.from] - Дата, от которой необходимо выдать новости (формат: YYYY-MM-DD)\n   * @param [options.fromID] - ID новости, начиная с которой нужно получить список\n   * @returns Список новостей\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/api-information#tag/API-novostej}\n   * @example\n   * ```typescript\n   * const result = await sdk.general.news({ from: '2024-01-01' });\n   * for (const item of result.data) {\n   *   console.log(item.header, item.date);\n   * }\n   * ```\n   */\n  async news(options?: NewsRequestParams): Promise<NewsResponse> {\n    return this.client.get<NewsResponse>(\n      'https://common-api.wildberries.ru/api/communications/v2/news',\n      {\n        params: options ? { ...options } : undefined,\n        rateLimitKey: 'general.communicationsNews',\n      }\n    );\n  }\n\n  /**\n   * Получение информации о продавце\n   *\n   * Возвращает наименование продавца и уникальный ID профиля продавца.\n   * Для запроса подойдёт любой токен, кроме тестового контура.\n   *\n   * Rate limit:\n   * | Период | Лимит | Интервал | Всплеск |\n   * | --- | --- | --- | --- |\n   * | 1 мин | 1 запрос | 1 мин | 10 запросов |\n   *\n   * @readonly\n   * @returns Информация о продавце (наименование, ID профиля, торговая марка)\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/api-information#tag/Informaciya-o-prodavce}\n   * @example\n   * ```typescript\n   * const seller = await sdk.general.sellerInfo();\n   * console.log(seller.name, seller.sid);\n   * ```\n   */\n  async sellerInfo(): Promise<SellerInfoResponse> {\n    return this.client.get<SellerInfoResponse>(\n      'https://common-api.wildberries.ru/api/v1/seller-info',\n      {\n        rateLimitKey: 'general.sellerInfo',\n      }\n    );\n  }\n\n  /**\n   * Создание приглашения для нового пользователя\n   *\n   * Метод создаёт приглашение для нового пользователя с настройкой доступов к разделам профиля продавца.\n   * Приглашение действительно в течение ограниченного времени, указанного в ответе.\n   *\n   * **Авторизация:** Требуется Персональный токен (категория: Пользователи) от активного владельца профиля.\n   * Доступно для всех стран продавцов.\n   *\n   * Rate limit:\n   * | Период | Лимит | Интервал | Всплеск |\n   * | --- | --- | --- | --- |\n   * | 1 сек | 1 запрос | 1 сек | 5 запросов |\n   *\n   * @param data - Данные для создания приглашения\n   * @returns Информация о созданном приглашении\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/api-information#tag/Upravlenie-polzovatelyami-prodavca}\n   * @example\n   * ```typescript\n   * const result = await sdk.general.createInvite({\n   *   invite: { phoneNumber: '79999999999', position: 'Менеджер' },\n   *   access: [\n   *     { code: 'balance', disabled: false },\n   *     { code: 'finance', disabled: true }\n   *   ]\n   * });\n   * console.log(result.inviteUrl);\n   * ```\n   */\n  async createInvite(data: CreateInviteRequest): Promise<CreateInviteResponse> {\n    return this.client.post<CreateInviteResponse>(\n      'https://user-management-api.wildberries.ru/api/v1/invite',\n      data,\n      { rateLimitKey: 'general.createInvite' }\n    );\n  }\n\n  /**\n   * Получение списка пользователей продавца\n   *\n   * Возвращает список пользователей профиля продавца с их правами доступа.\n   * Можно фильтровать по активным пользователям или только приглашённым.\n   *\n   * **Авторизация:** Требуется Персональный токен (категория: Пользователи) от активного владельца профиля.\n   * Доступно для всех стран продавцов.\n   *\n   * Rate limit:\n   * | Период | Лимит | Интервал | Всплеск |\n   * | --- | --- | --- | --- |\n   * | 1 сек | 1 запрос | 1 сек | 5 запросов |\n   *\n   * @readonly\n   * @param [params] - Параметры запроса\n   * @param [params.limit] - Количество пользователей в ответе (макс. 100, по умолчанию 100)\n   * @param [params.offset] - Количество элементов для пропуска (по умолчанию 0)\n   * @param [params.isInviteOnly] - true - только приглашённые, false - только активные\n   * @returns Список пользователей с общим количеством\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/api-information#tag/Upravlenie-polzovatelyami-prodavca}\n   * @example\n   * ```typescript\n   * const result = await sdk.general.getUsers({ limit: 50 });\n   * console.log(`Total users: ${result.total}`);\n   * for (const user of result.users) {\n   *   console.log(user.firstName, user.email);\n   * }\n   * ```\n   */\n  async getUsers(params?: GetUsersParams): Promise<GetUsersResponse> {\n    return this.client.get<GetUsersResponse>(\n      'https://user-management-api.wildberries.ru/api/v1/users',\n      {\n        params: params ? { ...params } : undefined,\n        rateLimitKey: 'general.getUsers',\n      }\n    );\n  }\n\n  /**\n   * Изменение доступов пользователей\n   *\n   * Обновляет права доступа для одного или нескольких пользователей профиля продавца.\n   * Можно изменить доступ к различным разделам: баланс, финансы, документы и др.\n   *\n   * **Авторизация:** Требуется Персональный токен (категория: Пользователи) от активного владельца профиля.\n   * Доступно для всех стран продавцов.\n   *\n   * Rate limit:\n   * | Период | Лимит | Интервал | Всплеск |\n   * | --- | --- | --- | --- |\n   * | 1 сек | 1 запрос | 1 сек | 5 запросов |\n   *\n   * @param data - Данные для обновления доступов\n   * @returns void\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/api-information#tag/Upravlenie-polzovatelyami-prodavca}\n   * @example\n   * ```typescript\n   * await sdk.general.updateUserAccess({\n   *   usersAccesses: [\n   *     {\n   *       userId: 12345,\n   *       access: [\n   *         { code: 'balance', disabled: true },\n   *         { code: 'finance', disabled: false }\n   *       ]\n   *     }\n   *   ]\n   * });\n   * ```\n   */\n  async updateUserAccess(data: UpdateUserAccessRequest): Promise<void> {\n    await this.client.put<undefined>(\n      'https://user-management-api.wildberries.ru/api/v1/users/access',\n      data,\n      { rateLimitKey: 'general.updateUserAccess' }\n    );\n  }\n\n  /**\n   * Удаление пользователя\n   *\n   * Удаляет пользователя из профиля продавца по его ID.\n   * Удалённый пользователь теряет доступ ко всем разделам профиля.\n   *\n   * **Авторизация:** Требуется Персональный токен (категория: Пользователи) от активного владельца профиля.\n   * Доступно для всех стран продавцов.\n   *\n   * Rate limit:\n   * | Период | Лимит | Интервал | Всплеск |\n   * | --- | --- | --- | --- |\n   * | 1 сек | 1 запрос | 1 сек | 10 запросов |\n   *\n   * @param deletedUserID - ID пользователя для удаления\n   * @returns void\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/api-information#tag/Upravlenie-polzovatelyami-prodavca}\n   * @example\n   * ```typescript\n   * await sdk.general.deleteUser(12345);\n   * ```\n   */\n  async deleteUser(deletedUserID: number): Promise<void> {\n    await this.client.delete<undefined>(\n      'https://user-management-api.wildberries.ru/api/v1/user',\n      {},\n      {\n        params: { deletedUserID },\n        rateLimitKey: 'general.deleteUser',\n      }\n    );\n  }\n\n  /**\n   * Определение тарифа подписки Джем (Jam) через пробные запросы\n   *\n   * @deprecated Используйте {@link getJamSubscription} вместо этого метода.\n   * Прямой API `GET /api/common/v1/subscriptions` не требует nmIds и не тратит квоту аналитики.\n   * Этот probe-метод сохранён как fallback для случаев, когда нет Сервисного токена.\n   *\n   * Определяет тариф через пробные запросы к аналитическому эндпоинту\n   * поисковых запросов товара (`/api/v2/search-report/product/search-texts`),\n   * используя разные значения `limit`:\n   *\n   * 1. Запрос с `limit: 31` (выше лимита стандартного тарифа = 30)\n   *    - **200** → тариф «Продвинутый» (advanced)\n   *    - **400** → не продвинутый → продолжаем\n   * 2. Запрос с `limit: 1`\n   *    - **200** → тариф «Стандартный» (standard)\n   *    - **400** → подписка Джем отсутствует (none)\n   *\n   * Ошибки аутентификации, превышения лимитов и сетевые ошибки не перехватываются\n   * и пробрасываются вызывающему коду.\n   *\n   * Rate limit: Uses the same quota as `analytics.createProductSearchText`\n   * (3 requests/minute, 20-second interval, burst 3).\n   * Each call makes 1–2 probe requests.\n   *\n   * @param params - Parameters containing nmIds for the probe\n   * @param params.nmIds - One or more WB article IDs to use in the probe\n   * @returns Jam subscription status with detected tier and metadata\n   * @throws {ValidationError} When nmIds array is empty\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {NetworkError} When network request fails or times out\n   *\n   * @example\n   * ```typescript\n   * const status = await sdk.general.getJamSubscriptionStatus({ nmIds: [12345678] });\n   *\n   * switch (status.tier) {\n   *   case 'advanced':\n   *     console.log('Advanced Jam — limit up to 50');\n   *     break;\n   *   case 'standard':\n   *     console.log('Standard Jam — limit up to 30');\n   *     break;\n   *   case 'none':\n   *     console.log('No Jam subscription');\n   *     break;\n   * }\n   * ```\n   */\n  async getJamSubscriptionStatus(\n    params: GetJamSubscriptionStatusParams\n  ): Promise<JamSubscriptionStatus> {\n    if (params.nmIds.length === 0) {\n      throw new ValidationError('nmIds must be a non-empty array');\n    }\n\n    const probeUrl =\n      'https://seller-analytics-api.wildberries.ru/api/v2/search-report/product/search-texts';\n    const rateLimitKey = 'analytics.postSearchReportProductSearchTexts';\n\n    // Build yesterday's date for the probe period\n    const yesterday = new Date(Date.now() - 86_400_000);\n    const dateStr = yesterday.toISOString().slice(0, 10);\n\n    const buildPayload = (limit: number) => ({\n      currentPeriod: { start: dateStr, end: dateStr },\n      nmIds: params.nmIds,\n      topOrderBy: 'openCard' as const,\n      orderBy: { field: 'avgPosition' as const, mode: 'asc' as const },\n      limit,\n    });\n\n    let probeCallsMade = 0;\n\n    // Probe 1: limit=31 (above Standard max of 30)\n    try {\n      probeCallsMade++;\n      await this.client.post(probeUrl, buildPayload(31), { rateLimitKey });\n      return this.buildResult('advanced', probeCallsMade);\n    } catch (error: unknown) {\n      if (!(error instanceof ValidationError)) {\n        throw error;\n      }\n      // ValidationError (400) → not advanced, continue probing\n    }\n\n    // Probe 2: limit=1\n    try {\n      probeCallsMade++;\n      await this.client.post(probeUrl, buildPayload(1), { rateLimitKey });\n      return this.buildResult('standard', probeCallsMade);\n    } catch (error: unknown) {\n      if (!(error instanceof ValidationError)) {\n        throw error;\n      }\n      // ValidationError (400) → no Jam subscription\n      return this.buildResult('none', probeCallsMade);\n    }\n  }\n\n  /** Build a JamSubscriptionStatus result */\n  private buildResult(tier: JamSubscriptionTier, probeCallsMade: number): JamSubscriptionStatus {\n    return {\n      tier,\n      checkedAt: new Date().toISOString(),\n      probeCallsMade,\n    };\n  }\n\n  /**\n   * Получение информации о подписке Джем (Jam)\n   *\n   * Возвращает подробную информацию о подписке Джем продавца:\n   * даты активации и окончания, уровень подписки, способ оформления и статус.\n   *\n   * Если продавец никогда не подключал подписку, возвращается пустой объект (200).\n   *\n   * **Авторизация:** Сервисный токен любой категории.\n   *\n   * Rate limit: 1 request per minute, 1 min interval, burst 10\n   *\n   * @returns Jam subscription details (empty object if never subscribed)\n   * @throws {AuthenticationError} When API key is invalid or not a Service token (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {NetworkError} When network request fails or times out\n   * @since 3.5.0\n   * @see {@link https://dev.wildberries.ru/docs/openapi/api-information#tag/Informaciya-o-prodavce/operation/getCommonV1Subscriptions}\n   * @example\n   * ```typescript\n   * const jam = await sdk.general.getJamSubscription();\n   * if (jam.state === 'active') {\n   *   console.log(`Jam ${jam.level} active until ${jam.till}`);\n   *   console.log(`Source: ${jam.activationSource}, since: ${jam.since}`);\n   * } else if (jam.state) {\n   *   console.log(`Jam inactive (state: ${jam.state})`);\n   * } else {\n   *   console.log('Never subscribed to Jam');\n   * }\n   * ```\n   */\n  async getJamSubscription(): Promise<JamSubscriptionDetails> {\n    return this.client.get<JamSubscriptionDetails>(\n      'https://common-api.wildberries.ru/api/common/v1/subscriptions',\n      { rateLimitKey: 'general.getJamSubscription' }\n    );\n  }\n\n  /**\n   * Получить рейтинг продавца и количество отзывов\n   *\n   * Возвращает пользовательский рейтинг продавца и общее количество отзывов.\n   *\n   * **Авторизация:** Сервисный токен категории **Вопросы и отзывы**.\n   *\n   * Rate limit: 1 request per minute, 1 min interval, burst 1\n   *\n   * @returns Seller rating and review count\n   * @throws {AuthenticationError} When API key is invalid or wrong token category (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {NetworkError} When network request fails or times out\n   * @since 3.5.0\n   * @see {@link https://dev.wildberries.ru/docs/openapi/api-information#tag/Informaciya-o-prodavce/operation/getCommonV1Rating}\n   * @example\n   * ```typescript\n   * const rating = await sdk.general.getSellerRating();\n   * console.log(`Rating: ${rating.valuation} (${rating.feedbackCount} reviews)`);\n   * ```\n   */\n  async getSellerRating(): Promise<SellerRatingResponse> {\n    return this.client.get<SellerRatingResponse>(\n      'https://common-api.wildberries.ru/api/common/v1/rating',\n      { rateLimitKey: 'general.getSellerRating' }\n    );\n  }\n}\n","/**\n * Centralized deprecation warning utility\n *\n * Provides once-per-process deprecation warnings with a clean API.\n * Replaces per-module static boolean flags with a central registry.\n *\n * @module utils/deprecation\n * @since v3.8.0\n */\n\n/** Set of method keys that have already emitted a deprecation warning this process. */\nconst _warned = new Set<string>();\n\n/**\n * Emit a deprecation warning for a method, at most once per process.\n *\n * @param methodKey - Unique identifier for the deprecated method (e.g. 'FinancesModule.getSupplierReportDetailByPeriod')\n * @param message - The warning message to display\n *\n * @example\n * ```typescript\n * warnOnce(\n *   'FinancesModule.getSupplierReportDetailByPeriod',\n *   '[DEPRECATED] getSupplierReportDetailByPeriod() is deprecated. Migrate to getSalesReportsDetailed().'\n * );\n * ```\n */\nexport function warnOnce(methodKey: string, message: string): void {\n  if (_warned.has(methodKey)) return;\n  _warned.add(methodKey);\n  // eslint-disable-next-line no-console -- Intentional deprecation warning\n  console.warn(message);\n}\n\n/**\n * Reset all deprecation warning flags. **Test helper only.**\n *\n * Call in `beforeEach` to ensure deprecation warnings fire again in each test.\n *\n * @example\n * ```typescript\n * import { resetDeprecationWarnings } from 'daytona-wildberries-typescript-sdk';\n *\n * beforeEach(() => {\n *   resetDeprecationWarnings();\n * });\n * ```\n */\nexport function resetDeprecationWarnings(): void {\n  _warned.clear();\n}\n","/**\n * Auto-generated module\n * Generated from: wildberries_api_doc/02-products.yaml\n * DO NOT EDIT MANUALLY - Changes will be overwritten on next generation\n */\n\nimport { BaseClient } from '../../client/base-client';\nimport { warnOnce } from '../../utils/deprecation';\nimport type {\n  BrandsResponse,\n  ClubDisc,\n  GetContentTagsResponse,\n  GetDirectoryColorsResponse,\n  GetDirectoryCountriesResponse,\n  GetParentAllResponse,\n  Goods,\n  GoodsBufferResponse,\n  GoodsFilterByNmResponse,\n  GoodsFilterResponse,\n  GoodsHistoryResponse,\n  Office,\n  QuarantineGoodsResponse,\n  RequestMoveNmsImtConn,\n  RequestMoveNmsImtDisconn,\n  RequestPublicViewerPublicErrorsTableListV2,\n  ResponseCardCreate,\n  ResponseContentError,\n  ResponsePublicViewerPublicErrorsTableListV2,\n  SizeGoodsBody,\n  SizeGoodsResponse,\n  StoreContactRequestBody,\n  TaskBufferResponse,\n  TaskHistoryResponse,\n  UploadTaskResponse,\n  Warehouse,\n  SubjectCharacteristic,\n  CardCharacteristicInput,\n  CardCharacteristicOutput,\n  StocksRequest,\n  UpdateStockRequest,\n  GetStocksResponse,\n  DeleteCardsFromTrashRequest,\n  DeleteCardsFromTrashResponse,\n} from '../../types/products.types';\n\n// task-16.2: module-private sanitization helpers for sku → chrtId migration\n// deadline: WB API rejects `skus`/`sku` after 2026-05-20 13:00 MSK with HTTP 400\n\n/* eslint-disable @typescript-eslint/no-deprecated -- helpers intentionally read deprecated fields to detect and warn about them */\n\n/**\n * task-16.2: detect legacy `sku`/`skus` usage on stocks payloads (getStocks / deleteStock).\n * Emits one-time `warnOnce` for legacy-only or mixed-mode requests. Returns a shallow\n * clone with `skus` stripped if mixed-mode; otherwise returns input unchanged.\n * Never mutates input. Module-private — not exported.\n */\nfunction sanitizeStocksRequest(\n  data: StocksRequest,\n  methodName: 'getStocks' | 'deleteStock'\n): StocksRequest {\n  // N2: no null-guard here — parameter type is StocksRequest (non-nullable); the\n  // Array.isArray checks below already handle absent/undefined fields safely.\n  const hasLegacy = Array.isArray(data.skus) && data.skus.length > 0;\n  const hasNew = Array.isArray(data.chrtIds) && data.chrtIds.length > 0;\n  // N1: detect \"key present but empty\" — chrtIds: [] is a migration-in-progress signal,\n  // not a \"legacy-only\" call. Strip empty chrtIds before legacy-only branch to avoid\n  // confusing the consumer (and avoid sending a malformed payload to WB).\n  const hasEmptyChrtIds = Array.isArray(data.chrtIds) && data.chrtIds.length === 0;\n\n  if (hasLegacy && !hasNew) {\n    // task-16.2: WB API will reject `skus` after 2026-05-20 13:00 MSK\n    warnOnce(\n      `products.${methodName}:legacy-skus-call`,\n      `products.${methodName}: the \\`skus\\` parameter is deprecated. WB API will reject ` +\n        `requests with \\`skus\\` after 2026-05-20 13:00 MSK with HTTP 400. Migrate to \\`chrtIds\\` ` +\n        `(size IDs from POST /content/v2/get/cards/list). ` +\n        `See docs/guides/stocks-sku-to-chrtid-migration.md.`\n    );\n    // N1: if empty chrtIds was declared (migration in-progress), strip it so WB doesn't\n    // see a malformed payload. The legacy-skus warning already fired, which is correct.\n    if (hasEmptyChrtIds) {\n      const { chrtIds, ...rest } = data;\n      void chrtIds;\n      return rest;\n    }\n    return data;\n  }\n\n  if (hasLegacy && hasNew) {\n    // task-16.2: prefer chrtIds, strip skus; WB API will reject `skus` after 2026-05-20 13:00 MSK\n    warnOnce(\n      `products.${methodName}:mixed-skus-and-chrtIds`,\n      `products.${methodName}: both \\`skus\\` and \\`chrtIds\\` provided. The SDK is sending ` +\n        `ONLY \\`chrtIds\\` to WB (\\`skus\\` will be stripped); WB API will reject \\`skus\\` after ` +\n        `2026-05-20 13:00 MSK with HTTP 400. Remove \\`skus\\` from your request to avoid this ` +\n        `warning. See docs/guides/stocks-sku-to-chrtid-migration.md.`\n    );\n    const { skus, ...rest } = data;\n    void skus;\n    return rest;\n  }\n\n  // new-only or empty: pass through unchanged (no deprecated fields present)\n  return data;\n}\n\n/**\n * task-16.2: detect legacy `sku` on per-item basis in updateStock payloads.\n * Emits one-time `warnOnce` for legacy-only items, mixed items, or both simultaneously.\n * Returns a shallow clone with `sku` stripped from mixed items; otherwise returns input\n * unchanged. Never mutates input. Module-private — not exported.\n */\nfunction sanitizeUpdateStockPayload(\n  data: UpdateStockRequest | undefined\n): UpdateStockRequest | undefined {\n  // N2: Array.isArray guard is defensive against JS consumers (TS contract says\n  // stocks: StockItem[] always). May trigger no-unnecessary-condition in future\n  // refactors — keep the composite condition together.\n  if (!data || !Array.isArray(data.stocks) || data.stocks.length === 0) return data;\n\n  // N3: single-pass loop with early-exit when both flags set (avoids double .some() walk\n  // on large batches — up to 10k items). N4: use != null (nullish check catches both\n  // null + undefined, unlike !== undefined which lets null through as \"set\").\n  let hasLegacyOnly = false;\n  let hasMixed = false;\n  for (const s of data.stocks) {\n    const skuSet = s.sku != null; // N4: nullish — catches null + undefined\n    const chrtIdSet = s.chrtId != null; // N4: nullish — catches null + undefined\n    if (skuSet && !chrtIdSet) hasLegacyOnly = true;\n    else if (skuSet && chrtIdSet) hasMixed = true;\n    if (hasLegacyOnly && hasMixed) break; // N3: early-exit when both flags set\n  }\n\n  if (hasLegacyOnly) {\n    // task-16.2: WB API will reject items with `sku` after 2026-05-20 13:00 MSK\n    warnOnce(\n      'products.updateStock:legacy-sku-call',\n      `products.updateStock: stock items with \\`sku\\` (no \\`chrtId\\`) are deprecated. ` +\n        `WB API will reject items with \\`sku\\` after 2026-05-20 13:00 MSK with HTTP 400. ` +\n        `Migrate each item to \\`chrtId\\` (size ID from POST /content/v2/get/cards/list). ` +\n        `See docs/guides/stocks-sku-to-chrtid-migration.md.`\n    );\n  }\n\n  if (hasMixed) {\n    // task-16.2: prefer chrtId per item, strip sku from mixed items; WB API will reject `sku` after 2026-05-20 13:00 MSK\n    warnOnce(\n      'products.updateStock:mixed-sku-and-chrtId',\n      `products.updateStock: some items have BOTH \\`sku\\` and \\`chrtId\\`. The SDK is sending ` +\n        `ONLY \\`chrtId\\` per item to WB (\\`sku\\` will be stripped from those items); WB API ` +\n        `will reject \\`sku\\` after 2026-05-20 13:00 MSK with HTTP 400. Remove \\`sku\\` from items ` +\n        `that already have \\`chrtId\\` to avoid this warning. ` +\n        `See docs/guides/stocks-sku-to-chrtid-migration.md.`\n    );\n    return {\n      stocks: data.stocks.map((s) => {\n        if (s.chrtId != null && s.sku != null) {\n          const { sku, ...rest } = s;\n          void sku;\n          return rest;\n        }\n        return s;\n      }),\n    };\n  }\n\n  // new-only or amount-only-batch: pass through unchanged (no deprecated fields present)\n  return data;\n}\n\n/* eslint-enable @typescript-eslint/no-deprecated */\n\n/**\n * Filter values for {@link ProductsModule.getCardsList} `data.settings.filter.withPhoto`.\n *\n * **Deadline 2026-06-16**: WB changes the semantic of value `0`. After the deadline, `0`\n * (or missing parameter) means \"ALL cards\" (not \"no photo only\"). The NEW value `2`\n * replaces the old `0` semantic for \"no photo only\" cards.\n *\n * Using this const instead of magic numbers makes consumer code survive the schema change\n * automatically — `WITH_PHOTO_FILTER.NO_PHOTO` resolves to `2` (the new value) in v3.14.0+.\n *\n * @since 3.14.0\n */\nexport const WITH_PHOTO_FILTER = {\n  /** All cards regardless of photo state. Same semantic before and after 2026-06-16. */\n  ALL: -1,\n  /** Only cards WITH photo. Same semantic before and after 2026-06-16. */\n  WITH_PHOTO: 1,\n  /** Only cards WITHOUT photo. NEW value `2` in v3.14.0+ — replaces legacy `0` semantic post-2026-06-16. */\n  NO_PHOTO: 2,\n} as const;\n\nexport class ProductsModule {\n  constructor(private client: BaseClient) {}\n\n  /**\n   * Родительские категории товаров\n   *\n   * Returns parent category names and IDs for product card creation (e.g., Electronics, Household chemicals).\n   *\n   * Rate limit: 100 req/min, 600ms interval, burst 5\n   *\n   * @param [options] - Query parameters\n   * @param [options.locale] - Language locale (e.g., 'ru', 'en')\n   * @returns Parent categories list\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.getParentAll({ locale: 'ru' });\n   * console.log(result.data); // Parent categories array\n   * ```\n   */\n  async getParentAll(options?: { locale?: string }): Promise<GetParentAllResponse> {\n    return this.client.get<GetParentAllResponse>(\n      'https://content-api.wildberries.ru/content/v2/object/parent/all',\n      {\n        params: options,\n        rateLimitKey: 'products.contentObjectParentAll',\n      }\n    );\n  }\n\n  /**\n   * Список предметов\n   *\n   * Returns parent category names and their subjects with IDs (e.g., category \"Toys\" contains \"Kaleidoscopes\", \"Dolls\", \"Balls\").\n   *\n   * Rate limit: 100 req/min, 600ms interval, burst 5\n   *\n   * @param [options] - Query parameters\n   * @param [options.locale] - Language locale (e.g., 'ru', 'en')\n   * @param [options.name] - Subject name filter\n   * @param [options.limit] - Number of items to return\n   * @param [options.offset] - Items offset\n   * @param [options.parentID] - Parent category ID filter\n   * @returns List of subjects with their parent categories\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.getObjectAll({ parentID: 306, locale: 'ru', limit: 50 });\n   * console.log(result.data); // [{ subjectID, parentID, subjectName, parentName }]\n   * ```\n   */\n  async getObjectAll(options?: {\n    locale?: string;\n    name?: string;\n    limit?: number;\n    offset?: number;\n    parentID?: number;\n  }): Promise<{\n    data?: { subjectID?: number; parentID?: number; subjectName?: string; parentName?: string }[];\n    error?: boolean;\n    errorText?: string;\n    additionalErrors?: string;\n  }> {\n    return this.client.get<{\n      data?: { subjectID?: number; parentID?: number; subjectName?: string; parentName?: string }[];\n      error?: boolean;\n      errorText?: string;\n      additionalErrors?: string;\n    }>('https://content-api.wildberries.ru/content/v2/object/all', {\n      params: options,\n      rateLimitKey: 'products.contentObjectAll',\n    });\n  }\n\n  /**\n   * Характеристики предмета\n   *\n   * Returns characteristic parameters for a subject: names, data types, units of measure, etc.\n   * Use separate methods for Color, Gender, Country, Season, VAT, and TNVED values.\n   *\n   * Rate limit: 100 req/min, 600ms interval, burst 5\n   *\n   * @param subjectId - ID предмета\n   * @param [options] - Query parameters\n   * @param [options.locale] - Language locale (e.g., 'ru', 'en')\n   * @returns Subject characteristics list\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.getObjectCharc(105, { locale: 'ru' });\n   * console.log(result.data); // [{ charcID, name, required, unitName, charcType }]\n   * ```\n   */\n  async getObjectCharc(\n    subjectId: number,\n    options?: { locale?: string }\n  ): Promise<{\n    data?: SubjectCharacteristic[];\n    error?: boolean;\n    errorText?: string;\n    additionalErrors?: string;\n  }> {\n    return this.client.get<{\n      data?: SubjectCharacteristic[];\n      error?: boolean;\n      errorText?: string;\n      additionalErrors?: string;\n    }>(`https://content-api.wildberries.ru/content/v2/object/charcs/${subjectId}`, {\n      params: options,\n      rateLimitKey: 'products.contentObjectCharcs',\n    });\n  }\n\n  /**\n   * Цвет\n   *\n   * Returns possible values for the \"Color\" product characteristic.\n   *\n   * Rate limit: 100 req/min, 600ms interval, burst 5\n   *\n   * @param [options] - Query parameters\n   * @param [options.locale] - Language locale (e.g., 'ru', 'en')\n   * @returns Available color values\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.getDirectoryColors({ locale: 'ru' });\n   * console.log(result.data); // Available color values\n   * ```\n   */\n  async getDirectoryColors(options?: { locale?: string }): Promise<GetDirectoryColorsResponse> {\n    return this.client.get<GetDirectoryColorsResponse>(\n      'https://content-api.wildberries.ru/content/v2/directory/colors',\n      {\n        params: options,\n        rateLimitKey: 'products.contentDirectoryColors',\n      }\n    );\n  }\n\n  /**\n   * Пол\n   *\n   * Returns possible values for the \"Gender\" product characteristic.\n   *\n   * Rate limit: 100 req/min, 600ms interval, burst 5\n   *\n   * @param [options] - Query parameters\n   * @param [options.locale] - Language locale (e.g., 'ru', 'en')\n   * @returns Available gender values\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.getDirectoryKinds({ locale: 'ru' });\n   * console.log(result.data); // ['Мужской', 'Женский', 'Унисекс']\n   * ```\n   */\n  async getDirectoryKinds(options?: {\n    locale?: string;\n  }): Promise<{ data?: string[]; error?: boolean; errorText?: string; additionalErrors?: string }> {\n    return this.client.get<{\n      data?: string[];\n      error?: boolean;\n      errorText?: string;\n      additionalErrors?: string;\n    }>('https://content-api.wildberries.ru/content/v2/directory/kinds', {\n      params: options,\n      rateLimitKey: 'products.contentDirectoryKinds',\n    });\n  }\n\n  /**\n   * Страна производства\n   *\n   * Returns possible values for the \"Country of manufacture\" product characteristic.\n   *\n   * Rate limit: 100 req/min, 600ms interval, burst 5\n   *\n   * @param [options] - Query parameters\n   * @param [options.locale] - Language locale (e.g., 'ru', 'en')\n   * @returns Available country values\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.getDirectoryCountries({ locale: 'ru' });\n   * console.log(result.data); // Available country values\n   * ```\n   */\n  async getDirectoryCountries(options?: {\n    locale?: string;\n  }): Promise<GetDirectoryCountriesResponse> {\n    return this.client.get<GetDirectoryCountriesResponse>(\n      'https://content-api.wildberries.ru/content/v2/directory/countries',\n      {\n        params: options,\n        rateLimitKey: 'products.contentDirectoryCountries',\n      }\n    );\n  }\n\n  /**\n   * Сезон\n   *\n   * Returns possible values for the \"Season\" product characteristic.\n   *\n   * Rate limit: 100 req/min, 600ms interval, burst 5\n   *\n   * @param [options] - Query parameters\n   * @param [options.locale] - Language locale (e.g., 'ru', 'en')\n   * @returns Available season values\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.getDirectorySeasons({ locale: 'ru' });\n   * console.log(result.data); // ['Лето', 'Зима', 'Демисезон', 'Всесезон']\n   * ```\n   */\n  async getDirectorySeasons(options?: {\n    locale?: string;\n  }): Promise<{ data?: string[]; error?: boolean; errorText?: string; additionalErrors?: string }> {\n    return this.client.get<{\n      data?: string[];\n      error?: boolean;\n      errorText?: string;\n      additionalErrors?: string;\n    }>('https://content-api.wildberries.ru/content/v2/directory/seasons', {\n      params: options,\n      rateLimitKey: 'products.contentDirectorySeasons',\n    });\n  }\n\n  /**\n   * Ставка НДС\n   *\n   * Returns possible values for the \"VAT rate\" product characteristic.\n   *\n   * Rate limit: 100 req/min, 600ms interval, burst 5\n   *\n   * @param [options] - Query parameters\n   * @param [options.locale] - Language locale (e.g., 'ru', 'en')\n   * @returns Available VAT rate values\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.getDirectoryVat({ locale: 'ru' });\n   * console.log(result.data); // Available VAT rate values\n   * ```\n   */\n  async getDirectoryVat(options?: {\n    locale?: string;\n  }): Promise<{ data?: string[]; error?: boolean; errorText?: string; additionalErrors?: string }> {\n    return this.client.get<{\n      data?: string[];\n      error?: boolean;\n      errorText?: string;\n      additionalErrors?: string;\n    }>('https://content-api.wildberries.ru/content/v2/directory/vat', {\n      params: options,\n      rateLimitKey: 'products.contentDirectoryVat',\n    });\n  }\n\n  /**\n   * ТНВЭД-код\n   *\n   * Returns list of TNVED codes by subject ID and optional code fragment search.\n   *\n   * Rate limit: 100 req/min, 600ms interval, burst 5\n   *\n   * @param [options] - Query parameters\n   * @param options.subjectID - Subject ID (required)\n   * @param [options.search] - TNVED code fragment to search\n   * @param [options.locale] - Language locale (e.g., 'ru', 'en')\n   * @returns TNVED codes with KIZ marking flag\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.getDirectoryTnved({ subjectID: 105, search: 6403 });\n   * console.log(result.data); // [{ tnved: '6403919100', isKiz: true }]\n   * ```\n   */\n  async getDirectoryTnved(options?: {\n    subjectID: number;\n    search?: number;\n    locale?: string;\n  }): Promise<{\n    data?: { tnved?: string; isKiz?: boolean }[];\n    error?: boolean;\n    errorText?: string;\n    additionalErrors?: string;\n  }> {\n    return this.client.get<{\n      data?: { tnved?: string; isKiz?: boolean }[];\n      error?: boolean;\n      errorText?: string;\n      additionalErrors?: string;\n    }>('https://content-api.wildberries.ru/content/v2/directory/tnved', {\n      params: options,\n      rateLimitKey: 'products.contentDirectoryTnved',\n    });\n  }\n\n  /**\n   * Бренды\n   *\n   * Метод возвращает список брендов по ID предмета.\n   * Используйте курсорную пагинацию с параметром `next` для получения всех результатов.\n   *\n   * Rate limit: 1 запрос в секунду, всплеск 5\n   *\n   * @readonly\n   * @param subjectId - ID предмета\n   * @param [next] - Курсор пагинации из предыдущего ответа\n   * @returns Пагинированный список брендов с общим количеством\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products#tag/Kategorii-predmety-i-harakteristiki}\n   * @example\n   * ```typescript\n   * // Получить первую страницу брендов для предмета 1234\n   * const result = await sdk.products.getBrands(1234);\n   * console.log(`Всего брендов: ${result.total}`);\n   *\n   * // Пагинация по всем брендам\n   * let next: number | undefined;\n   * do {\n   *   const page = await sdk.products.getBrands(1234, next);\n   *   page.brands.forEach(b => console.log(b.name));\n   *   next = page.next;\n   * } while (next);\n   * ```\n   */\n  async getBrands(subjectId: number, next?: number): Promise<BrandsResponse> {\n    return this.client.get<BrandsResponse>(\n      'https://content-api.wildberries.ru/api/content/v1/brands',\n      {\n        params: { subjectId, ...(next !== undefined && { next }) },\n        rateLimitKey: 'products.brands',\n      }\n    );\n  }\n\n  /**\n   * Список ярлыков\n   *\n   * Returns all seller tags for grouping and filtering products.\n   *\n   * Rate limit: 100 req/min, 600ms interval, burst 5\n   *\n   * @returns Seller tags list\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.getContentTags();\n   * console.log(result.data); // Seller tags array\n   * ```\n   */\n  async getContentTags(): Promise<GetContentTagsResponse> {\n    return this.client.get<GetContentTagsResponse>(\n      'https://content-api.wildberries.ru/content/v2/tags',\n      {\n        rateLimitKey: 'products.contentTags',\n      }\n    );\n  }\n\n  /**\n   * Создание ярлыка\n   *\n   * Creates a seller tag. Max 15 tags per seller, max 15 characters per tag name.\n   *\n   * Rate limit: 100 req/min, 600ms interval, burst 5\n   *\n   * @param data - Tag creation data\n   * @param [data.color] - Tag color\n   * @param [data.name] - Tag name (max 15 characters)\n   * @returns Creation result\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.createContentTag({ color: '#ff0000', name: 'Sale' });\n   * console.log(result);\n   * ```\n   */\n  async createContentTag(data: { color?: string; name?: string }): Promise<ResponseContentError> {\n    return this.client.post<ResponseContentError>(\n      'https://content-api.wildberries.ru/content/v2/tag',\n      data,\n      { rateLimitKey: 'products.postContentTag' }\n    );\n  }\n\n  /**\n   * Изменение ярлыка\n   *\n   * Replaces tag data: name and color.\n   *\n   * Rate limit: 100 req/min, 600ms interval, burst 5\n   *\n   * @param id - Числовой ID ярлыка\n   * @param data - Tag update data\n   * @param [data.color] - New tag color\n   * @param [data.name] - New tag name\n   * @returns Update result\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.updateContentTag(42, { color: '#00ff00', name: 'New Arrivals' });\n   * console.log(result);\n   * ```\n   */\n  async updateContentTag(\n    id: number,\n    data: { color?: string; name?: string }\n  ): Promise<ResponseContentError> {\n    return this.client.patch<ResponseContentError>(\n      `https://content-api.wildberries.ru/content/v2/tag/${id}`,\n      data,\n      { rateLimitKey: 'products.patchContentTag' }\n    );\n  }\n\n  /**\n   * Удаление ярлыка\n   *\n   * Deletes a tag from the seller's tag list.\n   *\n   * Rate limit: 100 req/min, 600ms interval, burst 5\n   *\n   * @param id - Числовой ID ярлыка\n   * @returns Deletion result\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.deleteContentTag(42);\n   * console.log(result);\n   * ```\n   */\n  async deleteContentTag(id: number): Promise<ResponseContentError> {\n    return this.client.delete<ResponseContentError>(\n      `https://content-api.wildberries.ru/content/v2/tag/${id}`,\n      undefined,\n      { rateLimitKey: 'products.deleteContentTag' }\n    );\n  }\n\n  /**\n   * Управление ярлыками в карточке товара\n   *\n   * Adds or removes tags from a product card. Max 15 tags per card.\n   * Removing a tag from a card does not delete it from the seller's tag list.\n   *\n   * Rate limit: 100 req/min, 600ms interval, burst 5\n   *\n   * @param data - Tag link data\n   * @param [data.nmID] - Product card nomenclature ID\n   * @param [data.tagsIDs] - Array of tag IDs to link/unlink\n   * @returns Link result\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.createNomenclatureLink({ nmID: 12345678, tagsIDs: [1, 2, 3] });\n   * console.log(result);\n   * ```\n   */\n  async createNomenclatureLink(data: {\n    nmID?: number;\n    tagsIDs?: number[];\n  }): Promise<ResponseContentError> {\n    return this.client.post<ResponseContentError>(\n      'https://content-api.wildberries.ru/content/v2/tag/nomenclature/link',\n      data,\n      { rateLimitKey: 'products.postContentTagNomenclatureLink' }\n    );\n  }\n\n  /**\n   * Список карточек товаров\n   *\n   * Returns a paginated list of product cards. Trashed cards are excluded; use getTrashedCards() instead.\n   * Use cursor-based pagination with updatedAt and nmID from the response cursor to fetch more than 100 cards.\n   *\n   * Rate limit: 100 req/min, 600ms interval, burst 5\n   *\n   * ⚠️ **Deadline 2026-06-16**: WB changes the `withPhoto` filter schema.\n   * `withPhoto: 0` (or missing) currently means \"only no-photo cards\" but will mean\n   * \"ALL cards\" after the deadline. A new value `withPhoto: 2` will mean \"only no-photo\n   * cards\" (replacing the old `0` semantic). If your code passes `withPhoto: 0` to\n   * filter for no-photo cards, you MUST migrate to `withPhoto: 2` (or\n   * `WITH_PHOTO_FILTER.NO_PHOTO`) before 2026-06-16. See\n   * `docs/guides/withphoto-semantic-migration.md` for the full migration matrix.\n   *\n   * @param data - Request body with settings, filters, and cursor\n   * @param [options] - Query parameters\n   * @param [options.locale] - Language locale (e.g., 'ru', 'en')\n   * @returns Product cards with pagination cursor\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.getCardsList({\n   *   settings: {\n   *     cursor: { limit: 100 },\n   *     filter: { withPhoto: WITH_PHOTO_FILTER.ALL },\n   *   },\n   * }, { locale: 'ru' });\n   * console.log(result.cards); // Product cards array\n   * console.log(result.cursor?.total); // Total count\n   * ```\n   */\n  async getCardsList(\n    data: {\n      settings?: {\n        sort?: { ascending?: boolean };\n        filter?: {\n          /**\n           * Photo filter. Schema changes 2026-06-16:\n           * - `-1` — all cards (unchanged)\n           * - `0` or missing — all cards (was \"no photo only\" until 2026-06-16)\n           * - `1` — only with photo (unchanged)\n           * - `2` — only without photo (NEW; replaces legacy `0` semantic)\n           *\n           * Use {@link WITH_PHOTO_FILTER} for self-documenting code that survives the schema change.\n           */\n          withPhoto?: number;\n          textSearch?: string;\n          tagIDs?: number[];\n          allowedCategoriesOnly?: boolean;\n          objectIDs?: number[];\n          brands?: string[];\n          imtID?: number;\n        };\n        cursor?: { limit?: number; updatedAt?: string; nmID?: number };\n      };\n    },\n    options?: { locale?: string }\n  ): Promise<{\n    cards?: {\n      nmID?: number;\n      imtID?: number;\n      nmUUID?: string;\n      subjectID?: number;\n      subjectName?: string;\n      vendorCode?: string;\n      brand?: string;\n      title?: string;\n      description?: string;\n      needKiz?: boolean;\n      /** Confirmed mandatory marking code (Честный ЗНАК) applied to product @since v3.6.2 */\n      kizMarked?: boolean;\n      photos?: {\n        big?: string;\n        c246x328?: string;\n        c516x688?: string;\n        square?: string;\n        tm?: string;\n      }[];\n      video?: string;\n      wholesale?: { enabled?: boolean; quantum?: number };\n      dimensions?: {\n        length?: number;\n        width?: number;\n        height?: number;\n        weightBrutto?: number;\n        isValid?: boolean;\n      };\n      characteristics?: CardCharacteristicOutput[];\n      sizes?: { chrtID?: number; techSize?: string; wbSize?: string; skus?: string[] }[];\n      tags?: { id?: number; name?: string; color?: string }[];\n      createdAt?: string;\n      updatedAt?: string;\n    }[];\n    cursor?: { updatedAt?: string; nmID?: number; total?: number };\n  }> {\n    // Sprint 19: detect legacy withPhoto:0 usage (semantic shift 2026-06-16)\n    // NOTE: If editing this message, also update:\n    //   - docs/guides/withphoto-semantic-migration.md (FAQ Q2)\n    //   - docs/ru/guides/withphoto-semantic-migration.md (FAQ Q2)\n    // to keep the doc-quoted message in sync.\n    if (data.settings?.filter?.withPhoto === 0) {\n      warnOnce(\n        'products.getCardsList:legacy-withphoto-zero',\n        `products.getCardsList: \\`withPhoto: 0\\` will change semantics on 2026-06-16. ` +\n          `Today it means \"only cards without photo\"; after the deadline it will mean ` +\n          `\"ALL cards\" (any photo state). If you want \"no photo only\", migrate to ` +\n          `\\`WITH_PHOTO_FILTER.NO_PHOTO\\` (= 2). If you want \"all cards\", use ` +\n          `\\`WITH_PHOTO_FILTER.ALL\\` (= -1) for clarity. ` +\n          `See docs/guides/withphoto-semantic-migration.md.`\n      );\n    }\n\n    // Validate cursor limit (maximum enforced by Wildberries API)\n    const MAXIMUM_CARDS_LIMIT = 100;\n\n    if (data.settings?.cursor?.limit) {\n      const limit = data.settings.cursor.limit;\n\n      if (limit > MAXIMUM_CARDS_LIMIT) {\n        throw new Error(\n          `Invalid cursor limit: ${limit}. ` +\n            `Maximum allowed is ${MAXIMUM_CARDS_LIMIT} cards per request. ` +\n            `Use pagination to fetch all cards. ` +\n            `See: https://salacoste.github.io/daytona-wildberries-typescript-sdk/guides/working-with-product-cards#pagination-limit-restrictions`\n        );\n      }\n\n      if (limit <= 0) {\n        throw new Error(\n          `Invalid cursor limit: ${limit}. ` +\n            `Limit must be a positive integer (recommended: ${MAXIMUM_CARDS_LIMIT}).`\n        );\n      }\n    }\n\n    return this.client.post<{\n      cards?: {\n        nmID?: number;\n        imtID?: number;\n        nmUUID?: string;\n        subjectID?: number;\n        subjectName?: string;\n        vendorCode?: string;\n        brand?: string;\n        title?: string;\n        description?: string;\n        needKiz?: boolean;\n        /** Confirmed mandatory marking code (Честный ЗНАК) applied to product @since v3.6.2 */\n        kizMarked?: boolean;\n        photos?: {\n          big?: string;\n          c246x328?: string;\n          c516x688?: string;\n          square?: string;\n          tm?: string;\n        }[];\n        video?: string;\n        wholesale?: { enabled?: boolean; quantum?: number };\n        dimensions?: {\n          length?: number;\n          width?: number;\n          height?: number;\n          weightBrutto?: number;\n          isValid?: boolean;\n        };\n        characteristics?: CardCharacteristicOutput[];\n        sizes?: { chrtID?: number; techSize?: string; wbSize?: string; skus?: string[] }[];\n        tags?: { id?: number; name?: string; color?: string }[];\n        createdAt?: string;\n        updatedAt?: string;\n      }[];\n      cursor?: { updatedAt?: string; nmID?: number; total?: number };\n    }>('https://content-api.wildberries.ru/content/v2/get/cards/list', data, {\n      params: options,\n      rateLimitKey: 'products.postContentGetCardsList',\n    });\n  }\n\n  /**\n   * Список несозданных карточек товаров с ошибками\n   *\n   * Returns product cards (drafts) that failed during creation or editing, with error descriptions.\n   * Data is returned in batches. Use cursor pagination with updatedAt and batchUUID.\n   *\n   * Rate limit: 10 req/min, 6s interval, burst 5\n   *\n   * @param data - Request body with cursor and order settings\n   * @param [options] - Query parameters\n   * @param [options.locale] - Language locale (e.g., 'ru', 'en')\n   * @returns Error list with pagination\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.createErrorList(\n   *   { cursor: { limit: 100 }, order: { ascending: true } },\n   *   { locale: 'ru' }\n   * );\n   * console.log(result);\n   * ```\n   */\n  async createErrorList(\n    data: RequestPublicViewerPublicErrorsTableListV2,\n    options?: { locale?: string }\n  ): Promise<ResponsePublicViewerPublicErrorsTableListV2> {\n    return this.client.post<ResponsePublicViewerPublicErrorsTableListV2>(\n      'https://content-api.wildberries.ru/content/v2/cards/error/list',\n      data,\n      { params: options, rateLimitKey: 'products.postContentCardsErrorList' }\n    );\n  }\n\n  /**\n   * Редактирование карточек товаров\n   *\n   * Updates product cards. Card is fully overwritten, so all parameters must be sent including unchanged ones.\n   * Cannot edit barcodes, photos, video, or tags. Max 3000 cards per request, 10 MB max.\n   * Dimensions in cm, weight in kg.\n   *\n   * Rate limit: 10 req/min, 6s interval, burst 5\n   *\n   * @param [data] - Array of product cards to update\n   * @returns Update result\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.createCardsUpdate([{\n   *   nmID: 12345678,\n   *   vendorCode: 'ART-001',\n   *   title: 'Updated Product',\n   *   sizes: [{ techSize: '42', skus: ['1234567890123'] }],\n   *   characteristics: [{ id: 1, value: 'Blue' }],\n   * }]);\n   * console.log(result);\n   * ```\n   */\n  async createCardsUpdate(\n    data?: {\n      nmID: number;\n      vendorCode: string;\n      brand?: string;\n      title?: string;\n      description?: string;\n      dimensions?: { length?: number; width?: number; height?: number; weightBrutto?: number };\n      characteristics?: CardCharacteristicInput[];\n      sizes: { chrtID?: number; techSize?: string; wbSize?: string; skus?: string[] }[];\n      /** Confirmed mandatory marking code (Честный ЗНАК) applied to product. Default: false. @since v3.6.2 */\n      kizMarked?: boolean;\n    }[]\n  ): Promise<ResponseCardCreate> {\n    return this.client.post<ResponseCardCreate>(\n      'https://content-api.wildberries.ru/content/v2/cards/update',\n      data,\n      { rateLimitKey: 'products.postContentCardsUpdate' }\n    );\n  }\n\n  /**\n   * Объединение и разъединение карточек товаров\n   *\n   * Merges or splits product cards by imtID. With imtID: merge (max 30 cards, same subject only).\n   * Without imtID: split (new imtID generated). Max request size 10 MB.\n   *\n   * Rate limit: 100 req/min, 600ms interval, burst 5\n   *\n   * @param [data] - Merge/split request (with or without imtID)\n   * @returns Operation result\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * // Merge cards under a single imtID\n   * const result = await sdk.products.createCardsMovenm({\n   *   imtID: 98765,\n   *   nmIDs: [12345678, 12345679],\n   * });\n   * console.log(result);\n   * ```\n   */\n  async createCardsMovenm(\n    data?: RequestMoveNmsImtConn | RequestMoveNmsImtDisconn\n  ): Promise<ResponseCardCreate> {\n    return this.client.post<ResponseCardCreate>(\n      'https://content-api.wildberries.ru/content/v2/cards/moveNm',\n      data,\n      { rateLimitKey: 'products.postContentCardsMoveNm' }\n    );\n  }\n\n  /**\n   * Перенос карточек товаров в корзину\n   *\n   * Moves product cards to trash. Cards are not deleted and can be recovered.\n   * Cards get a new imtID after trashing. Auto-deleted after 30 days.\n   *\n   * Rate limit: 100 req/min, 600ms interval, burst 5\n   *\n   * @param data - Request body with nmIDs to trash\n   * @param [data.nmIDs] - Array of product card IDs to move to trash\n   * @returns Trash operation result\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.createDeleteTrash({ nmIDs: [12345678, 12345679] });\n   * console.log(result);\n   * ```\n   */\n  async createDeleteTrash(data: { nmIDs?: number[] }): Promise<{\n    data?: Record<string, never>;\n    error?: boolean;\n    errorText?: string;\n    additionalErrors?: Record<string, never>;\n  }> {\n    return this.client.post<{\n      data?: Record<string, never>;\n      error?: boolean;\n      errorText?: string;\n      additionalErrors?: Record<string, never>;\n    }>('https://content-api.wildberries.ru/content/v2/cards/delete/trash', data, {\n      rateLimitKey: 'products.postContentCardsDeleteTrash',\n    });\n  }\n\n  /**\n   * Восстановление карточек товаров из корзины\n   *\n   * Restores product cards from trash. Card retains the imtID assigned when it was trashed.\n   *\n   * Rate limit: 100 req/min, 600ms interval, burst 5\n   *\n   * @param data - Request body with nmIDs to recover\n   * @param [data.nmIDs] - Array of product card IDs to restore\n   * @returns Recovery result\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.createCardsRecover({ nmIDs: [12345678] });\n   * console.log(result);\n   * ```\n   */\n  async createCardsRecover(data: { nmIDs?: number[] }): Promise<{\n    data?: Record<string, never>;\n    error?: boolean;\n    errorText?: string;\n    additionalErrors?: Record<string, never>;\n  }> {\n    return this.client.post<{\n      data?: Record<string, never>;\n      error?: boolean;\n      errorText?: string;\n      additionalErrors?: Record<string, never>;\n    }>('https://content-api.wildberries.ru/content/v2/cards/recover', data, {\n      rateLimitKey: 'products.postContentCardsRecover',\n    });\n  }\n\n  /**\n   * Окончательно удалить карточки товаров из корзины\n   *\n   * Permanently delete product cards from trash (irreversible). Frees up limit slots\n   * immediately, bypassing the 30-day auto-cleanup. Complement to `createDeleteTrash()`\n   * (soft, move to trash) — call this when you want to recover limit slots NOW.\n   *\n   * **Sandbox-only at v3.13.1 release (2026-05-15)**: WB announced this endpoint in the\n   * Sandbox environment. Production availability is tracked via WL-5 in\n   * `backlog/watch-list.md`. When WB confirms production release, this JSDoc marker\n   * will drop in a patch release.\n   *\n   * Workflow:\n   * ```\n   * createDeleteTrash → cards → trash (soft, 30d auto-cleanup)\n   *        │\n   *        ├── createCardsRecover → restore\n   *        ├── wait 30d            → auto-cleanup\n   *        └── deleteCardsFromTrash → hard delete NOW (this method)\n   * ```\n   *\n   * Rate limit: matches `createCardsRecover` sibling (server-side enforced)\n   *\n   * @param data - Request body with nmIDs to permanently delete from trash\n   * @param [data.nmIDs] - Array of product card IDs currently in trash\n   * @returns Standard content-api envelope (error flag, errorText, additionalErrors)\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/docs/openapi-other/sandbox-environment} (search for `cards/delete` under Работа с товарами section)\n   * @see {@link ProductsModule.createDeleteTrash} — move TO trash (soft)\n   * @see {@link ProductsModule.createCardsRecover} — restore from trash\n   * @see {@link ProductsModule.getCardsLimits} — pre-flight limit check\n   * @since 3.13.1\n   * @example\n   * ```typescript\n   * // Free up limit slots immediately by permanently deleting trashed cards\n   * const limits = await sdk.products.getCardsLimits();\n   * // Treat undefined freeLimits as \"no slots free\" (WB may omit when zero)\n   * if (limits.data && !limits.data.freeLimits) {\n   *   // No free slots — clear old trash to make room\n   *   const trashed = await sdk.products.getTrashedCards({\n   *     settings: { cursor: { limit: 100 } },\n   *   });\n   *   const oldIds = trashed.cards\n   *     ?.filter((c) => c.nmID !== undefined)\n   *     .map((c) => c.nmID as number) ?? [];\n   *\n   *   if (oldIds.length > 0) {\n   *     const result = await sdk.products.deleteCardsFromTrash({ nmIDs: oldIds });\n   *     if (result.error) {\n   *       console.error('Delete failed:', result.errorText);\n   *     }\n   *   }\n   * }\n   * ```\n   */\n  async deleteCardsFromTrash(\n    data: DeleteCardsFromTrashRequest\n  ): Promise<DeleteCardsFromTrashResponse> {\n    return this.client.post<DeleteCardsFromTrashResponse>(\n      'https://content-api.wildberries.ru/content/v1/cards/delete',\n      data,\n      { rateLimitKey: 'products.postContentCardsDelete' }\n    );\n  }\n\n  /**\n   * Список карточек товаров в корзине\n   *\n   * Returns trashed product cards with cursor-based pagination (trashedAt + nmID).\n   *\n   * Rate limit: 100 req/min, 600ms interval, burst 5\n   *\n   * @param data - Request body with settings, cursor, and filter\n   * @param [options] - Query parameters\n   * @param [options.locale] - Language locale ('ru', 'en', 'zh')\n   * @returns Trashed product cards with pagination cursor\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.getTrashedCards({\n   *   settings: { cursor: { limit: 100 }, filter: { textSearch: 'shoes' } },\n   * }, { locale: 'ru' });\n   * console.log(result.cards); // Trashed cards array\n   * ```\n   */\n  async getTrashedCards(\n    data: {\n      settings?: {\n        sort?: { ascending?: boolean };\n        cursor?: { limit?: number; trashedAt?: string; nmID?: number };\n        filter?: { textSearch?: string };\n      };\n    },\n    options?: { locale?: 'ru' | 'en' | 'zh' }\n  ): Promise<{\n    cards?: {\n      nmID?: number;\n      vendorCode?: string;\n      subjectID?: number;\n      subjectName?: string;\n      photos?: {\n        big?: string;\n        c246x328?: string;\n        c516x688?: string;\n        square?: string;\n        tm?: string;\n      }[];\n      video?: string;\n      wholesale?: { enabled?: boolean; quantum?: number };\n      sizes?: { chrtID?: number; techSize?: string; wbSize?: string; skus?: string[] }[];\n      dimensions?: {\n        length?: number;\n        width?: number;\n        height?: number;\n        weightBrutto?: number;\n        isValid?: boolean;\n      };\n      characteristics?: CardCharacteristicOutput[];\n      /** Whether a mandatory marking code (Честный ЗНАК) is required for this product */\n      needKiz?: boolean;\n      /** Confirmed mandatory marking code (Честный ЗНАК) applied to product @since v3.6.2 */\n      kizMarked?: boolean;\n      createdAt?: string;\n      trashedAt?: string;\n    }[];\n    cursor?: { trashedAt?: string; nmID?: number; total?: number };\n  }> {\n    return this.client.post<{\n      cards?: {\n        nmID?: number;\n        vendorCode?: string;\n        subjectID?: number;\n        subjectName?: string;\n        photos?: {\n          big?: string;\n          c246x328?: string;\n          c516x688?: string;\n          square?: string;\n          tm?: string;\n        }[];\n        video?: string;\n        wholesale?: { enabled?: boolean; quantum?: number };\n        sizes?: { chrtID?: number; techSize?: string; wbSize?: string; skus?: string[] }[];\n        dimensions?: {\n          length?: number;\n          width?: number;\n          height?: number;\n          weightBrutto?: number;\n          isValid?: boolean;\n        };\n        characteristics?: CardCharacteristicOutput[];\n        needKiz?: boolean;\n        kizMarked?: boolean;\n        createdAt?: string;\n        trashedAt?: string;\n      }[];\n      cursor?: { trashedAt?: string; nmID?: number; total?: number };\n    }>('https://content-api.wildberries.ru/content/v2/get/cards/trash', data, {\n      params: options,\n      rateLimitKey: 'products.postContentGetCardsTrash',\n    });\n  }\n\n  /**\n   * Лимиты карточек товаров\n   *\n   * Returns free and paid limits for product card creation.\n   * Available cards = (freeLimits + paidLimits) - created cards count.\n   *\n   * Rate limit: 100 req/min, 600ms interval, burst 5\n   *\n   * @returns Card creation limits\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.getCardsLimits();\n   * console.log(result.data); // { freeLimits: 1000, paidLimits: 500 }\n   * ```\n   */\n  async getCardsLimits(): Promise<{\n    data?: { freeLimits?: number; paidLimits?: number };\n    error?: boolean;\n    errorText?: string;\n    additionalErrors?: string;\n  }> {\n    return this.client.get<{\n      data?: { freeLimits?: number; paidLimits?: number };\n      error?: boolean;\n      errorText?: string;\n      additionalErrors?: string;\n    }>('https://content-api.wildberries.ru/content/v2/cards/limits', {\n      rateLimitKey: 'products.contentCardsLimits',\n    });\n  }\n\n  /**\n   * Генерация баркодов\n   *\n   * Generates unique barcodes for product card size creation. Use when you don't have your own barcodes.\n   *\n   * Rate limit: 100 req/min, 600ms interval, burst 5\n   *\n   * @param data - Request body\n   * @param [data.count] - Number of barcodes to generate\n   * @returns Generated barcodes array\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.createContentBarcode({ count: 5 });\n   * console.log(result.data); // ['1234567890123', '1234567890124', ...]\n   * ```\n   */\n  async createContentBarcode(data: {\n    count?: number;\n  }): Promise<{ data?: string[]; error?: boolean; errorText?: string; additionalErrors?: string }> {\n    return this.client.post<{\n      data?: string[];\n      error?: boolean;\n      errorText?: string;\n      additionalErrors?: string;\n    }>('https://content-api.wildberries.ru/content/v2/barcodes', data, {\n      rateLimitKey: 'products.postContentBarcodes',\n    });\n  }\n\n  /**\n   * Создание карточек товаров\n   *\n   * Creates product cards asynchronously. Max 100 merged cards (imtID) with 30 cards each per request, 10 MB max.\n   * Dimensions in cm, weight in kg. Check error list if 200 response but some cards were not created.\n   *\n   * Rate limit: 10 req/min, 6s interval, burst 5\n   *\n   * @param [data] - Array of product card groups to create\n   * @returns Creation result\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.createCardsUpload([{\n   *   subjectID: 105,\n   *   variants: [{\n   *     vendorCode: 'ART-001',\n   *     brand: 'MyBrand',\n   *     title: 'Product Name',\n   *     sizes: [{ techSize: '42', skus: ['1234567890123'] }],\n   *     characteristics: [{ id: 1, value: 'Blue' }],\n   *   }],\n   * }]);\n   * console.log(result);\n   * ```\n   */\n  async createCardsUpload(\n    data?: {\n      subjectID: number;\n      variants: {\n        brand?: string;\n        title?: string;\n        description?: string;\n        vendorCode: string;\n        wholesale?: { enabled?: boolean; quantum?: number };\n        dimensions?: { length?: number; width?: number; height?: number; weightBrutto?: number };\n        sizes?: { techSize?: string; wbSize?: string; price?: number; skus?: string[] }[];\n        characteristics?: CardCharacteristicInput[];\n        /** Confirmed mandatory marking code (Честный ЗНАК) applied to product. Default: false. @since v3.6.2 */\n        kizMarked?: boolean;\n      }[];\n    }[]\n  ): Promise<ResponseCardCreate> {\n    return this.client.post<ResponseCardCreate>(\n      'https://content-api.wildberries.ru/content/v2/cards/upload',\n      data,\n      { rateLimitKey: 'products.postContentCardsUpload' }\n    );\n  }\n\n  /**\n   * Создание карточек товаров с присоединением\n   *\n   * Creates new product cards and joins them to existing cards by imtID. Async processing, 10 MB max.\n   * Dimensions in cm, weight in kg.\n   *\n   * Rate limit: 10 req/min, 6s interval, burst 5\n   *\n   * @param [data] - Cards to create and join to existing imtID\n   * @returns Creation result\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.createUploadAdd({\n   *   imtID: 98765,\n   *   cardsToAdd: [{\n   *     vendorCode: 'ART-002',\n   *     sizes: [{ techSize: '44', skus: ['1234567890124'] }],\n   *     characteristics: [{ id: 1, value: 'Red' }],\n   *   }],\n   * });\n   * console.log(result);\n   * ```\n   */\n  async createUploadAdd(data?: {\n    imtID?: number;\n    cardsToAdd?: {\n      brand?: string;\n      vendorCode: string;\n      wholesale?: { enabled?: boolean; quantum?: number };\n      title?: string;\n      description?: string;\n      dimensions?: { length?: number; width?: number; height?: number; weightBrutto?: number };\n      sizes?: { techSize?: string; wbSize?: string; price?: number; skus?: string[] }[];\n      characteristics?: CardCharacteristicInput[];\n      /** Confirmed mandatory marking code (Честный ЗНАК) applied to product. Default: false. @since v3.6.2 */\n      kizMarked?: boolean;\n    }[];\n  }): Promise<ResponseCardCreate> {\n    return this.client.post<ResponseCardCreate>(\n      'https://content-api.wildberries.ru/content/v2/cards/upload/add',\n      data,\n      { rateLimitKey: 'products.postContentCardsUploadAdd' }\n    );\n  }\n\n  /**\n   * Загрузить медиафайл\n   *\n   * Uploads a single media file to a product card. Images: max 30 per card, min 700x900px, max 32MB,\n   * formats JPG/PNG/BMP/GIF/WebP. Video: max 1 per card, max 50MB, formats MOV/MP4.\n   *\n   * Rate limit: 100 req/min, 600ms interval, burst 5\n   *\n   * @returns Upload result\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.createMediaFile();\n   * console.log(result);\n   * ```\n   */\n  async createMediaFile(): Promise<{\n    data?: Record<string, never>;\n    error?: boolean;\n    errorText?: string;\n    additionalErrors?: Record<string, never>;\n  }> {\n    return this.client.post<{\n      data?: Record<string, never>;\n      error?: boolean;\n      errorText?: string;\n      additionalErrors?: Record<string, never>;\n    }>('https://content-api.wildberries.ru/content/v3/media/file', undefined, {\n      rateLimitKey: 'products.postContentMediaFile',\n    });\n  }\n\n  /**\n   * Загрузить медиафайлы по ссылкам\n   *\n   * Uploads media files to a product card via URLs. New files fully replace old ones.\n   * Links must be direct file URLs (no auth required). If any file fails validation, none are uploaded.\n   *\n   * Rate limit: 100 req/min, 600ms interval, burst 5\n   *\n   * @param data - Request body\n   * @param [data.nmId] - Product card nomenclature ID\n   * @param [data.data] - Array of direct file URLs\n   * @returns Upload result\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.createMediaSave({\n   *   nmId: 12345678,\n   *   data: ['https://example.com/photo1.jpg', 'https://example.com/photo2.jpg'],\n   * });\n   * console.log(result);\n   * ```\n   */\n  async createMediaSave(data: { nmId?: number; data?: string[] }): Promise<{\n    data?: Record<string, never>;\n    error?: boolean;\n    errorText?: string;\n    additionalErrors?: Record<string, never>;\n  }> {\n    return this.client.post<{\n      data?: Record<string, never>;\n      error?: boolean;\n      errorText?: string;\n      additionalErrors?: Record<string, never>;\n    }>('https://content-api.wildberries.ru/content/v3/media/save', data, {\n      rateLimitKey: 'products.postContentMediaSave',\n    });\n  }\n\n  /**\n   * Установить цены и скидки\n   *\n   * Sets prices and discounts for products. Use createTaskSize() for per-size pricing.\n   * Track upload status via getHistoryTasks() and getGoodsTask().\n   *\n   * Rate limit: 10 req/6s, 600ms interval, burst 5\n   *\n   * @param data - Goods pricing data\n   * @returns Upload task response\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products#tag/Ceny-i-skidki}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.createUploadTask({\n   *   data: [{ nmID: 12345678, price: 1500, discount: 10 }],\n   * });\n   * console.log(result);\n   * ```\n   */\n  async createUploadTask(data: Goods): Promise<UploadTaskResponse> {\n    return this.client.post<UploadTaskResponse>(\n      'https://discounts-prices-api.wildberries.ru/api/v2/upload/task',\n      data,\n      { rateLimitKey: 'products.postUploadTask' }\n    );\n  }\n\n  /**\n   * Установить цены для размеров\n   *\n   * Sets prices per size for eligible products (editableSizePrice: true).\n   * Use createUploadTask() for product-level pricing.\n   *\n   * Rate limit: 10 req/6s, 600ms interval, burst 5\n   *\n   * @param data - Size pricing data\n   * @returns Upload task response\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products#tag/Ceny-i-skidki}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.createTaskSize({\n   *   data: [{ nmID: 12345678, sizeID: 100, price: 2000 }],\n   * });\n   * console.log(result);\n   * ```\n   */\n  async createTaskSize(data: SizeGoodsBody): Promise<UploadTaskResponse> {\n    return this.client.post<UploadTaskResponse>(\n      'https://discounts-prices-api.wildberries.ru/api/v2/upload/task/size',\n      data,\n      { rateLimitKey: 'products.postUploadTaskSize' }\n    );\n  }\n\n  /**\n   * Установить скидки WB Клуба\n   *\n   * Sets WB Club subscription discounts for products.\n   *\n   * Rate limit: 10 req/6s, 600ms interval, burst 5\n   *\n   * @param data - Club discount data\n   * @returns Upload task response\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products#tag/Ceny-i-skidki}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.createTaskClubDiscount({\n   *   data: [{ nmID: 12345678, clubDiscount: 15 }],\n   * });\n   * console.log(result);\n   * ```\n   */\n  async createTaskClubDiscount(data: ClubDisc): Promise<UploadTaskResponse> {\n    return this.client.post<UploadTaskResponse>(\n      'https://discounts-prices-api.wildberries.ru/api/v2/upload/task/club-discount',\n      data,\n      { rateLimitKey: 'products.postUploadTaskClubDiscount' }\n    );\n  }\n\n  /**\n   * Состояние обработанной загрузки\n   *\n   * Returns processed upload status for prices, size prices, and WB Club discounts.\n   *\n   * Rate limit: 10 req/6s, 600ms interval, burst 5\n   *\n   * @param [options] - Query parameters\n   * @param options.uploadID - Upload task ID to check\n   * @returns Task history with status\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products#tag/Ceny-i-skidki}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.getHistoryTasks({ uploadID: 12345 });\n   * console.log(result);\n   * ```\n   */\n  async getHistoryTasks(options?: { uploadID: number }): Promise<TaskHistoryResponse> {\n    return this.client.get<TaskHistoryResponse>(\n      'https://discounts-prices-api.wildberries.ru/api/v2/history/tasks',\n      { params: options, rateLimitKey: 'products.historyTasks' }\n    );\n  }\n\n  /**\n   * Детализация обработанной загрузки\n   *\n   * Returns per-item details and errors from a processed price/discount upload.\n   *\n   * Rate limit: 10 req/6s, 600ms interval, burst 5\n   *\n   * @param [options] - Query parameters\n   * @param options.limit - Number of items to return\n   * @param [options.offset] - Items offset\n   * @param options.uploadID - Upload task ID\n   * @returns Goods history with errors\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products#tag/Ceny-i-skidki}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.getGoodsTask({ limit: 100, uploadID: 12345 });\n   * console.log(result);\n   * ```\n   */\n  async getGoodsTask(options?: {\n    limit: number;\n    offset?: number;\n    uploadID: number;\n  }): Promise<GoodsHistoryResponse> {\n    return this.client.get<GoodsHistoryResponse>(\n      'https://discounts-prices-api.wildberries.ru/api/v2/history/goods/task',\n      { params: options, rateLimitKey: 'products.historyGoodsTask' }\n    );\n  }\n\n  /**\n   * Состояние необработанной загрузки\n   *\n   * Returns pending upload status (promo calendar discounts not yet applied).\n   *\n   * Rate limit: 10 req/6s, 600ms interval, burst 5\n   *\n   * @param [options] - Query parameters\n   * @param options.uploadID - Upload task ID to check\n   * @returns Buffer task status\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products#tag/Ceny-i-skidki}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.getBufferTasks({ uploadID: 12345 });\n   * console.log(result);\n   * ```\n   */\n  async getBufferTasks(options?: { uploadID: number }): Promise<TaskBufferResponse> {\n    return this.client.get<TaskBufferResponse>(\n      'https://discounts-prices-api.wildberries.ru/api/v2/buffer/tasks',\n      { params: options, rateLimitKey: 'products.bufferTasks' }\n    );\n  }\n\n  /**\n   * Детализация необработанной загрузки\n   *\n   * Returns per-item details and errors from a pending (promo calendar) discount upload.\n   *\n   * Rate limit: 10 req/6s, 600ms interval, burst 5\n   *\n   * @param [options] - Query parameters\n   * @param options.limit - Number of items to return\n   * @param [options.offset] - Items offset\n   * @param options.uploadID - Upload task ID\n   * @returns Buffer goods with errors\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products#tag/Ceny-i-skidki}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.getBufferGoodsTask({ limit: 100, uploadID: 12345 });\n   * console.log(result);\n   * ```\n   */\n  async getBufferGoodsTask(options?: {\n    limit: number;\n    offset?: number;\n    uploadID: number;\n  }): Promise<GoodsBufferResponse> {\n    return this.client.get<GoodsBufferResponse>(\n      'https://discounts-prices-api.wildberries.ru/api/v2/buffer/goods/task',\n      { params: options, rateLimitKey: 'products.bufferGoodsTask' }\n    );\n  }\n\n  /**\n   * Получить товары с ценами\n   *\n   * Returns product pricing info: prices, currency, discounts, WB Club discounts.\n   * Use limit/offset pagination for all products, or filterNmID for a single article.\n   *\n   * Rate limit: 10 req/6s, 600ms interval, burst 5\n   *\n   * @param [options] - Query parameters\n   * @param options.limit - Number of items to return (max 1000)\n   * @param [options.offset] - Items offset for pagination\n   * @param [options.filterNmID] - Filter by single article ID\n   * @returns Goods with pricing information\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products#tag/Ceny-i-skidki}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.getGoodsFilter({ limit: 1000, offset: 0 });\n   * console.log(result);\n   * ```\n   */\n  async getGoodsFilter(options?: {\n    limit: number;\n    offset?: number;\n    filterNmID?: number;\n  }): Promise<GoodsFilterResponse> {\n    return this.client.get<GoodsFilterResponse>(\n      'https://discounts-prices-api.wildberries.ru/api/v2/list/goods/filter',\n      { params: options, rateLimitKey: 'products.listGoodsFilter' }\n    );\n  }\n\n  /**\n   * Получить товары с ценами по артикулам\n   *\n   * Returns pricing info for multiple products by article IDs.\n   *\n   * Rate limit: 10 req/6s, 600ms interval, burst 5\n   *\n   * @param data - Request body with article IDs\n   * @param data.nmIDs - Array of article IDs to fetch pricing for\n   * @returns Goods with pricing information filtered by nmIDs\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products#tag/Ceny-i-skidki}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.createGoodsFilter({ nmIDs: [12345678, 87654321] });\n   * console.log(result);\n   * ```\n   */\n  async createGoodsFilter(data: { nmIDs: number[] }): Promise<GoodsFilterByNmResponse> {\n    return this.client.post<GoodsFilterByNmResponse>(\n      'https://discounts-prices-api.wildberries.ru/api/v2/list/goods/filter',\n      data,\n      { rateLimitKey: 'products.postListGoodsFilter' }\n    );\n  }\n\n  /**\n   * Получить размеры товара с ценами\n   *\n   * Returns per-size pricing info for a single product (only for categories with editableSizePrice: true).\n   *\n   * Rate limit: 10 req/6s, 600ms interval, burst 5\n   *\n   * @param [options] - Query parameters\n   * @param options.limit - Number of items to return\n   * @param [options.offset] - Items offset\n   * @param options.nmID - Product article ID\n   * @returns Size-level pricing data\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products#tag/Ceny-i-skidki}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.getSizeNm({ limit: 100, nmID: 12345678 });\n   * console.log(result);\n   * ```\n   */\n  async getSizeNm(options?: {\n    limit: number;\n    offset?: number;\n    nmID: number;\n  }): Promise<SizeGoodsResponse> {\n    return this.client.get<SizeGoodsResponse>(\n      'https://discounts-prices-api.wildberries.ru/api/v2/list/goods/size/nm',\n      { params: options, rateLimitKey: 'products.listGoodsSizeNm' }\n    );\n  }\n\n  /**\n   * Получить товары в карантине\n   *\n   * Returns quarantined products (price dropped 3x or more). Quarantine does not apply to per-size pricing.\n   * Products sell at old price while quarantined. Remove via API or seller dashboard.\n   *\n   * Rate limit: 10 req/6s, 600ms interval, burst 5\n   *\n   * @param [options] - Query parameters\n   * @param options.limit - Number of items to return\n   * @param [options.offset] - Items offset\n   * @returns Quarantined goods list\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products#tag/Ceny-i-skidki}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.getQuarantineGoods({ limit: 100, offset: 0 });\n   * console.log(result);\n   * ```\n   */\n  async getQuarantineGoods(options?: {\n    limit: number;\n    offset?: number;\n  }): Promise<QuarantineGoodsResponse> {\n    return this.client.get<QuarantineGoodsResponse>(\n      'https://discounts-prices-api.wildberries.ru/api/v2/quarantine/goods',\n      { params: options, rateLimitKey: 'products.quarantineGoods' }\n    );\n  }\n\n  /**\n   * Получить остатки товаров\n   *\n   * Returns stock amounts for products at a seller's warehouse. A 409 response counts as 10 requests.\n   *\n   * **Migration deadline 2026-05-20 13:00 MSK**: Wildberries is phasing out the `skus`\n   * parameter on this endpoint in favor of `chrtIds`. Pass `chrtIds` for all new code.\n   * After the deadline, WB returns HTTP 400 if `skus` is sent.\n   *\n   * Rate limit: 300 req/min, 200ms interval, burst 20\n   *\n   * @param warehouseId - ID склада продавца\n   * @param data - Request body — see {@link StocksRequest}. Pass `chrtIds` (preferred since\n   *   v3.12.0) or `skus` (deprecated; rejected by WB API after 2026-05-20).\n   * @returns Stock amounts. See {@link GetStocksResponse}.\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products#tag/Ostatki-na-skladah-prodavca}\n   * @example New v3.12.0+ pattern (preferred — required after 2026-05-20):\n   * ```typescript\n   * const result = await sdk.products.getStocks(12345, { chrtIds: [12345678, 12345679] });\n   * console.log(result.stocks); // [{ chrtId: 12345678, amount: 50 }, ...]\n   * ```\n   *\n   * @example Legacy pattern (deprecated since v3.12.0, breaks after 2026-05-20):\n   * ```typescript\n   * // Will emit a console.warn (since v3.12.0) and return HTTP 400 from WB after 2026-05-20\n   * const result = await sdk.products.getStocks(12345, { skus: ['1234567890123'] });\n   * ```\n   */\n  async getStocks(warehouseId: number, data: StocksRequest): Promise<GetStocksResponse> {\n    // task-16.2: detect legacy sku usage, emit warn-once (deadline 2026-05-20 13:00 MSK)\n    const sanitized = sanitizeStocksRequest(data, 'getStocks');\n    return this.client.post<GetStocksResponse>(\n      `https://marketplace-api.wildberries.ru/api/v3/stocks/${warehouseId}`,\n      sanitized,\n      { rateLimitKey: 'products.postStocks' }\n    );\n  }\n\n  /**\n   * Обновить остатки товаров\n   *\n   * Updates stock amounts for products at a seller's warehouse. Parameter names are not validated;\n   * incorrect names return 204 but do not update stocks. A 409 response counts as 10 requests.\n   *\n   * **Migration deadline 2026-05-20 13:00 MSK**: Wildberries is phasing out the `sku` field\n   * in stock items in favor of `chrtId`. Use `chrtId` per item for all new code.\n   * After the deadline, WB returns HTTP 400 if `sku` is sent.\n   *\n   * Rate limit: 300 req/min, 200ms interval, burst 20\n   *\n   * @param warehouseId - ID склада продавца\n   * @param data - Request body — see {@link UpdateStockRequest}. Use `chrtId` per stock item\n   *   (preferred since v3.12.0) or `sku` (deprecated; rejected by WB API after 2026-05-20).\n   * @returns void on success (204)\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products#tag/Ostatki-na-skladah-prodavca}\n   * @example New v3.12.0+ pattern (preferred — required after 2026-05-20):\n   * ```typescript\n   * await sdk.products.updateStock(12345, {\n   *   stocks: [{ chrtId: 12345678, amount: 100 }],\n   * });\n   * ```\n   *\n   * @example Legacy pattern (deprecated since v3.12.0, breaks after 2026-05-20):\n   * ```typescript\n   * // Will emit a console.warn (since v3.12.0) and return HTTP 400 from WB after 2026-05-20\n   * await sdk.products.updateStock(12345, {\n   *   stocks: [{ sku: '1234567890123', amount: 100 }],\n   * });\n   * ```\n   */\n  // TODO(v4.0.0): tighten to `data: UpdateStockRequest` (required). Current optional\n  // signature preserves pre-v3.12.0 public API. task-16.2 explicitly chose warn-only\n  // semantics (AC-5 \"no throw\") instead of fail-fast empty-body validation.\n  async updateStock(warehouseId: number, data?: UpdateStockRequest): Promise<void> {\n    // task-16.2: detect legacy sku usage, emit warn-once (deadline 2026-05-20 13:00 MSK)\n    const sanitized = sanitizeUpdateStockPayload(data);\n    return this.client.put(\n      `https://marketplace-api.wildberries.ru/api/v3/stocks/${warehouseId}`,\n      sanitized,\n      { rateLimitKey: 'products.putStocks' }\n    );\n  }\n\n  /**\n   * Удалить остатки товаров\n   *\n   * Irreversibly deletes stock records. Must re-upload stocks to resume sales.\n   * A 409 response counts as 10 requests.\n   *\n   * **Migration deadline 2026-05-20 13:00 MSK**: Wildberries is phasing out the `skus`\n   * parameter on this endpoint in favor of `chrtIds`. Pass `chrtIds` for all new code.\n   * After the deadline, WB returns HTTP 400 if `skus` is sent.\n   *\n   * Rate limit: 300 req/min, 200ms interval, burst 20\n   *\n   * @param warehouseId - ID склада продавца\n   * @param data - Request body — see {@link StocksRequest}. Pass `chrtIds` (preferred since\n   *   v3.12.0) or `skus` (deprecated; rejected by WB API after 2026-05-20).\n   * @returns void on success\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products#tag/Ostatki-na-skladah-prodavca}\n   * @example New v3.12.0+ pattern (preferred — required after 2026-05-20):\n   * ```typescript\n   * await sdk.products.deleteStock(12345, { chrtIds: [12345678, 12345679] });\n   * ```\n   *\n   * @example Legacy pattern (deprecated since v3.12.0, breaks after 2026-05-20):\n   * ```typescript\n   * // Will emit a console.warn (since v3.12.0) and return HTTP 400 from WB after 2026-05-20\n   * await sdk.products.deleteStock(12345, { skus: ['1234567890123'] });\n   * ```\n   */\n  async deleteStock(warehouseId: number, data: StocksRequest): Promise<void> {\n    // task-16.2: detect legacy sku usage, emit warn-once (deadline 2026-05-20 13:00 MSK)\n    const sanitized = sanitizeStocksRequest(data, 'deleteStock');\n    return this.client.delete(\n      `https://marketplace-api.wildberries.ru/api/v3/stocks/${warehouseId}`,\n      sanitized,\n      { rateLimitKey: 'products.deleteStocks' }\n    );\n  }\n\n  /**\n   * Получить список складов WB\n   *\n   * Returns all WB warehouses for binding to seller warehouses (FBS model).\n   *\n   * Rate limit: 300 req/min, 200ms interval, burst 20\n   *\n   * @returns Array of WB office/warehouse locations\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products#tag/Sklady-prodavca}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.offices();\n   * console.log(result); // [{ id: 1, name: 'Коледино', ... }]\n   * ```\n   */\n  async offices(): Promise<Office[]> {\n    return this.client.get<Office[]>('https://marketplace-api.wildberries.ru/api/v3/offices', {\n      rateLimitKey: 'products.offices',\n    });\n  }\n\n  /**\n   * Получить список складов продавца\n   *\n   * Returns all seller warehouses. Use warehouse IDs to manage stock.\n   *\n   * Rate limit: 300 req/min, 200ms interval, burst 20\n   *\n   * @returns Array of seller warehouses\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products#tag/Sklady-prodavca}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.warehouses();\n   * console.log(result); // [{ id: 12345, name: 'Main Warehouse', officeId: 1 }]\n   * ```\n   */\n  async warehouses(): Promise<Warehouse[]> {\n    return this.client.get<Warehouse[]>(\n      'https://marketplace-api.wildberries.ru/api/v3/warehouses',\n      { rateLimitKey: 'products.warehouses' }\n    );\n  }\n\n  /**\n   * Создать склад продавца\n   *\n   * Creates a seller warehouse bound to a WB office for FBS fulfillment.\n   * Cannot bind a WB warehouse that is already in use.\n   *\n   * Rate limit: 300 req/min, 200ms interval, burst 20\n   *\n   * @param data - Warehouse creation data\n   * @param data.name - Warehouse name\n   * @param data.officeId - WB office ID to bind\n   * @returns Created warehouse with ID\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products#tag/Sklady-prodavca}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.createWarehouse({ name: 'Main Warehouse', officeId: 1 });\n   * console.log(result.id); // New warehouse ID\n   * ```\n   */\n  async createWarehouse(data: { name: string; officeId: number }): Promise<{ id?: number }> {\n    return this.client.post<{ id?: number }>(\n      'https://marketplace-api.wildberries.ru/api/v3/warehouses',\n      data,\n      { rateLimitKey: 'products.postWarehouses' }\n    );\n  }\n\n  /**\n   * Обновить склад продавца\n   *\n   * Updates seller warehouse data. WB office binding can be changed once per day.\n   * Cannot bind a WB warehouse that is already in use.\n   *\n   * Rate limit: 300 req/min, 200ms interval, burst 20\n   *\n   * @param warehouseId - ID склада продавца\n   * @param data - Warehouse update data\n   * @param data.name - Updated warehouse name\n   * @param data.officeId - Updated WB office ID\n   * @returns void on success\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products#tag/Sklady-prodavca}\n   * @example\n   * ```typescript\n   * await sdk.products.updateWarehouse(12345, { name: 'Updated Warehouse', officeId: 2 });\n   * ```\n   */\n  async updateWarehouse(\n    warehouseId: number,\n    data: { name: string; officeId: number }\n  ): Promise<void> {\n    return this.client.put(\n      `https://marketplace-api.wildberries.ru/api/v3/warehouses/${warehouseId}`,\n      data,\n      { rateLimitKey: 'products.putWarehouses' }\n    );\n  }\n\n  /**\n   * Удалить склад продавца\n   *\n   * Deletes a seller warehouse from the list.\n   *\n   * Rate limit: 300 req/min, 200ms interval, burst 20\n   *\n   * @param warehouseId - ID склада продавца\n   * @returns void on success\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products#tag/Sklady-prodavca}\n   * @example\n   * ```typescript\n   * await sdk.products.deleteWarehouse(12345);\n   * ```\n   */\n  async deleteWarehouse(warehouseId: number): Promise<void> {\n    return this.client.delete(\n      `https://marketplace-api.wildberries.ru/api/v3/warehouses/${warehouseId}`,\n      undefined,\n      { rateLimitKey: 'products.deleteWarehouses' }\n    );\n  }\n\n  /**\n   * Список контактов\n   *\n   * Returns contacts linked to a seller warehouse. Only for warehouses with delivery type 3 (DBW - WB courier).\n   *\n   * Rate limit: 300 req/min, 200ms interval, burst 20\n   *\n   * @param warehouseId - ID склада продавца\n   * @returns Warehouse contacts list\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products#tag/Sklady-prodavca}\n   * @example\n   * ```typescript\n   * const result = await sdk.products.getWarehousesContact(12345);\n   * console.log(result.contacts); // [{ phone: '+79001234567', comment: 'Main' }]\n   * ```\n   */\n  async getWarehousesContact(\n    warehouseId: number\n  ): Promise<{ contacts?: { comment?: string; phone?: string }[] }> {\n    return this.client.get<{ contacts?: { comment?: string; phone?: string }[] }>(\n      `https://marketplace-api.wildberries.ru/api/v3/dbw/warehouses/${warehouseId}/contacts`,\n      { rateLimitKey: 'products.dbwWarehousesContacts' }\n    );\n  }\n\n  /**\n   * Обновить список контактов\n   *\n   * Overwrites the contact list for a seller warehouse (DBW delivery type 3 only).\n   * Send ALL contacts including unchanged ones. Max 5 contacts. Send empty array to delete all.\n   *\n   * Rate limit: 300 req/min, 200ms interval, burst 20\n   *\n   * @param warehouseId - ID склада продавца\n   * @param data - Contact list data (overwrites existing)\n   * @returns void on success\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/work-with-products#tag/Sklady-prodavca}\n   * @example\n   * ```typescript\n   * await sdk.products.updateWarehousesContact(12345, {\n   *   contacts: [{ phone: '+79001234567', comment: 'Main contact' }],\n   * });\n   * ```\n   */\n  async updateWarehousesContact(warehouseId: number, data: StoreContactRequestBody): Promise<void> {\n    return this.client.put(\n      `https://marketplace-api.wildberries.ru/api/v3/dbw/warehouses/${warehouseId}/contacts`,\n      data,\n      { rateLimitKey: 'products.putDbwWarehousesContacts' }\n    );\n  }\n}\n\n// Re-export characteristic types for subpath consumers (since v3.9.0)\nexport type {\n  SubjectCharacteristic,\n  CardCharacteristicInput,\n  CardCharacteristicOutput,\n} from '../../types/products.types';\n","/**\n * Auto-generated module\n * Generated from: wildberries_api_doc/03-orders-fbs.yaml\n * DO NOT EDIT MANUALLY - Changes will be overwritten on next generation\n */\n\nimport { BaseClient } from '../../client/base-client';\nimport type {\n  PassOffice,\n  Pass,\n  PassCreateRequest,\n  PassCreateResponse,\n  OrdersNewResponse,\n  OrdersResponse,\n  GetOrdersParams,\n  OrderStatusResponse,\n  Supply,\n  SuppliesResponse,\n  GetSuppliesParams,\n  SupplyCreateRequest,\n  SupplyCreateResponse,\n  TrbxListResponse,\n  TrbxCreateRequest,\n  TrbxCreateResponse,\n  TrbxDeleteRequest,\n  TrbxStickers,\n  TrbxStickerRequest,\n  DeleteMetaParams,\n  MetaSgtinRequest,\n  MetaUinRequest,\n  MetaImeiRequest,\n  MetaGtinRequest,\n  MetaExpirationRequest,\n  MetaCustomsDeclarationRequest,\n  StickerParams,\n  StickerRequest,\n  StickerResponse,\n  CrossBorderStickerRequest,\n  CrossBorderStickerResponse,\n  StatusHistoryRequest,\n  StatusHistoryResponse,\n  OrdersRequestAPI,\n  CrossborderTurkeyClientInfoResp,\n  GetMetaMultiRequest,\n  OrdersMetaResponse,\n  AddOrdersToSupplyRequest,\n  SupplyOrderIdsResponse,\n  ReshipmentResponse,\n  BarcodeParams,\n  BarcodeResponse,\n} from '../../types/orders-fbs.types';\n\nexport class OrdersFbsModule {\n  constructor(private client: BaseClient) {}\n\n  /**\n   * Get list of warehouses that require a pass\n   *\n   * Returns a list of warehouses for binding to a seller pass. The data returned by this method may change.\n   * It is recommended to periodically synchronize the list.\n   *\n   * @returns Promise resolving to an array of pass offices\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Propuska-FBS/paths/~1api~1v3~1passes~1offices/get}\n   *\n   * @example\n   * ```typescript\n   * const offices = await sdk.ordersFBS.getPassesOffices();\n   * console.log(offices);\n   * ```\n   */\n  async getPassesOffices(): Promise<PassOffice[]> {\n    return this.client.get<PassOffice[]>(\n      'https://marketplace-api.wildberries.ru/api/v3/passes/offices',\n      { rateLimitKey: 'orders-fbs.passesOffices' }\n    );\n  }\n\n  /**\n   * Get list of seller passes\n   *\n   * Returns a list of all created seller passes.\n   *\n   * @returns Promise resolving to an array of passes\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Propuska-FBS/paths/~1api~1v3~1passes/get}\n   *\n   * @example\n   * ```typescript\n   * const passes = await sdk.ordersFBS.passes();\n   * console.log(passes);\n   * ```\n   */\n  async passes(): Promise<Pass[]> {\n    return this.client.get<Pass[]>('https://marketplace-api.wildberries.ru/api/v3/passes', {\n      rateLimitKey: 'orders-fbs.passes',\n    });\n  }\n\n  /**\n   * Create a seller pass\n   *\n   * Creates a seller pass bound to a WB warehouse. The pass is valid for 48 hours from creation.\n   *\n   * @param data - Pass data (full name length must be 6-100 characters, car number allows only letters and digits)\n   * @returns Promise resolving to the created pass ID\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Propuska-FBS/paths/~1api~1v3~1passes/post}\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.ordersFBS.createPass({\n   *   firstName: 'Ivan',\n   *   lastName: 'Petrov',\n   *   carModel: 'GAZelle',\n   *   carNumber: 'A123BC77',\n   *   officeId: 1,\n   * });\n   * console.log(result.id);\n   * ```\n   */\n  async createPass(data: PassCreateRequest): Promise<PassCreateResponse> {\n    return this.client.post<PassCreateResponse>(\n      'https://marketplace-api.wildberries.ru/api/v3/passes',\n      data,\n      { rateLimitKey: 'orders-fbs.postPasses' }\n    );\n  }\n\n  /**\n   * Update a seller pass\n   *\n   * Updates seller pass data, including the bound WB warehouse.\n   *\n   * @param passId - ID of the pass to update\n   * @param data - Updated pass data (full name length must be 6-100 characters, car number allows only letters and digits)\n   * @returns Promise resolving to void on success\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Propuska-FBS/paths/~1api~1v3~1passes~1%7BpassId%7D/put}\n   *\n   * @example\n   * ```typescript\n   * await sdk.ordersFBS.updatePass(12345, {\n   *   firstName: 'Ivan',\n   *   lastName: 'Petrov',\n   *   carModel: 'GAZelle',\n   *   carNumber: 'A123BC77',\n   *   officeId: 2,\n   * });\n   * ```\n   */\n  async updatePass(passId: number, data: PassCreateRequest): Promise<void> {\n    return this.client.put(`https://marketplace-api.wildberries.ru/api/v3/passes/${passId}`, data, {\n      rateLimitKey: 'orders-fbs.putPasses',\n    });\n  }\n\n  /**\n   * Delete a seller pass\n   *\n   * Removes a seller pass from the list.\n   *\n   * @param passId - ID of the pass to delete\n   * @returns Promise resolving to void on success\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Propuska-FBS/paths/~1api~1v3~1passes~1%7BpassId%7D/delete}\n   *\n   * @example\n   * ```typescript\n   * await sdk.ordersFBS.deletePass(12345);\n   * ```\n   */\n  async deletePass(passId: number): Promise<void> {\n    return this.client.delete(`https://marketplace-api.wildberries.ru/api/v3/passes/${passId}`, {\n      rateLimitKey: 'orders-fbs.deletePasses',\n    });\n  }\n\n  /**\n   * Get list of new assembly tasks\n   *\n   * Returns a list of all new assembly tasks available for the seller at the time of request.\n   *\n   * @returns Promise resolving to new orders response\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Sborochnye-zadaniya-FBS/paths/~1api~1v3~1orders~1new/get}\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.ordersFBS.getOrdersNew();\n   * console.log(result.orders);\n   * ```\n   */\n  async getOrdersNew(): Promise<OrdersNewResponse> {\n    return this.client.get<OrdersNewResponse>(\n      'https://marketplace-api.wildberries.ru/api/v3/orders/new',\n      { rateLimitKey: 'orders-fbs.ordersNew' }\n    );\n  }\n\n  /**\n   * Get assembly tasks information\n   *\n   * Returns assembly task information without their current status.\n   * Data can be retrieved for a given period, up to 30 calendar days per request.\n   *\n   * @param options - Query parameters for pagination and date filtering\n   * @returns Promise resolving to orders with pagination cursor\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Sborochnye-zadaniya-FBS/paths/~1api~1v3~1orders/get}\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.ordersFBS.orders({ limit: 100, next: 0 });\n   * console.log(result.orders);\n   * ```\n   */\n  async orders(options?: GetOrdersParams): Promise<OrdersResponse> {\n    return this.client.get<OrdersResponse>('https://marketplace-api.wildberries.ru/api/v3/orders', {\n      params: options,\n      rateLimitKey: 'orders-fbs.orders',\n    });\n  }\n\n  /**\n   * Get all assembly tasks requiring reshipment\n   *\n   * Returns all assembly tasks that require reshipment. Reshipment is needed when a supply was scanned\n   * at the reception point but still has unscanned items. These tasks can be moved to another active supply.\n   *\n   * @returns Promise resolving to reshipment orders response\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Sborochnye-zadaniya-FBS/paths/~1api~1v3~1supplies~1orders~1reshipment/get}\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.ordersFBS.getOrdersReshipment();\n   * console.log(result);\n   * ```\n   */\n  async getOrdersReshipment(): Promise<ReshipmentResponse> {\n    return this.client.get<ReshipmentResponse>(\n      'https://marketplace-api.wildberries.ru/api/v3/supplies/orders/reshipment',\n      { rateLimitKey: 'orders-fbs.suppliesOrdersReshipment' }\n    );\n  }\n\n  /**\n   * Cancel an assembly task\n   *\n   * Cancels an assembly task and sets its status to `cancel` (cancelled by seller).\n   *\n   * @param orderId - ID of the assembly task to cancel\n   * @returns Promise resolving to void on success\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Sborochnye-zadaniya-FBS/paths/~1api~1v3~1orders~1%7BorderId%7D~1cancel/patch}\n   *\n   * @example\n   * ```typescript\n   * await sdk.ordersFBS.updateOrdersCancel(123456);\n   * ```\n   */\n  async updateOrdersCancel(orderId: number): Promise<void> {\n    return this.client.patch(\n      `https://marketplace-api.wildberries.ru/api/v3/orders/${orderId}/cancel`,\n      undefined,\n      { rateLimitKey: 'orders-fbs.patchOrdersCancel' }\n    );\n  }\n\n  /**\n   * Get assembly task stickers\n   *\n   * Returns stickers for assembly tasks in SVG, ZPLV, ZPLH, or PNG format.\n   * Maximum 100 stickers per request. Only available for tasks with status `confirm`.\n   *\n   * @param options - Sticker format and size options\n   * @param data - Request body containing order IDs\n   * @returns Promise resolving to stickers response\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Sborochnye-zadaniya-FBS/paths/~1api~1v3~1orders~1stickers/post}\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.ordersFBS.createOrdersSticker(\n   *   { type: 'png', width: 58, height: 40 },\n   *   { orders: [123, 456] },\n   * );\n   * console.log(result.stickers);\n   * ```\n   */\n  async createOrdersSticker(\n    options?: StickerParams,\n    data?: StickerRequest\n  ): Promise<StickerResponse> {\n    return this.client.post<StickerResponse>(\n      'https://marketplace-api.wildberries.ru/api/v3/orders/stickers',\n      data,\n      { params: options, rateLimitKey: 'orders-fbs.postOrdersStickers' }\n    );\n  }\n\n  /**\n   * Delete assembly task metadata\n   *\n   * Deletes a metadata value for the given key. Only one key can be passed per request.\n   * Supported keys: imei, uin, gtin, sgtin.\n   *\n   * @param orderId - ID of the assembly task\n   * @param options - Query parameters specifying which metadata key to delete\n   * @returns Promise resolving to void on success\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Metadannye-FBS/paths/~1api~1v3~1orders~1%7BorderId%7D~1meta/delete}\n   *\n   * @example\n   * ```typescript\n   * await sdk.ordersFBS.deleteOrdersMeta(123456, { key: 'imei' });\n   * ```\n   */\n  async deleteOrdersMeta(orderId: number, options?: DeleteMetaParams): Promise<void> {\n    return this.client.delete(\n      `https://marketplace-api.wildberries.ru/api/v3/orders/${orderId}/meta`,\n      { params: options, rateLimitKey: 'orders-fbs.deleteOrdersMeta' }\n    );\n  }\n\n  /**\n   * Attach marking codes (SGTIN) to an assembly task\n   *\n   * Attaches product marking codes to an assembly task. Only available when the task metadata\n   * includes the `sgtin` field and the task is in `confirm` status.\n   *\n   * @param orderId - ID of the assembly task\n   * @param data - Request body containing SGTIN marking codes\n   * @returns Promise resolving to void on success\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Metadannye-FBS/paths/~1api~1v3~1orders~1%7BorderId%7D~1meta~1sgtin/put}\n   *\n   * @example\n   * ```typescript\n   * await sdk.ordersFBS.updateMetaSgtin(123456, { sgtins: ['01046009544741002'] });\n   * ```\n   */\n  async updateMetaSgtin(orderId: number, data?: MetaSgtinRequest): Promise<void> {\n    return this.client.put(\n      `https://marketplace-api.wildberries.ru/api/v3/orders/${orderId}/meta/sgtin`,\n      data,\n      { rateLimitKey: 'orders-fbs.putOrdersMetaSgtin' }\n    );\n  }\n\n  /**\n   * Attach UIN to an assembly task\n   *\n   * Updates the unique identification number (UIN) in the assembly task metadata.\n   * Each task can have only one UIN. Only available for orders delivered by WB in `confirm` status.\n   *\n   * @param orderId - ID of the assembly task\n   * @param data - Request body containing the UIN value\n   * @returns Promise resolving to void on success\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Metadannye-FBS/paths/~1api~1v3~1orders~1%7BorderId%7D~1meta~1uin/put}\n   *\n   * @example\n   * ```typescript\n   * await sdk.ordersFBS.updateMetaUin(123456, { uin: 'UIN123456789' });\n   * ```\n   */\n  async updateMetaUin(orderId: number, data?: MetaUinRequest): Promise<void> {\n    return this.client.put(\n      `https://marketplace-api.wildberries.ru/api/v3/orders/${orderId}/meta/uin`,\n      data,\n      { rateLimitKey: 'orders-fbs.putOrdersMetaUin' }\n    );\n  }\n\n  /**\n   * Attach IMEI to an assembly task\n   *\n   * Updates the IMEI in the assembly task metadata. Each task can have only one IMEI.\n   * If a device has two IMEIs, only provide the primary one. Only available for orders in `confirm` status.\n   *\n   * @param orderId - ID of the assembly task\n   * @param data - Request body containing the IMEI value\n   * @returns Promise resolving to void on success\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Metadannye-FBS/paths/~1api~1v3~1orders~1%7BorderId%7D~1meta~1imei/put}\n   *\n   * @example\n   * ```typescript\n   * await sdk.ordersFBS.updateMetaImei(123456, { imei: '354567890123456' });\n   * ```\n   */\n  async updateMetaImei(orderId: number, data?: MetaImeiRequest): Promise<void> {\n    return this.client.put(\n      `https://marketplace-api.wildberries.ru/api/v3/orders/${orderId}/meta/imei`,\n      data,\n      { rateLimitKey: 'orders-fbs.putOrdersMetaImei' }\n    );\n  }\n\n  /**\n   * Attach GTIN to an assembly task\n   *\n   * Updates the GTIN (unique product ID for Belarus) in the assembly task metadata.\n   * Each task can have only one GTIN. Only available for orders delivered by WB in `confirm` status.\n   *\n   * @param orderId - ID of the assembly task\n   * @param data - Request body containing the GTIN value\n   * @returns Promise resolving to void on success\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Metadannye-FBS/paths/~1api~1v3~1orders~1%7BorderId%7D~1meta~1gtin/put}\n   *\n   * @example\n   * ```typescript\n   * await sdk.ordersFBS.updateMetaGtin(123456, { gtin: '4600000000001' });\n   * ```\n   */\n  async updateMetaGtin(orderId: number, data?: MetaGtinRequest): Promise<void> {\n    return this.client.put(\n      `https://marketplace-api.wildberries.ru/api/v3/orders/${orderId}/meta/gtin`,\n      data,\n      { rateLimitKey: 'orders-fbs.putOrdersMetaGtin' }\n    );\n  }\n\n  /**\n   * Attach expiration date to an assembly task\n   *\n   * Sets the product expiration date for an assembly task. Only available for orders delivered\n   * by WB in `confirm` status. To change the date, send a new request. Expiration cannot be removed once set.\n   *\n   * @param orderId - ID of the assembly task\n   * @param data - Request body containing the expiration date\n   * @returns Promise resolving to void on success\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Metadannye-FBS/paths/~1api~1v3~1orders~1%7BorderId%7D~1meta~1expiration/put}\n   *\n   * @example\n   * ```typescript\n   * await sdk.ordersFBS.updateMetaExpiration(123456, { expiration: '2025-12-31' });\n   * ```\n   */\n  async updateMetaExpiration(orderId: number, data?: MetaExpirationRequest): Promise<void> {\n    return this.client.put(\n      `https://marketplace-api.wildberries.ru/api/v3/orders/${orderId}/meta/expiration`,\n      data,\n      { rateLimitKey: 'orders-fbs.putOrdersMetaExpiration' }\n    );\n  }\n\n  /**\n   * Attach customs declaration number to an assembly task\n   *\n   * Updates the customs declaration number in the assembly task metadata.\n   * Each task can have only one customs declaration number. Check if the task supports it\n   * by verifying `customsDeclaration` is in the `requiredMeta` field of new orders.\n   *\n   * @param orderId - ID of the assembly task\n   * @param data - Request body containing the customs declaration number\n   * @returns Promise resolving to void on success\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Metadannye-FBS/paths/~1api~1v3~1orders~1%7BorderId%7D~1meta~1customs-declaration/put}\n   *\n   * @example\n   * ```typescript\n   * await sdk.ordersFBS.setCustomsDeclaration(123456, {\n   *   customsDeclaration: '10129050/010120/0001234',\n   * });\n   * ```\n   */\n  async setCustomsDeclaration(orderId: number, data: MetaCustomsDeclarationRequest): Promise<void> {\n    return this.client.put(\n      `https://marketplace-api.wildberries.ru/api/marketplace/v3/orders/${orderId}/meta/customs-declaration`,\n      data,\n      { rateLimitKey: 'orders-fbs.putOrdersMetaCustomsDeclaration' }\n    );\n  }\n\n  /**\n   * Get cross-border assembly task stickers\n   *\n   * Returns stickers for cross-border assembly tasks in PDF format.\n   * Maximum 100 stickers per request. Only available for tasks with status `confirm`.\n   *\n   * @param data - Request body containing order IDs\n   * @returns Promise resolving to cross-border stickers response\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Sborochnye-zadaniya-FBS/paths/~1api~1v3~1orders~1stickers~1cross-border/post}\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.ordersFBS.createStickersCrossBorder({ orders: [123, 456] });\n   * console.log(result.stickers);\n   * ```\n   */\n  async createStickersCrossBorder(\n    data?: CrossBorderStickerRequest\n  ): Promise<CrossBorderStickerResponse> {\n    return this.client.post<CrossBorderStickerResponse>(\n      'https://marketplace-api.wildberries.ru/api/v3/orders/stickers/cross-border',\n      data,\n      { rateLimitKey: 'orders-fbs.postOrdersStickersCrossBorder' }\n    );\n  }\n\n  /**\n   * Get cross-border assembly task status history\n   *\n   * Returns the status history for cross-border assembly tasks.\n   *\n   * @param data - Request body containing order IDs\n   * @returns Promise resolving to status history response\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Sborochnye-zadaniya-FBS/paths/~1api~1v3~1orders~1status~1history/post}\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.ordersFBS.createStatusHistory({ orders: [123, 456] });\n   * console.log(result.orders);\n   * ```\n   */\n  async createStatusHistory(data?: StatusHistoryRequest): Promise<StatusHistoryResponse> {\n    return this.client.post<StatusHistoryResponse>(\n      'https://marketplace-api.wildberries.ru/api/v3/orders/status/history',\n      data,\n      { rateLimitKey: 'orders-fbs.postOrdersStatusHistory' }\n    );\n  }\n\n  /**\n   * Get orders with client information (Turkey cross-border)\n   *\n   * Returns buyer information by assembly task ID. Only available for cross-border orders from Turkey.\n   *\n   * @param data - Request body containing order IDs\n   * @returns Promise resolving to client info response\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Sborochnye-zadaniya-FBS/paths/~1api~1v3~1orders~1client/post}\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.ordersFBS.createOrdersClient({ orders: [123456] });\n   * console.log(result);\n   * ```\n   */\n  async createOrdersClient(data: OrdersRequestAPI): Promise<CrossborderTurkeyClientInfoResp> {\n    return this.client.post<CrossborderTurkeyClientInfoResp>(\n      'https://marketplace-api.wildberries.ru/api/v3/orders/client',\n      data,\n      { rateLimitKey: 'orders-fbs.postOrdersClient' }\n    );\n  }\n\n  /**\n   * Get list of supplies\n   *\n   * Returns a paginated list of supplies.\n   *\n   * @param options - Query parameters for pagination\n   * @returns Promise resolving to supplies list with pagination cursor\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Postavki-FBS/paths/~1api~1v3~1supplies/get}\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.ordersFBS.supplies({ limit: 100, next: 0 });\n   * console.log(result.supplies);\n   * ```\n   */\n  async supplies(options?: GetSuppliesParams): Promise<SuppliesResponse> {\n    return this.client.get<SuppliesResponse>(\n      'https://marketplace-api.wildberries.ru/api/v3/supplies',\n      { params: options, rateLimitKey: 'orders-fbs.supplies' }\n    );\n  }\n\n  /**\n   * Create a new supply\n   *\n   * Creates a new supply for FBS assembly tasks. A new supply acquires the cargo type\n   * of the first order added to it. Only orders of the same cargo type can be in one supply.\n   *\n   * @param data - Request body containing the supply name\n   * @returns Promise resolving to the created supply ID\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Postavki-FBS/paths/~1api~1v3~1supplies/post}\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.ordersFBS.createSupply({ name: 'Supply 2025-01' });\n   * console.log(result.id);\n   * ```\n   */\n  async createSupply(data: SupplyCreateRequest): Promise<SupplyCreateResponse> {\n    return this.client.post<SupplyCreateResponse>(\n      'https://marketplace-api.wildberries.ru/api/v3/supplies',\n      data,\n      { rateLimitKey: 'orders-fbs.postSupplies' }\n    );\n  }\n\n  /**\n   * Get supply information\n   *\n   * Returns detailed information about a supply.\n   *\n   * @param supplyId - ID of the supply\n   * @returns Promise resolving to supply details\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Postavki-FBS/paths/~1api~1v3~1supplies~1%7BsupplyId%7D/get}\n   *\n   * @example\n   * ```typescript\n   * const supply = await sdk.ordersFBS.getSupply('WB-GI-1234');\n   * console.log(supply);\n   * ```\n   */\n  async getSupply(supplyId: string): Promise<Supply> {\n    return this.client.get<Supply>(\n      `https://marketplace-api.wildberries.ru/api/v3/supplies/${supplyId}`,\n      { rateLimitKey: 'orders-fbs.getSupply' }\n    );\n  }\n\n  /**\n   * Delete a supply\n   *\n   * Deletes a supply if it is active and has no assembly tasks assigned.\n   *\n   * @param supplyId - ID of the supply to delete\n   * @returns Promise resolving to void on success\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Postavki-FBS/paths/~1api~1v3~1supplies~1%7BsupplyId%7D/delete}\n   *\n   * @example\n   * ```typescript\n   * await sdk.ordersFBS.deleteSupply('WB-GI-1234');\n   * ```\n   */\n  async deleteSupply(supplyId: string): Promise<void> {\n    return this.client.delete(\n      `https://marketplace-api.wildberries.ru/api/v3/supplies/${supplyId}`,\n      {\n        rateLimitKey: 'orders-fbs.deleteSupplies',\n      }\n    );\n  }\n\n  /**\n   * Transfer supply to delivery\n   *\n   * Closes a supply and sets all assembly tasks in it to `complete` status.\n   * After closing, no new tasks can be added. The supply must have at least one task.\n   *\n   * **⚠️ Deadline 2026-06-03 — B2C marking codes (Честный Знак).** WB will validate B2C\n   * marking codes server-side from this date. Codes must be passed in full with GS\n   * separators (ASCII 0x1D) and crypto-tail (код проверки подлинности). Invalid codes\n   * → HTTP 409 with diagnostic `metaDetails[]` (typed as `MetaValidationFailError`).\n   *\n   * **Important: Metadata validation.** Returns 409 if order metadata is invalid:\n   * - IMEI validation (enforced since March 31, 2026)\n   * - UIN validation (enforced since April 7, 2026)\n   * - Marking code for B2B orders (enforced since April 9, 2026)\n   * - Marking code for B2C orders via Честный Знак (enforced from June 3, 2026)\n   *\n   * Check `metaDetails` via `getOrdersMetaBulk()` before calling deliver.\n   * Each metaDetail has `key`, `value`, and `decision` (filled/optional/required/invalid).\n   *\n   * **Rate limit penalty**: each 409 response counts as 10 requests against the\n   * FBS supply/order rate-limit budget. Use pre-flight validation to avoid burning budget.\n   *\n   * @param supplyId - ID of the supply to deliver\n   * @returns Promise resolving to void on success\n   * @throws {MetaValidationFailError} 409 — Metadata validation failed (thrown as MetaValidationFailError exposes\n   *   `metaDetails[]` with per-code diagnostics). Falls back to {@link WBAPIError} for 409s\n   *   without `metaDetails` (e.g. supply has zero orders).\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/docs/openapi/orders-fbs#tag/Postavki-FBS}\n   * @see [Migration guide](../../../docs/guides/fbs-marking-code-validation.md)\n   *\n   * @example\n   * ```typescript\n   * import { WildberriesSDK, MetaValidationFailError } from 'daytona-wildberries-typescript-sdk';\n   *\n   * // Pattern A: pre-flight via getOrdersMetaBulk (cheap, no 10x penalty)\n   * const meta = await sdk.ordersFBS.getOrdersMetaBulk({ orders: [12345] }); // example order ID\n   * const invalid = meta.orders?.[0]?.metaDetails?.filter(d => d.decision === 'required' || d.decision === 'invalid');\n   * if (invalid?.length) {\n   *   console.log('Fix metadata first:', invalid.map(d => d.key));\n   * } else {\n   *   await sdk.ordersFBS.updateSuppliesDeliver('WB-GI-1234');\n   * }\n   * ```\n   *\n   * @example\n   * ```typescript\n   * import { WildberriesSDK, MetaValidationFailError } from 'daytona-wildberries-typescript-sdk';\n   *\n   * // Pattern B: typed catch\n   * try {\n   *   await sdk.ordersFBS.updateSuppliesDeliver('WB-GI-1234');\n   * } catch (err) {\n   *   if (err instanceof MetaValidationFailError) {\n   *     err.metaDetails.forEach(d => console.log(d.key, d.value, d.decision));\n   *   }\n   *   throw err;\n   * }\n   * ```\n   */\n  async updateSuppliesDeliver(supplyId: string): Promise<void> {\n    return this.client.patch(\n      `https://marketplace-api.wildberries.ru/api/v3/supplies/${supplyId}/deliver`,\n      undefined,\n      { rateLimitKey: 'orders-fbs.patchSuppliesDeliver' }\n    );\n  }\n\n  /**\n   * Get supply QR code\n   *\n   * Returns the supply QR code in SVG, ZPLV, ZPLH, or PNG format (580x400 px).\n   * Only available after the supply has been transferred to delivery.\n   *\n   * @param supplyId - ID of the supply\n   * @param options - Sticker format options\n   * @returns Promise resolving to barcode and file data\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Postavki-FBS/paths/~1api~1v3~1supplies~1%7BsupplyId%7D~1barcode/get}\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.ordersFBS.getSuppliesBarcode('WB-GI-1234', { type: 'png' });\n   * console.log(result.barcode);\n   * ```\n   */\n  async getSuppliesBarcode(supplyId: string, options?: BarcodeParams): Promise<BarcodeResponse> {\n    return this.client.get<BarcodeResponse>(\n      `https://marketplace-api.wildberries.ru/api/v3/supplies/${supplyId}/barcode`,\n      { params: options, rateLimitKey: 'orders-fbs.suppliesBarcode' }\n    );\n  }\n\n  /**\n   * Get list of supply boxes (trbx)\n   *\n   * Returns the list of boxes for a supply.\n   *\n   * @param supplyId - ID of the supply\n   * @returns Promise resolving to boxes list\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Postavki-FBS/paths/~1api~1v3~1supplies~1%7BsupplyId%7D~1trbx/get}\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.ordersFBS.getSuppliesTrbx('WB-GI-1234');\n   * console.log(result.trbxes);\n   * ```\n   */\n  async getSuppliesTrbx(supplyId: string): Promise<TrbxListResponse> {\n    return this.client.get<TrbxListResponse>(\n      `https://marketplace-api.wildberries.ru/api/v3/supplies/${supplyId}/trbx`,\n      { rateLimitKey: 'orders-fbs.suppliesTrbx' }\n    );\n  }\n\n  /**\n   * Add boxes to a supply\n   *\n   * Adds the required number of boxes to a supply. Only for supplies shipped to pickup points (PVZ).\n   * Can only be added to an open supply.\n   *\n   * @param supplyId - ID of the supply\n   * @param data - Request body containing the number of boxes to add\n   * @returns Promise resolving to created box IDs\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Postavki-FBS/paths/~1api~1v3~1supplies~1%7BsupplyId%7D~1trbx/post}\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.ordersFBS.createSuppliesTrbx('WB-GI-1234', { amount: 5 });\n   * console.log(result.trbxIds);\n   * ```\n   */\n  async createSuppliesTrbx(\n    supplyId: string,\n    data?: TrbxCreateRequest\n  ): Promise<TrbxCreateResponse> {\n    return this.client.post<TrbxCreateResponse>(\n      `https://marketplace-api.wildberries.ru/api/v3/supplies/${supplyId}/trbx`,\n      data,\n      { rateLimitKey: 'orders-fbs.postSuppliesTrbx' }\n    );\n  }\n\n  /**\n   * Delete boxes from a supply\n   *\n   * Removes boxes from a supply. Can only delete while the supply is being assembled.\n   *\n   * @param supplyId - ID of the supply\n   * @param data - Request body containing box IDs to delete\n   * @returns Promise resolving to void on success\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Postavki-FBS/paths/~1api~1v3~1supplies~1%7BsupplyId%7D~1trbx/delete}\n   *\n   * @example\n   * ```typescript\n   * await sdk.ordersFBS.deleteSuppliesTrbx('WB-GI-1234', { trbxIds: ['trbx-1', 'trbx-2'] });\n   * ```\n   */\n  async deleteSuppliesTrbx(supplyId: string, data?: TrbxDeleteRequest): Promise<void> {\n    return this.client.delete(\n      `https://marketplace-api.wildberries.ru/api/v3/supplies/${supplyId}/trbx`,\n      data,\n      { rateLimitKey: 'orders-fbs.deleteSuppliesTrbx' }\n    );\n  }\n\n  /**\n   * Get supply box stickers\n   *\n   * Returns QR stickers for boxes in SVG, ZPLV, ZPLH, or PNG format (580x400 px).\n   *\n   * @param supplyId - ID of the supply\n   * @param options - Sticker format options\n   * @param data - Request body containing box IDs\n   * @returns Promise resolving to box stickers\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Postavki-FBS/paths/~1api~1v3~1supplies~1%7BsupplyId%7D~1trbx~1stickers/post}\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.ordersFBS.createTrbxSticker(\n   *   'WB-GI-1234',\n   *   { type: 'png' },\n   *   { trbxIds: ['trbx-1', 'trbx-2'] },\n   * );\n   * console.log(result.stickers);\n   * ```\n   */\n  async createTrbxSticker(\n    supplyId: string,\n    options?: BarcodeParams,\n    data?: TrbxStickerRequest\n  ): Promise<{ stickers?: TrbxStickers[] }> {\n    return this.client.post<{ stickers?: TrbxStickers[] }>(\n      `https://marketplace-api.wildberries.ru/api/v3/supplies/${supplyId}/trbx/stickers`,\n      data,\n      { params: options, rateLimitKey: 'orders-fbs.postSuppliesTrbxStickers' }\n    );\n  }\n\n  // ============================================================================\n  // New bulk/replacement methods\n  // ============================================================================\n\n  /**\n   * Get assembly task statuses\n   *\n   * Returns statuses of assembly tasks by their IDs.\n   * Replacement for the deprecated createOrdersStatus method with a corrected name.\n   *\n   * @param data - Request body containing order IDs\n   * @returns Promise resolving to order statuses\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Sborochnye-zadaniya-FBS/paths/~1api~1v3~1orders~1status/post}\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.ordersFBS.getOrderStatuses({ orders: [123, 456] });\n   * console.log(result);\n   * ```\n   */\n  async getOrderStatuses(data: { orders: number[] }): Promise<OrderStatusResponse> {\n    return this.client.post<OrderStatusResponse>(\n      'https://marketplace-api.wildberries.ru/api/v3/orders/status',\n      data,\n      { rateLimitKey: 'orders-fbs.postOrdersStatus' }\n    );\n  }\n\n  /**\n   * Get metadata for multiple assembly tasks\n   *\n   * Returns metadata for multiple assembly tasks (up to 100).\n   *\n   * @param data - Request body containing order IDs (max 100)\n   * @returns Promise resolving to metadata for the requested orders\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Metadannye-FBS/paths/~1api~1marketplace~1v3~1orders~1meta/post}\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.ordersFBS.getOrdersMetaBulk({ orders: [123, 456] });\n   * console.log(result);\n   * ```\n   */\n  async getOrdersMetaBulk(data: GetMetaMultiRequest): Promise<OrdersMetaResponse> {\n    return this.client.post<OrdersMetaResponse>(\n      'https://marketplace-api.wildberries.ru/api/marketplace/v3/orders/meta',\n      data,\n      { rateLimitKey: 'orders-fbs.postMarketplaceOrdersMeta' }\n    );\n  }\n\n  /**\n   * Add multiple assembly tasks to a supply (bulk)\n   *\n   * Adds multiple assembly tasks to a supply in a single request.\n   *\n   * @param supplyId - ID of the supply\n   * @param data - Request body containing order IDs to add\n   * @returns Promise resolving to void on success\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Postavki-FBS/paths/~1api~1marketplace~1v3~1supplies~1%7BsupplyId%7D~1orders/patch}\n   *\n   * @example\n   * ```typescript\n   * await sdk.ordersFBS.addOrdersToSupply('WB-GI-1234', { orders: [123, 456] });\n   * ```\n   */\n  async addOrdersToSupply(supplyId: string, data: AddOrdersToSupplyRequest): Promise<void> {\n    return this.client.patch(\n      `https://marketplace-api.wildberries.ru/api/marketplace/v3/supplies/${supplyId}/orders`,\n      data,\n      { rateLimitKey: 'orders-fbs.patchMarketplaceSuppliesOrders' }\n    );\n  }\n\n  /**\n   * Get assembly task IDs in a supply\n   *\n   * Returns a list of assembly task IDs assigned to a supply.\n   *\n   * @param supplyId - ID of the supply\n   * @returns Promise resolving to order IDs in the supply\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://openapi.wildberries.ru/#tag/Postavki-FBS/paths/~1api~1marketplace~1v3~1supplies~1%7BsupplyId%7D~1order-ids/get}\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.ordersFBS.getSupplyOrderIds('WB-GI-1234');\n   * console.log(result);\n   * ```\n   */\n  async getSupplyOrderIds(supplyId: string): Promise<SupplyOrderIdsResponse> {\n    return this.client.get<SupplyOrderIdsResponse>(\n      `https://marketplace-api.wildberries.ru/api/marketplace/v3/supplies/${supplyId}/order-ids`,\n      { rateLimitKey: 'orders-fbs.getMarketplaceSuppliesOrderIds' }\n    );\n  }\n}\n","/**\n * Orders FBW Module\n *\n * Manages Fulfillment by Wildberries (FBW) supply operations including\n * acceptance coefficients, warehouse info, transit tariffs, and supply management.\n *\n * Generated from: wildberries_api_doc/07-orders-fbw.yaml\n *\n * @module modules/orders-fbw\n */\n\nimport { BaseClient } from '../../client/base-client';\nimport { ValidationError } from '../../errors/validation-error';\nimport type {\n  BulkStatusChangeResponse,\n  DBWCheckMetaValidationRequest,\n  DBWCheckMetaValidationResponse,\n  DBWDeleteMetaBulkRequest,\n  DBWDeleteMetaBulkResponse,\n  DBWSetMetaBulkResponse,\n  DBWSetSgtinBulkRequest,\n  GetDBWClientInfoResponse,\n  ModelsBox,\n  ModelsGood,\n  ModelsGoodInSupply,\n  ModelsOptionsResultModel,\n  ModelsSuppliesFiltersRequest,\n  ModelsSupply,\n  ModelsSupplyDetails,\n  ModelsTransitTariff,\n  ModelsWarehousesResultItems,\n} from '../../types/orders-fbw.types';\n\nexport class OrdersFbwModule {\n  constructor(private client: BaseClient) {}\n\n  /**\n   * Опции приёмки\n   *\n   * Метод возвращает информацию о том, какие склады и типы упаковки доступны для поставки. Список складов определяется по баркоду и количеству товара. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 минута | 6 запросов | 10 секунд | 6 запросов | </div>\n   *\n   * @param data - Request body data\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.ordersFBW.createAcceptanceOption([{ barcode: '1234567891234', quantity: 10 }]);\n  console.log(result);\n   */\n  async createAcceptanceOption(\n    data: ModelsGood[],\n    options?: { warehouseID?: string }\n  ): Promise<ModelsOptionsResultModel> {\n    return this.client.post<ModelsOptionsResultModel>(\n      'https://supplies-api.wildberries.ru/api/v1/acceptance/options',\n      data,\n      { params: options, rateLimitKey: 'orders-fbw.postAcceptanceOptions' }\n    );\n  }\n\n  /**\n   * Список складов\n   *\n   * Метод возвращает список складов WB. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 минута | 6 запросов | 10 секунд | 6 запросов | </div>\n   *\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.ordersFBW.warehouses();\n  console.log(result);\n   */\n  async warehouses(): Promise<ModelsWarehousesResultItems[]> {\n    return this.client.get<ModelsWarehousesResultItems[]>(\n      'https://supplies-api.wildberries.ru/api/v1/warehouses',\n      { rateLimitKey: 'orders-fbw.warehouses' }\n    );\n  }\n\n  /**\n   * Транзитные направления\n   *\n   * Метод возвращает информацию о доступных транзитных направлениях. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 минута | 6 запросов | 10 секунд | 10 запросов | </div>\n   *\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.ordersFBW.transitTariffs();\n  console.log(result);\n   */\n  async transitTariffs(): Promise<ModelsTransitTariff[]> {\n    return this.client.get<ModelsTransitTariff[]>(\n      'https://supplies-api.wildberries.ru/api/v1/transit-tariffs',\n      { rateLimitKey: 'orders-fbw.transitTariffs' }\n    );\n  }\n\n  /**\n   * Список поставок\n   *\n   * Метод возвращает список поставок, по умолчанию — последние 1000 поставок. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 минута | 30 запросов | 2 секунды | 10 запросов | </div>\n   *\n   * @param data - Request body data\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.ordersFBW.listSupplies({});\n  console.log(result);\n   */\n  async listSupplies(\n    data: ModelsSuppliesFiltersRequest,\n    options?: { limit?: number; offset?: number }\n  ): Promise<ModelsSupply[]> {\n    return this.client.post<ModelsSupply[]>(\n      'https://supplies-api.wildberries.ru/api/v1/supplies',\n      data,\n      { params: options, rateLimitKey: 'orders-fbw.postSupplies' }\n    );\n  }\n\n  /**\n   * Детали поставки\n   *\n   * Метод возвращает детали поставки по ID. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 минута | 30 запросов | 2 секунды | 10 запросов | </div>\n   *\n   * @param ID - ID поставки или заказа\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.ordersFBW.getSupply(12345);\n  console.log(result);\n   */\n  async getSupply(ID: number, options?: { isPreorderID?: boolean }): Promise<ModelsSupplyDetails> {\n    return this.client.get<ModelsSupplyDetails>(\n      `https://supplies-api.wildberries.ru/api/v1/supplies/${ID}`,\n      { params: options, rateLimitKey: 'orders-fbw.supplies' }\n    );\n  }\n\n  /**\n   * Товары поставки\n   *\n   * Метод возвращает информацию о товарах в поставке. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 минута | 30 запросов | 2 секунды | 10 запросов | </div>\n   *\n   * @param ID - ID поставки или заказа\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.ordersFBW.getSuppliesGood(12345);\n  console.log(result);\n   */\n  async getSuppliesGood(\n    ID: number,\n    options?: { limit?: number; offset?: number; isPreorderID?: boolean }\n  ): Promise<ModelsGoodInSupply[]> {\n    return this.client.get<ModelsGoodInSupply[]>(\n      `https://supplies-api.wildberries.ru/api/v1/supplies/${ID}/goods`,\n      { params: options, rateLimitKey: 'orders-fbw.suppliesGoods' }\n    );\n  }\n\n  /**\n   * Упаковка поставки\n   *\n   * Метод возвращает информацию об упаковке поставки. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 минута | 30 запросов | 2 секунды | 10 запросов | </div>\n   *\n   * @param ID - ID поставки\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.ordersFBW.getSuppliesPackage(12345);\n  console.log(result);\n   */\n  async getSuppliesPackage(ID: number): Promise<ModelsBox[]> {\n    return this.client.get<ModelsBox[]>(\n      `https://supplies-api.wildberries.ru/api/v1/supplies/${ID}/package`,\n      { rateLimitKey: 'orders-fbw.suppliesPackage' }\n    );\n  }\n\n  /**\n   * Получение информации о покупателе для заказов DBW\n   *\n   * Возвращает данные покупателя (имя, телефон, код) по ID заказов модели DBW.\n   *\n   * **Важно:** Этот метод использует домен `marketplace-api.wildberries.ru`,\n   * а не `supplies-api.wildberries.ru` как остальные методы FBW.\n   *\n   * Rate limit: 300 requests per minute, 200ms interval, burst 20.\n   * Один запрос с кодом 409 считается за 10 запросов.\n   *\n   * @param orderIds - Array of assembly order IDs (no documented max limit)\n   * @returns Buyer information for each order\n   * @throws {ValidationError} When orderIds array is empty\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {NetworkError} When network request fails or times out\n   * @since 3.4.0\n   * @see {@link https://dev.wildberries.ru/docs/openapi/orders-dbw#tag/Sborochnye-zadaniya-DBW}\n   * @example\n   * ```typescript\n   * const result = await sdk.ordersFBW.getClientInfo([987654321, 123456789]);\n   * for (const order of result.orders ?? []) {\n   *   console.log(`Order ${order.orderID}: ${order.firstName}, phone: +${order.phoneCode}${order.phone}`);\n   * }\n   * ```\n   */\n  async getClientInfo(orderIds: number[]): Promise<GetDBWClientInfoResponse> {\n    if (orderIds.length === 0) {\n      throw new ValidationError('orderIds array cannot be empty');\n    }\n    return this.client.post<GetDBWClientInfoResponse>(\n      'https://marketplace-api.wildberries.ru/api/marketplace/v3/dbw/orders/client',\n      { orders: orderIds },\n      { rateLimitKey: 'orders-fbw.getClientInfo' }\n    );\n  }\n\n  /**\n   * Удалить маркировочные метаданные у нескольких заказов DBW (массовая операция).\n   *\n   * Bulk-delete marking metadata (IMEI/UIN/GTIN/SGTIN/customsDeclaration) from up to\n   * N DBW orders in a single request. Mirrors the DBS `deleteMetaBulk` method.\n   *\n   * Rate limit: 150 requests/min, 400ms interval, burst 20.\n   * (Default mirrors DBS sibling — WB has not yet published explicit DBW limits.\n   * Will be updated via task-15.5 once WB publishes 07-orders-fbw.yaml.)\n   *\n   * @param request - Orders array and metadata key to delete\n   * @returns Per-order deletion results\n   * @throws {ValidationError} When orders array is empty\n   * @throws {ValidationError} When request body is malformed\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {NetworkError} When network request fails or times out\n   * @since 3.11.0\n   * @see {@link https://dev.wildberries.ru/openapi/orders-dbw}\n   * @example\n   * ```typescript\n   * const result = await sdk.ordersFBW.deleteMetaBulk({ orders: [123456], key: 'imei' });\n   * for (const order of result.orders) {\n   *   console.log(`Order ${order.orderId}: ${order.success ? 'deleted' : order.error}`);\n   * }\n   * ```\n   */\n  async deleteMetaBulk(request: DBWDeleteMetaBulkRequest): Promise<DBWDeleteMetaBulkResponse> {\n    if (request.orders.length === 0) {\n      throw new ValidationError('orders array cannot be empty');\n    }\n    // Alt path observed in announcement: /api/v3/public/dbw/orders/meta/delete — flip if WB swagger says so\n    return this.client.post<DBWDeleteMetaBulkResponse>(\n      'https://marketplace-api.wildberries.ru/api/marketplace/v3/dbw/orders/meta/delete',\n      request,\n      { rateLimitKey: 'orders-fbw.deleteMetaBulkDBW' }\n    );\n  }\n\n  /**\n   * Задать SGTIN-коды для нескольких заказов DBW (массовая операция).\n   *\n   * Bulk-assign SGTIN (Serial Global Trade Item Number) codes to up to N DBW orders\n   * in a single request. Mirrors the DBS `setSgtinBulk` method.\n   *\n   * Rate limit: 500 requests/min, 120ms interval, burst 20.\n   * (Default mirrors DBS sibling — WB has not yet published explicit DBW limits.\n   * Will be updated via task-15.5 once WB publishes 07-orders-fbw.yaml.)\n   *\n   * @param request - Per-order SGTIN assignments\n   * @returns Per-order set results; `errors[]` present when some orders fail\n   * @throws {ValidationError} When orders array is empty\n   * @throws {ValidationError} When request body is malformed\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {NetworkError} When network request fails or times out\n   * @since 3.11.0\n   * @see {@link https://dev.wildberries.ru/openapi/orders-dbw}\n   * @example\n   * ```typescript\n   * const result = await sdk.ordersFBW.setSgtinBulk({\n   *   orders: [{ orderId: 123456, sgtins: ['1234567890123456'] }],\n   * });\n   * if (result.errors?.length) {\n   *   console.log('Some orders failed:', result.errors);\n   * }\n   * ```\n   */\n  async setSgtinBulk(request: DBWSetSgtinBulkRequest): Promise<DBWSetMetaBulkResponse> {\n    if (request.orders.length === 0) {\n      throw new ValidationError('orders array cannot be empty');\n    }\n    // Alt path observed in announcement: /api/v3/public/dbw/orders/meta/sgtin — flip if WB swagger says so\n    return this.client.post<DBWSetMetaBulkResponse>(\n      'https://marketplace-api.wildberries.ru/api/marketplace/v3/dbw/orders/meta/sgtin',\n      request,\n      { rateLimitKey: 'orders-fbw.setSgtinBulkDBW' }\n    );\n  }\n\n  /**\n   * Передать несколько заказов DBW в доставку (массовая операция).\n   *\n   * Mark up to 1000 DBW orders as \"delivered\" (handed to carrier) in a single request.\n   * Mirrors the DBS `deliverBulk` method. WB disables the legacy single-order DBW\n   * deliver endpoint on 2026-06-05 — use this method instead.\n   *\n   * **Important:** Orders requiring IMEI/SGTIN must have metadata attached before calling\n   * this method. If metadata is missing, WB returns 409 `MetaValidationFail`.\n   *\n   * Rate limit: 300 requests/min, 200ms interval, burst 20.\n   * (Default mirrors DBS sibling — WB has not yet published explicit DBW limits.\n   * Will be updated via task-15.5 once WB publishes 07-orders-fbw.yaml.)\n   *\n   * @param orderIds - Array of order IDs to mark as delivered (1–1000 items)\n   * @returns Per-order delivery status results. When WB returns application-level 409\n   *   MetaValidationFail, it surfaces in `result.results[].errors[]` with `code === 409`\n   *   and `detail === 'MetaValidationFail'`; check `result.results[].errors[].metaDetails[]`\n   *   per-order before retrying. (since 3.11.0 — WB API 2026-05-06)\n   * @throws {ValidationError} When orderIds is empty or exceeds 1000 items\n   * @throws {WBAPIError} 409 — ImeiIsNotFilled: mandatory IMEI not attached to order\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {NetworkError} When network request fails or times out\n   * @since 3.11.0\n   * @see {@link https://dev.wildberries.ru/openapi/orders-dbw}\n   * @example\n   * ```typescript\n   * // Mark multiple DBW orders as handed to carrier\n   * const result = await sdk.ordersFBW.deliverBulk([123456, 234567, 345678]);\n   *\n   * for (const order of result.results ?? []) {\n   *   if (order.isError) {\n   *     console.log(`Order ${order.orderId} failed:`, order.errors);\n   *   } else {\n   *     console.log(`Order ${order.orderId} marked as delivered`);\n   *   }\n   * }\n   * ```\n   */\n  async deliverBulk(orderIds: number[]): Promise<BulkStatusChangeResponse> {\n    if (orderIds.length === 0) {\n      throw new ValidationError('orderIds array cannot be empty');\n    }\n    if (orderIds.length > 1000) {\n      throw new ValidationError('orderIds array cannot exceed 1000 items');\n    }\n    // Alt path observed in announcement: /api/v3/public/dbw/orders/status/deliver — flip if WB swagger says so\n    return this.client.post<BulkStatusChangeResponse>(\n      'https://marketplace-api.wildberries.ru/api/marketplace/v3/dbw/orders/status/deliver',\n      { orders: orderIds },\n      { rateLimitKey: 'orders-fbw.deliverBulkDBW' }\n    );\n  }\n\n  /**\n   * Проверить метаданные маркировки DBW-заказов перед передачей в доставку (предварительная валидация).\n   *\n   * Pre-flight metadata validator for DBW orders. Returns the same `metaDetails[]` shape\n   * that WB returns inside the 409 `MetaValidationFail` body of `deliverBulk()`, but as a\n   * 200 OK response — without consuming a deliver-bulk quota attempt.\n   *\n   * **This method does NOT change order state.** It is a read-only pre-flight check.\n   * Use it before `deliverBulk()` to identify orders with invalid marking metadata\n   * (SGTIN/IMEI/UIN/etc.) so they can be fixed in advance, avoiding the guess-and-retry\n   * loop of: call `deliverBulk()` → catch 409 → read `metaDetails[]` → fix → retry.\n   *\n   * Rate limit: 300 requests/min, 200ms interval, burst 20.\n   * (Default mirrors `deliverBulk` DBW — WB has not yet published explicit limits.\n   * Will be updated via task-15.5 once WB publishes 07-orders-fbw.yaml.)\n   *\n   * @param request - Request containing array of DBW order IDs to validate (1–1000 items)\n   * @returns Per-order metadata validation results in `metaDetails[]`\n   * @throws {ValidationError} When `orders` array is empty\n   * @throws {ValidationError} When `orders` array exceeds 1000 items\n   * @throws {ValidationError} When request body is malformed (4xx propagation)\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {NetworkError} When network request fails or times out\n   * @since 3.11.0\n   * @see {@link https://dev.wildberries.ru/openapi/orders-dbw}\n   * @example\n   * ```typescript\n   * // Pre-flight pattern: validate → fix → deliver\n   * const validation = await sdk.ordersFBW.checkMetaValidation({\n   *   orders: [123456, 234567, 345678],\n   * });\n   *\n   * const invalidOrders = validation.metaDetails.filter(d => d.status === 'invalid');\n   * if (invalidOrders.length > 0) {\n   *   console.log('Orders with invalid metadata:', invalidOrders);\n   *   // Fix metadata for invalid orders first (narrow orderId: number | undefined → number):\n   *   const fixable = invalidOrders.filter(\n   *     (o): o is typeof o & { orderId: number } => o.orderId !== undefined\n   *   );\n   *   await sdk.ordersFBW.setSgtinBulk({\n   *     orders: fixable.map(o => ({ orderId: o.orderId, sgtins: ['correct-sgtin'] })),\n   *   });\n   * }\n   *\n   * // Now safe to deliver — no 409 MetaValidationFail expected\n   * const result = await sdk.ordersFBW.deliverBulk([123456, 234567, 345678]);\n   * ```\n   */\n  async checkMetaValidation(\n    request: DBWCheckMetaValidationRequest\n  ): Promise<DBWCheckMetaValidationResponse> {\n    if (request.orders.length === 0) {\n      throw new ValidationError('orders array cannot be empty');\n    }\n    if (request.orders.length > 1000) {\n      throw new ValidationError('orders array cannot exceed 1000 items');\n    }\n    return this.client.post<DBWCheckMetaValidationResponse>(\n      'https://marketplace-api.wildberries.ru/api/marketplace/v3/dbw/orders/meta/details',\n      { orders: request.orders },\n      { rateLimitKey: 'orders-fbw.checkMetaValidationDBW' }\n    );\n  }\n}\n","/**\n * Auto-generated module\n * Generated from: wildberries_api_doc/13-finances.yaml\n * DO NOT EDIT MANUALLY - Changes will be overwritten on next generation\n */\n\n/* eslint-disable @typescript-eslint/no-deprecated -- This module imports, defines, and re-exports\n   DetailReportItem and getSupplierReportDetailByPeriod(), which are deprecated per Sprint 10 task-103.\n   Self-references to deprecated symbols are unavoidable here — consumers will see the deprecation\n   warnings when THEY import or call these. The method remains functional until 2026-07-15. */\n\nimport { BaseClient } from '../../client/base-client';\nimport { warnOnce } from '../../utils/deprecation';\nimport type {\n  AccountBalanceResponse,\n  DetailReportItem,\n  DocumentsLocale,\n  GetCategories,\n  GetDoc,\n  GetDocs,\n  GetList,\n  RequestDownload,\n  SalesReportListRequest,\n  SalesReportListItem,\n  SalesReportDetailedRequest,\n  SalesReportDetailedByIdRequest,\n  SalesReportDetailedItem,\n  AcquiringReportListRequest,\n  AcquiringReportListItem,\n  AcquiringReportDetailedRequest,\n  AcquiringReportDetailedByIdRequest,\n  AcquiringReportDetailedItem,\n} from '../../types/finances.types';\n\nexport class FinancesModule {\n  constructor(private client: BaseClient) {}\n\n  /**\n   * Получить баланс продавца\n   *\n   * Метод возвращает данные виджета баланса на [главной странице](https://seller.wildberries.ru) портала продавцов. <br><br> <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 минута | 1 запрос | 1 минута | 1 запрос | </div>\n   *\n   * @returns Account balance data including currency, current balance, and available withdrawal amount\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/financial-reports-and-accounting#tag/Balans}\n   * @example\n   * ```typescript\n   * const result = await sdk.finances.getAccountBalance();\n   * console.log(result);\n   * ```\n   */\n  async getAccountBalance(): Promise<AccountBalanceResponse> {\n    return this.client.get<AccountBalanceResponse>(\n      'https://finance-api.wildberries.ru/api/v1/account/balance',\n      { rateLimitKey: 'finances.accountBalance' }\n    );\n  }\n\n  /**\n   * Отчёт о продажах по реализации (v5, **deprecated**)\n   *\n   * @deprecated **This method will be disabled by Wildberries on 2026-07-15.**\n   * Migrate to {@link getSalesReportsDetailed} (v1) before that date.\n   *\n   * **Key migration differences (v5 → v1)**:\n   * - HTTP method: GET → POST\n   * - Field names: `snake_case` → `camelCase` (e.g., `ppvz_for_pay` → `forPay`)\n   * - Money amounts: `number` → `string` (use `parseMoneyAmount()` helper)\n   * - Domain: `statistics-api.wildberries.ru` → `finance-api.wildberries.ru`\n   * - New `fields[]` parameter for selective field loading\n   *\n   * See the [migration guide](https://salacoste.github.io/daytona-wildberries-typescript-sdk/guides/migration-finance-reports-v5-to-v1)\n   * for complete field mapping and code examples.\n   *\n   * Метод возвращает детализации к [отчётам реализации](https://seller.wildberries.ru/suppliers-mutual-settlements). <br><br> Данные доступны с 29 января 2024 года. <div class=\"description_important\"> Вы можете выгрузить данные в <a href=\"https://dev.wildberries.ru/ru/cases/1\">Google Таблицы</a> </div> <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 минута | 1 запрос | 1 минута | 1 запрос | </div>\n   *\n   * @param options - Query parameters including required dateFrom and dateTo\n   * @returns Array of detailed report items for the specified period\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/financial-reports-and-accounting#tag/Finansovye-otchyoty}\n   * @example\n   * ```typescript\n   * // DEPRECATED — migrate to getSalesReportsDetailed() before 2026-07-15\n   * const result = await sdk.finances.getSupplierReportDetailByPeriod({\n   *   dateFrom: '2024-01-01',\n   *   dateTo: '2024-01-31',\n   *   period: 'weekly',\n   * });\n   * console.log(result);\n   * ```\n   */\n  async getSupplierReportDetailByPeriod(options: {\n    dateFrom: string;\n    dateTo: string;\n    limit?: number;\n    rrdid?: number;\n    period?: 'weekly' | 'daily';\n  }): Promise<DetailReportItem[]> {\n    warnOnce(\n      'FinancesModule.getSupplierReportDetailByPeriod',\n      '[DEPRECATED] getSupplierReportDetailByPeriod() is deprecated and will be removed after 2026-07-15. ' +\n        'Migrate to getSalesReportsDetailed(). See migration guide: ' +\n        'https://salacoste.github.io/daytona-wildberries-typescript-sdk/guides/migration-finance-reports-v5-to-v1'\n    );\n    return this.client.get<DetailReportItem[]>(\n      'https://statistics-api.wildberries.ru/api/v5/supplier/reportDetailByPeriod',\n      { params: options, rateLimitKey: 'finances.supplierReportDetailByPeriod' }\n    );\n  }\n\n  /**\n   * Категории документов\n   *\n   * Метод возвращает категории документов для получения [списка документов продавца](/openapi/financial-reports-and-accounting#tag/Dokumenty/paths/~1api~1v1~1documents~1list/get). <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 10 секунд | 1 запрос | 10 секунд | 5 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns List of document categories available for the seller\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/financial-reports-and-accounting#tag/Dokumenty}\n   * @example\n   * ```typescript\n   * const result = await sdk.finances.getDocumentsCategories({ locale: 'ru' });\n   * console.log(result);\n   * ```\n   */\n  async getDocumentsCategories(options?: { locale?: DocumentsLocale }): Promise<GetCategories> {\n    return this.client.get<GetCategories>(\n      'https://documents-api.wildberries.ru/api/v1/documents/categories',\n      { params: options, rateLimitKey: 'finances.documentsCategories' }\n    );\n  }\n\n  /**\n   * Список документов\n   *\n   * Метод возвращает список документов продавца. Вы можете получить [один](/openapi/financial-reports-and-accounting#tag/Dokumenty/paths/~1api~1v1~1documents~1download/get) или [несколько](/openapi/financial-reports-and-accounting#tag/Dokumenty/paths/~1api~1v1~1documents~1download~1all/post) документов из полученного списка. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 10 секунд | 1 запрос | 10 секунд | 5 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Paginated list of seller documents with metadata\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @remarks The `sort` and `order` parameters work together — specifying `order` without `sort` has no effect. The `beginTime` and `endTime` parameters define a date range and should be used as a pair.\n   * @see {@link https://dev.wildberries.ru/openapi/financial-reports-and-accounting#tag/Dokumenty}\n   * @example\n   * ```typescript\n   * const result = await sdk.finances.getDocumentsList({\n   *   locale: 'ru',\n   *   sort: 'date',\n   *   order: 'desc',\n   * });\n   * console.log(result);\n   * ```\n   */\n  async getDocumentsList(options?: {\n    locale?: DocumentsLocale;\n    beginTime?: string;\n    endTime?: string;\n    sort?: 'date' | 'category';\n    order?: 'desc' | 'asc';\n    category?: string;\n    serviceName?: string;\n    limit?: number;\n    offset?: number;\n  }): Promise<GetList> {\n    return this.client.get<GetList>('https://documents-api.wildberries.ru/api/v1/documents/list', {\n      params: options,\n      rateLimitKey: 'finances.documentsList',\n    });\n  }\n\n  /**\n   * Получить документ\n   *\n   * Метод загружает один документ из [списка документов продавца](/openapi/financial-reports-and-accounting#tag/Dokumenty/paths/~1api~1v1~1documents~1list/get). <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 10 секунд | 1 запрос | 10 секунд | 5 запросов | </div>\n   *\n   * @param options - Query parameters including required serviceName and extension\n   * @returns Document file data for the requested document\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/financial-reports-and-accounting#tag/Dokumenty}\n   * @example\n   * ```typescript\n   * const result = await sdk.finances.getDocumentsDownload({\n   *   serviceName: 'act',\n   *   extension: 'pdf',\n   * });\n   * console.log(result);\n   * ```\n   */\n  async getDocumentsDownload(options: { serviceName: string; extension: string }): Promise<GetDoc> {\n    return this.client.get<GetDoc>(\n      'https://documents-api.wildberries.ru/api/v1/documents/download',\n      { params: options, rateLimitKey: 'finances.documentsDownload' }\n    );\n  }\n\n  /**\n   * Получить документы\n   *\n   * Метод загружает несколько документов из [списка документов продавца](/openapi/financial-reports-and-accounting#tag/Dokumenty/paths/~1api~1v1~1documents~1list/get). <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 5 минут | 1 запрос | 5 минут | 5 запросов | </div>\n   *\n   * @param [data] - Request body data\n   * @returns Download details for the requested batch of documents\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/financial-reports-and-accounting#tag/Dokumenty}\n   * @example\n   * ```typescript\n   * const result = await sdk.finances.createDownloadAll({\n   *   serviceNames: ['act', 'invoice'],\n   * });\n   * console.log(result);\n   * ```\n   */\n  async createDownloadAll(data?: RequestDownload): Promise<GetDocs> {\n    return this.client.post<GetDocs>(\n      'https://documents-api.wildberries.ru/api/v1/documents/download/all',\n      data,\n      { rateLimitKey: 'finances.createDownloadAll' }\n    );\n  }\n\n  // ==========================================================================\n  // v1 Sales Reports (since v3.7.0)\n  // Replaces deprecated GET /api/v5/supplier/reportDetailByPeriod (disabled 2026-07-15)\n  // All money amounts are string (not number) — use parseMoneyAmount() helper for math.\n  // ==========================================================================\n\n  /**\n   * Список отчётов реализации (v1)\n   *\n   * Returns list of sales reports by report format. Data available from 2025-01-01.\n   *\n   * **Available token types**: Personal, Service (NOT Basic or Test)\n   *\n   * Rate limit: 1 req/min, 1 minute interval, burst 1\n   *\n   * @param data - Request body with dateFrom, dateTo, limit, offset, period\n   * @returns Array of SalesReportListItem (money sums as string — use parseMoneyAmount helper)\n   * @throws {AuthenticationError} When token type is Basic or Test — this endpoint requires Personal or Service token (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/docs/openapi/financial-reports-and-accounting#tag/Finansovye-otchyoty/operation/postV1SalesReportsList}\n   * @since v3.7.0\n   * @example\n   * ```typescript\n   * import { parseMoneyAmount } from 'daytona-wildberries-typescript-sdk';\n   *\n   * const reports = await sdk.finances.getSalesReportsList({\n   *   dateFrom: '2026-03-17',\n   *   dateTo: '2026-03-20',\n   *   period: 'weekly',\n   * });\n   * console.log(parseMoneyAmount(reports[0].forPaySum));\n   * ```\n   */\n  async getSalesReportsList(data: SalesReportListRequest): Promise<SalesReportListItem[]> {\n    return this.client.post<SalesReportListItem[]>(\n      'https://finance-api.wildberries.ru/api/finance/v1/sales-reports/list',\n      data,\n      { rateLimitKey: 'finances.salesReportsList' }\n    );\n  }\n\n  /**\n   * Детализации к отчётам реализации за период (v1)\n   *\n   * Returns detailed rows for sales reports within a date range. Replaces the deprecated v5 method.\n   * Data available from 2024-01-29. Supports selective field loading via `fields` parameter.\n   *\n   * **Available token types**: Personal, Service (NOT Basic or Test)\n   *\n   * Rate limit: 1 req/min, 1 minute interval, burst 1\n   *\n   * @param data - Request body with dateFrom, dateTo, limit, rrdId, period, fields\n   * @returns Array of SalesReportDetailedItem (~70 fields, money amounts as string — use parseMoneyAmount)\n   * @throws {AuthenticationError} When token type is Basic or Test — this endpoint requires Personal or Service token (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/docs/openapi/financial-reports-and-accounting#tag/Finansovye-otchyoty/operation/postV1SalesReportsDetailed}\n   * @since v3.7.0\n   * @example\n   * ```typescript\n   * import { parseMoneyAmount } from 'daytona-wildberries-typescript-sdk';\n   *\n   * const rows = await sdk.finances.getSalesReportsDetailed({\n   *   dateFrom: '2026-03-17',\n   *   dateTo: '2026-03-20',\n   *   limit: 100000,\n   *   rrdId: 0,\n   *   fields: ['rrdId', 'nmId', 'forPay'],  // Optional: load only specific fields\n   * });\n   * const totalPayout = rows.reduce((sum, r) => sum + parseMoneyAmount(r.forPay), 0);\n   * ```\n   */\n  async getSalesReportsDetailed(\n    data: SalesReportDetailedRequest\n  ): Promise<SalesReportDetailedItem[]> {\n    return this.client.post<SalesReportDetailedItem[]>(\n      'https://finance-api.wildberries.ru/api/finance/v1/sales-reports/detailed',\n      data,\n      { rateLimitKey: 'finances.salesReportsDetailed' }\n    );\n  }\n\n  /**\n   * Детализации к отчётам реализации по ID отчёта (v1)\n   *\n   * Returns detailed rows for a specific report by its ID. Data available from 2025-01-01.\n   *\n   * **BigInt precision note**: For daily reports, `reportId` may exceed `Number.MAX_SAFE_INTEGER` (2^53).\n   * If you obtained the ID from `getSalesReportsList()` response (which returns `number`),\n   * standard JSON parsing may already have truncated precision. For precision-safe handling,\n   * fetch the ID via a custom BigInt-aware parser and pass it as `bigint` or `string`.\n   *\n   * **Available token types**: Personal, Service (NOT Basic or Test)\n   *\n   * Rate limit: 1 req/min, 1 minute interval, burst 1\n   *\n   * @param reportId - Report ID (number for typical use, bigint/string for BigInt precision on daily reports)\n   * @param data - Request body with optional limit, rrdId, fields\n   * @returns Array of SalesReportDetailedItem\n   * @throws {AuthenticationError} When token type is Basic or Test — this endpoint requires Personal or Service token (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/docs/openapi/financial-reports-and-accounting#tag/Finansovye-otchyoty/operation/postV1SalesReportsDetailedReportId}\n   * @since v3.7.0\n   * @example\n   * ```typescript\n   * // Typical weekly report usage:\n   * const rows = await sdk.finances.getSalesReportsDetailedByReportId(307401554);\n   *\n   * // Daily report with BigInt precision:\n   * const rows = await sdk.finances.getSalesReportsDetailedByReportId('9007199254740993', {\n   *   fields: ['rrdId', 'nmId', 'retailAmount'],\n   * });\n   * ```\n   */\n  async getSalesReportsDetailedByReportId(\n    reportId: number | bigint | string,\n    data: SalesReportDetailedByIdRequest = {}\n  ): Promise<SalesReportDetailedItem[]> {\n    return this.client.post<SalesReportDetailedItem[]>(\n      `https://finance-api.wildberries.ru/api/finance/v1/sales-reports/detailed/${String(reportId)}`,\n      data,\n      { rateLimitKey: 'finances.salesReportsDetailedByReportId' }\n    );\n  }\n\n  // ==========================================================================\n  // v1 Acquiring Reports (since v3.7.0) — payment acquisition costs (эквайринг)\n  // Available ONLY for Russian sellers. Personal/Service tokens only.\n  // ==========================================================================\n\n  /**\n   * Список отчётов об издержках на приём платежей (v1)\n   *\n   * Returns list of acquiring reports. **Available only to Russian sellers.**\n   *\n   * **Available token types**: Personal, Service (NOT Basic or Test)\n   *\n   * Rate limit: 1 req/min, 1 minute interval, burst 1\n   *\n   * @param data - Request body with dateFrom, dateTo, limit, offset\n   * @returns Array of AcquiringReportListItem (money sums as string — use parseMoneyAmount helper)\n   * @throws {AuthenticationError} When token type is Basic or Test — this endpoint requires Personal or Service token\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/docs/openapi/financial-reports-and-accounting#tag/Finansovye-otchyoty/operation/postV1AcquiringList}\n   * @since v3.7.0\n   * @example\n   * ```typescript\n   * import { parseMoneyAmount } from 'daytona-wildberries-typescript-sdk';\n   *\n   * const reports = await sdk.finances.getAcquiringReportsList({\n   *   dateFrom: '2026-03-17',\n   *   dateTo: '2026-03-20',\n   * });\n   * const totalFees = reports.reduce(\n   *   (sum, r) => sum + parseMoneyAmount(r.acquiringFeeSum), 0\n   * );\n   * ```\n   */\n  async getAcquiringReportsList(\n    data: AcquiringReportListRequest\n  ): Promise<AcquiringReportListItem[]> {\n    return this.client.post<AcquiringReportListItem[]>(\n      'https://finance-api.wildberries.ru/api/finance/v1/acquiring/list',\n      data,\n      { rateLimitKey: 'finances.acquiringReportsList' }\n    );\n  }\n\n  /**\n   * Детализации к отчётам об издержках на приём платежей за период (v1)\n   *\n   * Returns detailed rows for acquiring reports within a date range.\n   * **Available only to Russian sellers.** Supports selective field loading via `fields` parameter.\n   *\n   * **Available token types**: Personal, Service (NOT Basic or Test)\n   *\n   * Rate limit: 1 req/min, 1 minute interval, burst 1\n   *\n   * @param data - Request body with dateFrom, dateTo, limit, rrdId, fields\n   * @returns Array of AcquiringReportDetailedItem (money amounts as string — use parseMoneyAmount)\n   * @throws {AuthenticationError} When token type is Basic or Test — this endpoint requires Personal or Service token\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/docs/openapi/financial-reports-and-accounting#tag/Finansovye-otchyoty/operation/postV1AcquiringDetailed}\n   * @since v3.7.0\n   * @example\n   * ```typescript\n   * import { parseMoneyAmount } from 'daytona-wildberries-typescript-sdk';\n   *\n   * const rows = await sdk.finances.getAcquiringReportsDetailed({\n   *   dateFrom: '2026-03-17',\n   *   dateTo: '2026-03-20',\n   *   limit: 100000,\n   *   rrdId: 0,\n   *   fields: ['rrdId', 'acquiringBank', 'acquiringFee'],\n   * });\n   * const totalFees = rows.reduce(\n   *   (sum, r) => sum + parseMoneyAmount(r.acquiringFee), 0\n   * );\n   * ```\n   */\n  async getAcquiringReportsDetailed(\n    data: AcquiringReportDetailedRequest\n  ): Promise<AcquiringReportDetailedItem[]> {\n    return this.client.post<AcquiringReportDetailedItem[]>(\n      'https://finance-api.wildberries.ru/api/finance/v1/acquiring/detailed',\n      data,\n      { rateLimitKey: 'finances.acquiringReportsDetailed' }\n    );\n  }\n\n  /**\n   * Детализации к отчётам об издержках на приём платежей по ID отчёта (v1)\n   *\n   * Returns detailed rows for a specific acquiring report by ID.\n   * **Available only to Russian sellers.**\n   *\n   * **BigInt precision note**: For daily reports, `reportId` may exceed `Number.MAX_SAFE_INTEGER`.\n   * Pass as `bigint` or `string` for precision-safe handling.\n   *\n   * **Available token types**: Personal, Service (NOT Basic or Test)\n   *\n   * Rate limit: 1 req/min, 1 minute interval, burst 1\n   *\n   * @param reportId - Report ID (number/bigint/string)\n   * @param data - Request body with optional limit, rrdId, fields\n   * @returns Array of AcquiringReportDetailedItem\n   * @throws {AuthenticationError} When token type is Basic or Test — this endpoint requires Personal or Service token\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/docs/openapi/financial-reports-and-accounting#tag/Finansovye-otchyoty/operation/postV1AcquiringDetailedReportId}\n   * @since v3.7.0\n   * @example\n   * ```typescript\n   * import { parseMoneyAmount } from 'daytona-wildberries-typescript-sdk';\n   *\n   * // Typical number reportId\n   * const rows = await sdk.finances.getAcquiringReportsDetailedByReportId(307401554);\n   *\n   * // BigInt precision for daily reports — pass as string or bigint\n   * const rows = await sdk.finances.getAcquiringReportsDetailedByReportId(\n   *   '9007199254740993',\n   *   { fields: ['rrdId', 'acquiringFee'] }\n   * );\n   * ```\n   */\n  async getAcquiringReportsDetailedByReportId(\n    reportId: number | bigint | string,\n    data: AcquiringReportDetailedByIdRequest = {}\n  ): Promise<AcquiringReportDetailedItem[]> {\n    return this.client.post<AcquiringReportDetailedItem[]>(\n      `https://finance-api.wildberries.ru/api/finance/v1/acquiring/detailed/${String(reportId)}`,\n      data,\n      { rateLimitKey: 'finances.acquiringReportsDetailedByReportId' }\n    );\n  }\n}\n\n// Re-export all finances types from the subpath import 'daytona-wildberries-typescript-sdk/finances'.\n// Without these, consumers can import the FinancesModule class but cannot access type definitions\n// like DetailReportItem, AccountBalanceResponse, etc. — caught by DX integration test for v3.6.0.\n// @since v3.6.1\nexport type {\n  AccountBalanceResponse,\n  DetailReportItem,\n  DocumentsLocale,\n  RequestDownload,\n  GetCategories,\n  GetList,\n  GetDoc,\n  GetDocs,\n  // v1 Sales Reports types (since v3.7.0)\n  SalesReportListRequest,\n  SalesReportListItem,\n  SalesReportDetailedRequest,\n  SalesReportDetailedByIdRequest,\n  SalesReportDetailedItem,\n  // v1 Field union types for selective loading (since v3.8.0)\n  SalesReportDetailedField,\n  AcquiringReportDetailedField,\n  // v1 Acquiring Reports types (since v3.7.0)\n  AcquiringReportListRequest,\n  AcquiringReportListItem,\n  AcquiringReportDetailedRequest,\n  AcquiringReportDetailedByIdRequest,\n  AcquiringReportDetailedItem,\n} from '../../types/finances.types';\n","/**\n * Auto-generated module\n * Generated from: wildberries_api_doc/11-analytics.yaml\n * DO NOT EDIT MANUALLY - Changes will be overwritten on next generation\n */\n\nimport { BaseClient } from '../../client/base-client';\nimport type {\n  CommonResponseProperties,\n  MainRequest,\n  MainResponse,\n  NmReportCreateReportResponse,\n  NmReportGetReportsResponse,\n  NmReportRetryReportRequest,\n  NmReportRetryReportResponse,\n  ProductOrdersRequest,\n  ProductOrdersResponse,\n  ProductSearchTextsRequest,\n  ProductSearchTextsResponse,\n  SalesFunnelGroupReq,\n  SalesFunnelProductReq,\n  SalesFunnelProductsRequest,\n  SalesFunnelProductsResponse,\n  SalesFunnelProductsHistoryRequest,\n  SalesFunnelProductsHistoryResponse,\n  SalesFunnelGroupedHistoryRequest,\n  SalesFunnelGroupedHistoryResponse,\n  SearchReportGroupReq,\n  SearchReportProductReq,\n  SearchReportTextReq,\n  StocksReportReq,\n  TableDetailsRequest,\n  TableDetailsResponse,\n  TableGroupRequest,\n  TableGroupRequestSt,\n  TableGroupResponse,\n  TableGroupResponseSt,\n  TableProductRequest,\n  TableProductResponse,\n  TableShippingOfficeRequest,\n  TableShippingOfficeResponse,\n  TableSizeRequest,\n  TableSizeResponse,\n  WbWarehousesStockRequest,\n  WbWarehousesStockResponse,\n} from '../../types/analytics.types';\n\nexport class AnalyticsModule {\n  constructor(private client: BaseClient) {}\n\n  /**\n   * Получить список отчётов\n   *\n   * Метод возвращает список отчётов с расширенной аналитикой продавца. Ответ содержит ID созданных отчётов и статусы генерации.\n   *\n   * Rate limit: 3 requests/minute, 20-second interval, burst 3\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/seller-analytics#tag/Analitika-prodavca-CSV}\n   * @example\n   * const result = await sdk.analytics.getNmReportDownloads({});\n   * console.log(result);\n   */\n  async getNmReportDownloads(options?: {\n    'filter[downloadIds]'?: string[];\n  }): Promise<NmReportGetReportsResponse> {\n    return this.client.get<NmReportGetReportsResponse>(\n      'https://seller-analytics-api.wildberries.ru/api/v2/nm-report/downloads',\n      { params: options, rateLimitKey: 'analytics.nmReportDownloads' }\n    );\n  }\n\n  /**\n   * Создать отчёт\n   *\n   * Метод создаёт задание на генерацию отчёта с расширенной аналитикой продавца.\n   * Вы можете создать CSV-версии отчётов по воронке продаж или параметрам поиска с группировкой по артикулам WB, предметам, брендам и ярлыкам.\n   * В отчётах по воронке продаж можно группировать данные по дням, неделям или месяцам.\n   * Параметры `includeSubstitutedSKUs` и `includeSearchTexts` не могут одновременно иметь значение `false`.\n   *\n   * Rate limit: 3 requests/minute, 20-second interval, burst 3\n   *\n   * @remarks Daily limit: 20 reports per day per seller account.\n   * @param [data] - Request body data\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/seller-analytics#tag/Analitika-prodavca-CSV}\n   * @example\n   * const result = await sdk.analytics.createNmReportDownload({});\n   * console.log(result);\n   */\n  async createNmReportDownload(\n    data?:\n      | SalesFunnelProductReq\n      | SalesFunnelGroupReq\n      | SearchReportGroupReq\n      | SearchReportProductReq\n      | SearchReportTextReq\n      | StocksReportReq\n  ): Promise<NmReportCreateReportResponse> {\n    return this.client.post<NmReportCreateReportResponse>(\n      'https://seller-analytics-api.wildberries.ru/api/v2/nm-report/downloads',\n      data,\n      { rateLimitKey: 'analytics.postNmReportDownloads' }\n    );\n  }\n\n  /**\n   * Сгенерировать отчёт повторно\n   *\n   * Метод создает повторное задание на генерацию отчёта с расширенной аналитикой продавца.\n   * Необходимо, если при генерации отчёта вы получили статус `FAILED`.\n   *\n   * Rate limit: 3 requests/minute, 20-second interval, burst 3\n   *\n   * @param data - Request body data\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/seller-analytics#tag/Analitika-prodavca-CSV}\n   * @example\n   * const result = await sdk.analytics.createDownloadsRetry({});\n   * console.log(result);\n   */\n  async createDownloadsRetry(\n    data: NmReportRetryReportRequest\n  ): Promise<NmReportRetryReportResponse> {\n    return this.client.post<NmReportRetryReportResponse>(\n      'https://seller-analytics-api.wildberries.ru/api/v2/nm-report/downloads/retry',\n      data,\n      { rateLimitKey: 'analytics.postNmReportDownloadsRetry' }\n    );\n  }\n\n  /**\n   * Получить отчёт\n   *\n   * Метод возвращает отчёт с расширенной аналитикой продавца по ID задания на генерацию.\n   * Можно получить отчёт, который сгенерирован за последние 48 часов.\n   * Отчёт будет загружен внутри архива ZIP в формате CSV.\n   *\n   * Rate limit: 3 requests/minute, 20-second interval, burst 3\n   *\n   * @param downloadId - ID отчёта (UUID format)\n   * @returns Успешно - ZIP архив с CSV файлом\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/seller-analytics#tag/Analitika-prodavca-CSV}\n   * @example\n   * const result = await sdk.analytics.getDownloadsFile('downloadId-value');\n   * console.log(result);\n   */\n  async getDownloadsFile(downloadId: string): Promise<ArrayBuffer> {\n    return this.client.get<ArrayBuffer>(\n      `https://seller-analytics-api.wildberries.ru/api/v2/nm-report/downloads/file/${downloadId}`,\n      { rateLimitKey: 'analytics.nmReportDownloadsFile' }\n    );\n  }\n\n  /**\n   * Основная страница\n   *\n   * Метод формирует набор данных для основной страницы отчёта по поисковым запросам с общей информацией, позициями товаров, данными по видимости и переходам в карточку, данными для таблицы по группам.\n   * Параметры `includeSubstitutedSKUs` и `includeSearchTexts` не могут одновременно иметь значение `false`.\n   *\n   * Rate limit: 3 requests/minute, 20-second interval, burst 3\n   *\n   * @param data - Request body data\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/seller-analytics#tag/Poiskovye-zaprosy}\n   * @example\n   * const result = await sdk.analytics.createSearchReportReport({});\n   * console.log(result);\n   */\n  async createSearchReportReport(\n    data: MainRequest\n  ): Promise<CommonResponseProperties & { data: MainResponse }> {\n    return this.client.post<CommonResponseProperties & { data: MainResponse }>(\n      'https://seller-analytics-api.wildberries.ru/api/v2/search-report/report',\n      data,\n      { rateLimitKey: 'analytics.postSearchReportReport' }\n    );\n  }\n\n  /**\n   * Пагинация по группам\n   *\n   * Метод формирует дополнительные данные к основному отчёту с пагинацией по группам.\n   * Пагинация возможна только при наличии фильтра по бренду, предмету или ярлыку.\n   * Параметры `includeSubstitutedSKUs` и `includeSearchTexts` не могут одновременно иметь значение `false`.\n   *\n   * Rate limit: 3 requests/minute, 20-second interval, burst 3\n   *\n   * @param data - Request body data\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/seller-analytics#tag/Poiskovye-zaprosy}\n   * @example\n   * const result = await sdk.analytics.createTableGroup({});\n   * console.log(result);\n   */\n  async createTableGroup(\n    data: TableGroupRequest\n  ): Promise<CommonResponseProperties & { data: TableGroupResponse }> {\n    return this.client.post<CommonResponseProperties & { data: TableGroupResponse }>(\n      'https://seller-analytics-api.wildberries.ru/api/v2/search-report/table/groups',\n      data,\n      { rateLimitKey: 'analytics.postSearchReportTableGroups' }\n    );\n  }\n\n  /**\n   * Пагинация по товарам в группе\n   *\n   * Метод формирует дополнительные данные к основному отчёту с пагинацией по товарам в группе.\n   * Пагинация возможна вне зависимости от наличия фильтров.\n   * Параметры `includeSubstitutedSKUs` и `includeSearchTexts` не могут одновременно иметь значение `false`.\n   *\n   * Rate limit: 3 requests/minute, 20-second interval, burst 3\n   *\n   * @param data - Request body data\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/seller-analytics#tag/Poiskovye-zaprosy}\n   * @example\n   * const result = await sdk.analytics.createTableDetail({});\n   * console.log(result);\n   */\n  async createTableDetail(\n    data: TableDetailsRequest\n  ): Promise<CommonResponseProperties & { data: TableDetailsResponse }> {\n    return this.client.post<CommonResponseProperties & { data: TableDetailsResponse }>(\n      'https://seller-analytics-api.wildberries.ru/api/v2/search-report/table/details',\n      data,\n      { rateLimitKey: 'analytics.postSearchReportTableDetails' }\n    );\n  }\n\n  /**\n   * Поисковые запросы по товару\n   *\n   * Метод формирует топ поисковых запросов по товару.\n   * Параметры `includeSubstitutedSKUs` и `includeSearchTexts` не могут одновременно иметь значение `false`.\n   *\n   * Rate limit: 3 requests/minute, 20-second interval, burst 3\n   *\n   * @param data - Request body data\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/seller-analytics#tag/Poiskovye-zaprosy}\n   * @example\n   * const result = await sdk.analytics.createProductSearchText({});\n   * console.log(result);\n   */\n  async createProductSearchText(\n    data: ProductSearchTextsRequest\n  ): Promise<CommonResponseProperties & { data: ProductSearchTextsResponse }> {\n    return this.client.post<CommonResponseProperties & { data: ProductSearchTextsResponse }>(\n      'https://seller-analytics-api.wildberries.ru/api/v2/search-report/product/search-texts',\n      data,\n      { rateLimitKey: 'analytics.postSearchReportProductSearchTexts' }\n    );\n  }\n\n  /**\n   * Заказы и позиции по поисковым запросам товара\n   *\n   * Метод формирует данные для таблицы по количеству заказов и позиций в поиске по запросам покупателя.\n   *\n   * Rate limit: 3 requests/minute, 20-second interval, burst 3\n   *\n   * @param data - Request body data\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/seller-analytics#tag/Poiskovye-zaprosy}\n   * @example\n   * const result = await sdk.analytics.createProductOrder({});\n   * console.log(result);\n   */\n  async createProductOrder(\n    data: ProductOrdersRequest\n  ): Promise<CommonResponseProperties & { data: ProductOrdersResponse }> {\n    return this.client.post<CommonResponseProperties & { data: ProductOrdersResponse }>(\n      'https://seller-analytics-api.wildberries.ru/api/v2/search-report/product/orders',\n      data,\n      { rateLimitKey: 'analytics.postSearchReportProductOrders' }\n    );\n  }\n\n  /**\n   * Данные по группам\n   *\n   * Метод формирует набор данных об остатках по группам товаров.\n   * Группа товаров описывается кортежем `subjectID, brandName, tagID`.\n   *\n   * Rate limit: 3 requests/minute, 20-second interval, burst 3\n   *\n   * @param data - Request body data\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/seller-analytics#tag/Istoriya-ostatkov}\n   * @example\n   * const result = await sdk.analytics.createProductsGroup({});\n   * console.log(result);\n   */\n  async createProductsGroup(data: TableGroupRequestSt): Promise<{ data: TableGroupResponseSt }> {\n    return this.client.post<{ data: TableGroupResponseSt }>(\n      'https://seller-analytics-api.wildberries.ru/api/v2/stocks-report/products/groups',\n      data,\n      { rateLimitKey: 'analytics.postStocksReportProductsGroups' }\n    );\n  }\n\n  /**\n   * Данные по товарам\n   *\n   * Метод формирует набор данных об остатках по товарам.\n   * Можно получить данные как по отдельным товарам, так и в рамках всего отчёта — если в запросе отсутствуют фильтры: `nmIDs`, `subjectID`, `brandName`, `tagID`.\n   *\n   * Rate limit: 3 requests/minute, 20-second interval, burst 3\n   *\n   * @param data - Request body data\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/seller-analytics#tag/Istoriya-ostatkov}\n   * @example\n   * const result = await sdk.analytics.createProductsProduct({});\n   * console.log(result);\n   */\n  async createProductsProduct(data: TableProductRequest): Promise<{ data: TableProductResponse }> {\n    return this.client.post<{ data: TableProductResponse }>(\n      'https://seller-analytics-api.wildberries.ru/api/v2/stocks-report/products/products',\n      data,\n      { rateLimitKey: 'analytics.postStocksReportProductsProducts' }\n    );\n  }\n\n  /**\n   * Данные по размерам\n   *\n   * Метод формирует набор данных об остатках по размерам товара.\n   * Товар не имеет размера, если у него единственный размер с `\"techSize\":\"0\"`.\n   * Данные по складам Маркетплейс (FBS) приходят в агрегированном виде.\n   *\n   * Rate limit: 3 requests/minute, 20-second interval, burst 3\n   *\n   * @param data - Request body data\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/seller-analytics#tag/Istoriya-ostatkov}\n   * @example\n   * const result = await sdk.analytics.createProductsSize({});\n   * console.log(result);\n   */\n  async createProductsSize(data: TableSizeRequest): Promise<{ data: TableSizeResponse }> {\n    return this.client.post<{ data: TableSizeResponse }>(\n      'https://seller-analytics-api.wildberries.ru/api/v2/stocks-report/products/sizes',\n      data,\n      { rateLimitKey: 'analytics.postStocksReportProductsSizes' }\n    );\n  }\n\n  /**\n   * Данные по складам\n   *\n   * Метод формирует набор данных об остатках по складам.\n   * Данные по складам Маркетплейс (FBS) приходят в агрегированном виде — по всем сразу, без детализации по конкретным складам.\n   *\n   * Rate limit: 3 requests/minute, 20-second interval, burst 3\n   *\n   * @param data - Request body data\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/seller-analytics#tag/Istoriya-ostatkov}\n   * @example\n   * const result = await sdk.analytics.createStocksReportOffice({});\n   * console.log(result);\n   */\n  async createStocksReportOffice(\n    data: TableShippingOfficeRequest\n  ): Promise<{ data: TableShippingOfficeResponse }> {\n    return this.client.post<{ data: TableShippingOfficeResponse }>(\n      'https://seller-analytics-api.wildberries.ru/api/v2/stocks-report/offices',\n      data,\n      { rateLimitKey: 'analytics.postStocksReportOffices' }\n    );\n  }\n\n  // ============ v3 Sales Funnel Methods ============\n\n  /**\n   * Статистика карточек товаров за период (v3)\n   *\n   * Возвращает отчёт о товарах с ключевыми показателями — переходы в карточку,\n   * добавления в корзину, заказы — за текущий и прошлый периоды.\n   *\n   * Rate limit: 3 requests/minute, 20-second interval, 3-request burst\n   *\n   * @param data - Request parameters\n   * @returns Sales funnel products statistics\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/seller-analytics#tag/Voronka-prodazh}\n   * @example\n   * const result = await sdk.analytics.getSalesFunnelProducts({\n   *   selectedPeriod: { start: '2026-01-01', end: '2026-01-31' },\n   *   orderBy: { field: 'orderCount', mode: 'desc' },\n   *   limit: 10,\n   *   offset: 0,\n   * });\n   * console.log(result.products);\n   */\n  async getSalesFunnelProducts(\n    data: SalesFunnelProductsRequest\n  ): Promise<SalesFunnelProductsResponse> {\n    return this.client.post<SalesFunnelProductsResponse>(\n      'https://seller-analytics-api.wildberries.ru/api/analytics/v3/sales-funnel/products',\n      data,\n      { rateLimitKey: 'analytics.postSalesFunnelProducts' }\n    );\n  }\n\n  /**\n   * Статистика карточек товаров по дням (v3)\n   *\n   * Возвращает статистику карточек товаров по дням или неделям.\n   *\n   * Rate limit: 3 requests/minute, 20-second interval, 3-request burst\n   *\n   * @param data - Request parameters\n   * @returns Products history statistics\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/seller-analytics#tag/Voronka-prodazh}\n   * @example\n   * const result = await sdk.analytics.getSalesFunnelProductsHistory({\n   *   selectedPeriod: { start: '2026-01-01', end: '2026-01-07' },\n   *   nmIds: [268913787],\n   *   aggregationLevel: 'day',\n   * });\n   * console.log(result);\n   */\n  async getSalesFunnelProductsHistory(\n    data: SalesFunnelProductsHistoryRequest\n  ): Promise<SalesFunnelProductsHistoryResponse> {\n    return this.client.post<SalesFunnelProductsHistoryResponse>(\n      'https://seller-analytics-api.wildberries.ru/api/analytics/v3/sales-funnel/products/history',\n      data,\n      { rateLimitKey: 'analytics.postSalesFunnelProductsHistory' }\n    );\n  }\n\n  /**\n   * Статистика групп карточек товаров по дням (v3)\n   *\n   * Возвращает статистику карточек товаров по дням, сгруппированных по предметам, брендам и ярлыкам.\n   *\n   * Rate limit: 3 requests/minute, 20-second interval, 3-request burst\n   *\n   * @param data - Request parameters\n   * @returns Grouped history statistics\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/seller-analytics#tag/Voronka-prodazh}\n   * @example\n   * const result = await sdk.analytics.getSalesFunnelGroupedHistory({\n   *   selectedPeriod: { start: '2026-01-01', end: '2026-01-07' },\n   *   aggregationLevel: 'day',\n   * });\n   * console.log(result);\n   */\n  async getSalesFunnelGroupedHistory(\n    data: SalesFunnelGroupedHistoryRequest\n  ): Promise<SalesFunnelGroupedHistoryResponse> {\n    return this.client.post<SalesFunnelGroupedHistoryResponse>(\n      'https://seller-analytics-api.wildberries.ru/api/analytics/v3/sales-funnel/grouped/history',\n      data,\n      { rateLimitKey: 'analytics.postSalesFunnelGroupedHistory' }\n    );\n  }\n\n  /**\n   * Текущие остатки на складах WB\n   *\n   * Возвращает актуальные остатки товаров на складах Wildberries.\n   * Данные обновляются раз в 30 минут. Одна строка = один размер на одном складе.\n   * Результаты отсортированы по возрастанию nmId.\n   *\n   * Доступен только для токенов типа Personal и Service.\n   *\n   * **Заменяет устаревший метод** `GET /api/v1/supplier/stocks`,\n   * который будет отключён 23 июня 2026.\n   *\n   * Rate limit: 3 requests per minute, 20-second interval, burst 1\n   *\n   * @param data - Filter and pagination parameters (all optional)\n   * @param data.nmIds - WB articles to filter (0-1000, empty = all)\n   * @param data.chrtIds - Size IDs (only for articles in nmIds)\n   * @param data.limit - Rows in response (max 250000, default 250000)\n   * @param data.offset - Skip N results for pagination (default 0)\n   * @returns Current inventory with warehouse IDs, region names, quantities\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @since 3.4.0\n   * @see {@link https://dev.wildberries.ru/docs/openapi/analytics#tag/Istoriya-ostatkov/operation/postV1StocksReportWbWarehouses}\n   * @example\n   * ```typescript\n   * // Get all inventory\n   * const stock = await sdk.analytics.getWbWarehousesStock();\n   * for (const item of stock.data.items) {\n   *   console.log(`${item.warehouseName} (${item.regionName}): ${item.quantity} шт.`);\n   * }\n   *\n   * // With filters and pagination\n   * const page = await sdk.analytics.getWbWarehousesStock({\n   *   nmIds: [395996251],\n   *   limit: 100,\n   *   offset: 0,\n   * });\n   * ```\n   */\n  async getWbWarehousesStock(data?: WbWarehousesStockRequest): Promise<WbWarehousesStockResponse> {\n    return this.client.post<WbWarehousesStockResponse>(\n      'https://seller-analytics-api.wildberries.ru/api/analytics/v1/stocks-report/wb-warehouses',\n      data ?? {},\n      { rateLimitKey: 'analytics.postStocksReportWbWarehouses' }\n    );\n  }\n}\n// Re-export all analytics types from the subpath import 'daytona-wildberries-typescript-sdk/analytics'.\n// Without these, consumers can import the module class but cannot access type definitions.\n// Caught by DX integration test for v3.6.0; generated as explicit list because `export type *`\n// did not propagate through the build chain in v3.6.1.\n// @since v3.6.1\nexport type {\n  MainRequest,\n  MainResponse,\n  CommonInfo,\n  PositionInfo,\n  SearchReportPositionChartItem,\n  SearchReportPositionClusters,\n  VisibilityInfo,\n  TableGroupItem,\n  TableProductItem,\n  TableGroupRequest,\n  TableGroupResponse,\n  TableDetailsRequest,\n  TableDetailsResponse,\n  ProductSearchTextsRequest,\n  ProductSearchTextsResponse,\n  TableSearchTextItem,\n  ProductOrdersRequest,\n  ProductOrdersResponse,\n  ProductOrdersTextItem,\n  ProductOrdersMetrics,\n  PositionCluster,\n  OrderBy,\n  OrderByMainAndDetails,\n  OrderByGrTe,\n  TextLimit,\n  StandardTariff,\n  AdvancedTariff,\n  Date,\n  PeriodOrdersRequest,\n  Period,\n  PastPeriod,\n  CommonResponseProperties,\n  ErrorObject400,\n  ErrorObject403,\n  ErrorObject,\n  ResponseError,\n  SalesFunnelProductReq,\n  SalesFunnelGroupReq,\n  SearchReportGroupReq,\n  SearchReportProductReq,\n  SearchReportTextReq,\n  StocksReportReq,\n  NmReportRetryReportRequest,\n  NmReportCreateReportResponse,\n  NmReportGetReportsResponse,\n  NmReportRetryReportResponse,\n  Response429Download,\n  Response429DownloadDaily,\n  TableGroupRequestSt,\n  CommonReportFilters,\n  PeriodSt,\n  StockType,\n  AvailabilityFilters,\n  TableOrderBy,\n  TableGroupField,\n  OrderByMode,\n  TableGroupResponseSt,\n  TableGroups,\n  TableGroupItemSt,\n  TableCommonMetrics,\n  FloatGraphByPeriodItem,\n  TableProductItemSt,\n  TableProductRequest,\n  CommonProductFilters,\n  TableProductResponse,\n  TableSizeRequest,\n  CommonSizeFilters,\n  TableSizeResponse,\n  TableOfficeItem,\n  TableShippingOfficeRequest,\n  CommonShippingOfficeFilters,\n  TableShippingOfficeResponse,\n  TableShippingOfficeItem,\n  TableShippingOfficeMetrics,\n  DatePeriod,\n  AggregationLevel,\n  SalesFunnelOrderBy,\n  SalesFunnelTag,\n  SalesFunnelTimeToReady,\n  SalesFunnelConversions,\n  SalesFunnelWbClubMetrics,\n  SalesFunnelWbClubMetricsDynamic,\n  SalesFunnelProductsRequest,\n  SalesFunnelProductsHistoryRequest,\n  SalesFunnelGroupedHistoryRequest,\n  SalesFunnelProduct,\n  SalesFunnelHistoryProduct,\n  SalesFunnelStatistic,\n  SalesFunnelComparison,\n  SalesFunnelStatistics,\n  SalesFunnelHistory,\n  SalesFunnelProductsResponse,\n  SalesFunnelProductsHistoryResponse,\n  SalesFunnelGroupedHistoryResponse,\n  WbWarehousesStockRequest,\n  WbWarehouseStockItem,\n  WbWarehousesStockResponse,\n} from '../../types/analytics.types';\n","/**\n * Auto-generated module\n * Generated from: wildberries_api_doc/09-communications.yaml\n * DO NOT EDIT MANUALLY - Changes will be overwritten on next generation\n */\n\nimport { BaseClient } from '../../client/base-client';\nimport { warnOnce } from '../../utils/deprecation';\nimport { ValidationError } from '../../errors/validation-error';\nimport type {\n  ChatsResponse,\n  EventsResponse,\n  MessageResponse,\n  PinnedReviewsCountParams,\n  PinnedReviewsCountResponse,\n  PinnedReviewsCreateRequest,\n  PinnedReviewsCreateResponse,\n  PinnedReviewsDeleteRequest,\n  PinnedReviewsDeleteResponse,\n  PinnedReviewsLimitsResponse,\n  PinnedReviewsListParams,\n  PinnedReviewsListResponse,\n  ResponseFeedback,\n  SellerMessageRequest,\n} from '../../types/communications.types';\n\n/** Matches the new WB `replySign` format: `<version>:<UUID>:<hex-signature>` */\nconst NEW_FORMAT_REPLYSIGN_REGEX = /^\\d+:[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}:[0-9a-f]+$/i;\n\n/** Exported limits for external testability and documentation. @since 3.13.0 */\nexport const COMMUNICATIONS_LIMITS = {\n  MAX_MESSAGE_LENGTH: 1000,\n  MAX_TOTAL_FILE_SIZE: 30 * 1024 * 1024,\n  MAX_PER_FILE_SIZE: 5 * 1024 * 1024,\n  MAX_REPLYSIGN_LENGTH: 255,\n} as const;\n\nconst { MAX_MESSAGE_LENGTH, MAX_TOTAL_FILE_SIZE, MAX_PER_FILE_SIZE, MAX_REPLYSIGN_LENGTH } =\n  COMMUNICATIONS_LIMITS;\n\n// MIME type inference for tuple-shape file attachments (H3 fix).\nconst MIME_BY_EXTENSION: Record<string, string> = {\n  '.jpg': 'image/jpeg',\n  '.jpeg': 'image/jpeg',\n  '.png': 'image/png',\n  '.pdf': 'application/pdf',\n};\n\nfunction inferMimeFromFilename(filename: string): string {\n  const lower = filename.toLowerCase();\n  for (const [ext, mime] of Object.entries(MIME_BY_EXTENSION)) {\n    if (lower.endsWith(ext)) return mime;\n  }\n  // Fall back: let WB reject server-side if extension is unrecognised.\n  return 'application/octet-stream';\n}\n\nexport class CommunicationsModule {\n  constructor(private client: BaseClient) {}\n\n  /**\n   * Непросмотренные отзывы и вопросы\n   *\n   * Метод проверяет наличие непросмотренных [вопросов](/openapi/user-communication#tag/Voprosy/paths/~1api~1v1~1questions/get) и [отзывов](/openapi/user-communication#tag/Otzyvy/paths/~1api~1v1~1feedbacks/get) от покупателей. Если у продавца есть непросмотренные вопросы или отзывы, возвращает `true`. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца для всех методов категории <strong>Вопросы и отзывы</strong>: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 3 запроса | 333 миллисекунды | 6 запросов | </div>\n   *\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.communications.newFeedbacksQuestions();\n  console.log(result);\n   */\n  async newFeedbacksQuestions(): Promise<{\n    data?: { hasNewQuestions?: boolean; hasNewFeedbacks?: boolean };\n    error?: boolean;\n    errorText?: string;\n    additionalErrors?: string[];\n  }> {\n    return this.client.get<{\n      data?: { hasNewQuestions?: boolean; hasNewFeedbacks?: boolean };\n      error?: boolean;\n      errorText?: string;\n      additionalErrors?: string[];\n    }>('https://feedbacks-api.wildberries.ru/api/v1/new-feedbacks-questions', {\n      rateLimitKey: 'communications.newFeedbacksQuestions',\n    });\n  }\n\n  /**\n   * Неотвеченные вопросы\n   *\n   * Метод возвращает общее количество неотвеченных [вопросов](/openapi/user-communication#tag/Voprosy/paths/~1api~1v1~1questions/get) и количество неотвеченных вопросов за сегодня. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца для всех методов категории <strong>Вопросы и отзывы</strong>: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 3 запроса | 333 миллисекунды | 6 запросов | </div>\n   *\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.communications.getQuestionsCountUnanswered();\n  console.log(result);\n   */\n  async getQuestionsCountUnanswered(): Promise<{\n    data?: { countUnanswered?: number; countUnansweredToday?: number };\n    error?: boolean;\n    errorText?: string;\n    additionalErrors?: string[];\n  }> {\n    return this.client.get<{\n      data?: { countUnanswered?: number; countUnansweredToday?: number };\n      error?: boolean;\n      errorText?: string;\n      additionalErrors?: string[];\n    }>('https://feedbacks-api.wildberries.ru/api/v1/questions/count-unanswered', {\n      rateLimitKey: 'communications.questionsCountUnanswered',\n    });\n  }\n\n  /**\n   * Количество вопросов\n   *\n   * Метод возвращает количество отвеченных или неотвеченных [вопросов](/openapi/user-communication#tag/Voprosy/paths/~1api~1v1~1questions/get) за заданный период. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца для всех методов категории <strong>Вопросы и отзывы</strong>: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 3 запроса | 333 миллисекунды | 6 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.communications.getQuestionsCount({});\n  console.log(result);\n   */\n  async getQuestionsCount(options?: {\n    dateFrom?: number;\n    dateTo?: number;\n    isAnswered?: boolean;\n  }): Promise<{ data?: number; error?: boolean; errorText?: string; additionalErrors?: string[] }> {\n    return this.client.get<{\n      data?: number;\n      error?: boolean;\n      errorText?: string;\n      additionalErrors?: string[];\n    }>('https://feedbacks-api.wildberries.ru/api/v1/questions/count', {\n      params: options,\n      rateLimitKey: 'communications.questionsCount',\n    });\n  }\n\n  /**\n   * Список вопросов\n   *\n   * Метод возвращает список вопросов по заданным фильтрам. Вы можете: - получить данные отвеченных и неотвеченных вопросов - сортировать вопросы по дате - настроить пагинацию и количество вопросов в ответе <div class=\"description_important\"> Можно получить максимум 10 000 вопросов в одном ответе </div> <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца для всех методов категории <strong>Вопросы и отзывы</strong>: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 3 запроса | 333 миллисекунды | 6 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.communications.questions({});\n  console.log(result);\n   */\n  async questions(options?: {\n    isAnswered: boolean;\n    nmId?: number;\n    take: number;\n    skip: number;\n    order?: string;\n    dateFrom?: number;\n    dateTo?: number;\n  }): Promise<{\n    data?: {\n      countUnanswered?: number;\n      countArchive?: number;\n      questions?: {\n        id?: string;\n        text?: string;\n        createdDate?: string;\n        state?: string;\n        answer?: { text?: string; editable?: boolean; createDate?: string };\n        productDetails?: {\n          nmId?: number;\n          imtId?: number;\n          productName?: string;\n          supplierArticle?: string;\n          supplierName?: string;\n          brandName?: string;\n          size?: string;\n        };\n        wasViewed?: boolean;\n        isWarned?: boolean;\n      }[];\n    };\n    error?: boolean;\n    errorText?: string;\n    additionalErrors?: string[];\n  }> {\n    return this.client.get<{\n      data?: {\n        countUnanswered?: number;\n        countArchive?: number;\n        questions?: {\n          id?: string;\n          text?: string;\n          createdDate?: string;\n          state?: string;\n          answer?: { text?: string; editable?: boolean; createDate?: string };\n          productDetails?: {\n            nmId?: number;\n            imtId?: number;\n            productName?: string;\n            supplierArticle?: string;\n            supplierName?: string;\n            brandName?: string;\n            size?: string;\n          };\n          wasViewed?: boolean;\n          isWarned?: boolean;\n        }[];\n      };\n      error?: boolean;\n      errorText?: string;\n      additionalErrors?: string[];\n    }>('https://feedbacks-api.wildberries.ru/api/v1/questions', {\n      params: options,\n      rateLimitKey: 'communications.questions',\n    });\n  }\n\n  /**\n   * Работа с вопросами\n   *\n   * В зависимости от тела запроса, метод позволяет: - отметить [вопрос](/openapi/user-communication#tag/Voprosy/paths/~1api~1v1~1questions/get) как просмотренный - отклонить вопрос - ответить на вопрос или отредактировать ответ <div class=\"description_important\"> Отредактировать ответ на вопрос можно 1 раз в течение 60 дней после отправки ответа </div> <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца для всех методов категории <strong>Вопросы и отзывы</strong>: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 3 запроса | 333 миллисекунды | 6 запросов | </div>\n   *\n   * @param [data] - Request body data\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.communications.updateQuestion({});\n  console.log(result);\n   */\n  async updateQuestion(\n    data?:\n      | { id: string; wasViewed: boolean }\n      | { id: string; answer: { text: string }; state: string }\n  ): Promise<{\n    data?: Record<string, never>;\n    error?: boolean;\n    errorText?: string;\n    additionalErrors?: string[];\n  }> {\n    return this.client.patch<{\n      data?: Record<string, never>;\n      error?: boolean;\n      errorText?: string;\n      additionalErrors?: string[];\n    }>('https://feedbacks-api.wildberries.ru/api/v1/questions', data, {\n      rateLimitKey: 'communications.patchQuestions',\n    });\n  }\n\n  /**\n   * Получить вопрос по ID\n   *\n   * Метод возвращает данные [вопроса](/openapi/user-communication#tag/Voprosy/paths/~1api~1v1~1questions/get) по его ID. Далее вы можете [работать с этим вопросом](/openapi/user-communication#tag/Voprosy/paths/~1api~1v1~1questions/patch). <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца для всех методов категории <strong>Вопросы и отзывы</strong>: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 3 запроса | 333 миллисекунды | 6 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.communications.question({});\n  console.log(result);\n   */\n  async question(options?: { id: string }): Promise<{\n    data?: {\n      id?: string;\n      text?: string;\n      createdDate?: string;\n      state?: string;\n      answer?: { text?: string; editable?: boolean; createDate?: string };\n      productDetails?: {\n        nmId?: number;\n        imtId?: number;\n        productName?: string;\n        supplierArticle?: string;\n        supplierName?: string;\n        brandName?: string;\n        size?: string;\n      };\n      wasViewed?: boolean;\n      isWarned?: boolean;\n    };\n    error?: boolean;\n    errorText?: string;\n    additionalErrors?: string[];\n  }> {\n    return this.client.get<{\n      data?: {\n        id?: string;\n        text?: string;\n        createdDate?: string;\n        state?: string;\n        answer?: { text?: string; editable?: boolean; createDate?: string };\n        productDetails?: {\n          nmId?: number;\n          imtId?: number;\n          productName?: string;\n          supplierArticle?: string;\n          supplierName?: string;\n          brandName?: string;\n          size?: string;\n        };\n        wasViewed?: boolean;\n        isWarned?: boolean;\n      };\n      error?: boolean;\n      errorText?: string;\n      additionalErrors?: string[];\n    }>('https://feedbacks-api.wildberries.ru/api/v1/question', {\n      params: options,\n      rateLimitKey: 'communications.question',\n    });\n  }\n\n  /**\n   * Необработанные отзывы\n   *\n   * Метод возвращает: - количество необработанных [отзывов](/openapi/user-communication#tag/Otzyvy/paths/~1api~1v1~1feedbacks/get) за сегодня и за всё время - среднюю оценку всех отзывов <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца для всех методов категории <strong>Вопросы и отзывы</strong>: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 3 запроса | 333 миллисекунды | 6 запросов | </div>\n   *\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.communications.getFeedbacksCountUnanswered();\n  console.log(result);\n   */\n  async getFeedbacksCountUnanswered(): Promise<{\n    data?: { countUnanswered?: number; countUnansweredToday?: number; valuation?: string };\n    error?: boolean;\n    errorText?: string;\n    additionalErrors?: string[];\n  }> {\n    return this.client.get<{\n      data?: { countUnanswered?: number; countUnansweredToday?: number; valuation?: string };\n      error?: boolean;\n      errorText?: string;\n      additionalErrors?: string[];\n    }>('https://feedbacks-api.wildberries.ru/api/v1/feedbacks/count-unanswered', {\n      rateLimitKey: 'communications.feedbacksCountUnanswered',\n    });\n  }\n\n  /**\n   * Количество отзывов\n   *\n   * Метод возвращает количество обработанных или необработанных [отзывов](/openapi/user-communication#tag/Otzyvy/paths/~1api~1v1~1feedbacks/get) за заданный период. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца для всех методов категории <strong>Вопросы и отзывы</strong>: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 3 запроса | 333 миллисекунды | 6 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.communications.getFeedbacksCount({});\n  console.log(result);\n   */\n  async getFeedbacksCount(options?: {\n    dateFrom?: number;\n    dateTo?: number;\n    isAnswered?: boolean;\n  }): Promise<{ data?: number; error?: boolean; errorText?: string; additionalErrors?: string[] }> {\n    return this.client.get<{\n      data?: number;\n      error?: boolean;\n      errorText?: string;\n      additionalErrors?: string[];\n    }>('https://feedbacks-api.wildberries.ru/api/v1/feedbacks/count', {\n      params: options,\n      rateLimitKey: 'communications.feedbacksCount',\n    });\n  }\n\n  /**\n   * Список отзывов\n   *\n   * Метод возвращает список отзывов по заданным фильтрам. Вы можете: - получить данные обработанных и необработанных отзывов - сортировать отзывы по дате - настроить пагинацию и количество отзывов в ответе <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца для всех методов категории <strong>Вопросы и отзывы</strong>: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 3 запроса | 333 миллисекунды | 6 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.communications.feedbacks({});\n  console.log(result);\n   */\n  async feedbacks(options?: {\n    isAnswered: boolean;\n    nmId?: number;\n    take: number;\n    skip: number;\n    order?: 'dateAsc' | 'dateDesc';\n    dateFrom?: number;\n    dateTo?: number;\n  }): Promise<{\n    data?: { countUnanswered?: number; countArchive?: number; feedbacks?: ResponseFeedback };\n    error?: boolean;\n    errorText?: string;\n    additionalErrors?: string[];\n  }> {\n    return this.client.get<{\n      data?: { countUnanswered?: number; countArchive?: number; feedbacks?: ResponseFeedback };\n      error?: boolean;\n      errorText?: string;\n      additionalErrors?: string[];\n    }>('https://feedbacks-api.wildberries.ru/api/v1/feedbacks', {\n      params: options,\n      rateLimitKey: 'communications.feedbacks',\n    });\n  }\n\n  /**\n   * Ответить на отзыв\n   *\n   * Метод позволяет ответить на [отзыв](/openapi/user-communication#tag/Otzyvy/paths/~1api~1v1~1feedbacks/get) покупателя. <div class=\"description_important\"> ID отзыва не валидируется. Если в запросе вы передали некорректный ID, вы не получите ошибку. </div> <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца для всех методов категории <strong>Вопросы и отзывы</strong>: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 3 запроса | 333 миллисекунды | 6 запросов | </div>\n   *\n   * @param [data] - Request body data\n   * @returns Response data\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.communications.createFeedbacksAnswer({});\n   */\n  async createFeedbacksAnswer(data?: { id: string; text: string }): Promise<void> {\n    return this.client.post('https://feedbacks-api.wildberries.ru/api/v1/feedbacks/answer', data, {\n      rateLimitKey: 'communications.postFeedbacksAnswer',\n    });\n  }\n\n  /**\n   * Отредактировать ответ на отзыв\n   *\n   * Метод позволяет отредактировать уже отправленный [ответ на отзыв](/openapi/user-communication#tag/Otzyvy/paths/~1api~1v1~1feedbacks~1answer/post) покупателя. <br><br> Отредактировать ответ можно только один раз в течение 60 дней c момента отправки. <div class=\"description_important\"> ID отзыва не валидируется. Если в запросе вы передали некорректный ID, вы не получите ошибку. </div> <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца для всех методов категории <strong>Вопросы и отзывы</strong>: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 3 запроса | 333 миллисекунды | 6 запросов | </div>\n   *\n   * @param [data] - Request body data\n   * @returns Response data\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.communications.updateFeedbacksAnswer({});\n   */\n  async updateFeedbacksAnswer(data?: { id: string; text: string }): Promise<void> {\n    return this.client.patch('https://feedbacks-api.wildberries.ru/api/v1/feedbacks/answer', data, {\n      rateLimitKey: 'communications.patchFeedbacksAnswer',\n    });\n  }\n\n  /**\n   * Возврат товара по ID отзыва\n   *\n   * Метод запрашивает возврат товара, по которому оставлен [отзыв](/openapi/user-communication#tag/Otzyvy/paths/~1api~1v1~1feedbacks/get). <br><br> Возврат доступен для отзывов с полем `\"isAbleReturnProductOrders\": true`. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца для всех методов категории <strong>Вопросы и отзывы</strong>: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 3 запроса | 333 миллисекунды | 6 запросов | </div>\n   *\n   * @param data - Request body data\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.communications.createOrderReturn({});\n  console.log(result);\n   */\n  async createOrderReturn(data: { feedbackId?: string }): Promise<{\n    data?: Record<string, never>;\n    error?: boolean;\n    errorText?: string;\n    additionalErrors?: string[];\n  }> {\n    return this.client.post<{\n      data?: Record<string, never>;\n      error?: boolean;\n      errorText?: string;\n      additionalErrors?: string[];\n    }>('https://feedbacks-api.wildberries.ru/api/v1/feedbacks/order/return', data, {\n      rateLimitKey: 'communications.postFeedbacksOrderReturn',\n    });\n  }\n\n  /**\n   * Получить отзыв по ID\n   *\n   * Метод возвращает данные [отзыва](/openapi/user-communication#tag/Otzyvy/paths/~1api~1v1~1feedbacks/get) по его ID. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца для всех методов категории <strong>Вопросы и отзывы</strong>: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 3 запроса | 333 миллисекунды | 6 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.communications.feedback({});\n  console.log(result);\n   */\n  async feedback(options?: { id: string }): Promise<{\n    data?: {\n      id?: string;\n      userName?: string;\n      pros?: string;\n      cons?: string;\n      matchingSize?: string;\n      text?: string;\n      productValuation?: number;\n      createdDate?: string;\n      answer?: { text?: string; state?: string; editable?: boolean };\n      state?: string;\n      productDetails?: {\n        nmId?: number;\n        imtId?: number;\n        productName?: string;\n        supplierArticle?: string;\n        supplierName?: string;\n        brandName?: string;\n        size?: string;\n      };\n      photoLinks?: { fullSize?: string; miniSize?: string }[];\n      video?: { previewImage?: string; link?: string; durationSec?: number };\n      wasViewed?: boolean;\n      isAbleSupplierFeedbackValuation?: boolean;\n      supplierFeedbackValuation?: number;\n      isAbleSupplierProductValuation?: boolean;\n      supplierProductValuation?: number;\n      isAbleReturnProductOrders?: boolean;\n      returnProductOrdersDate?: string;\n      bables?: string[];\n      lastOrderShkId?: number;\n      lastOrderCreatedAt?: string;\n      color?: string;\n      subjectId?: number;\n      subjectName?: string;\n      parentFeedbackId?: string;\n      childFeedbackId?: string;\n    };\n    error?: boolean;\n    errorText?: string;\n    additionalErrors?: string[];\n  }> {\n    return this.client.get<{\n      data?: {\n        id?: string;\n        userName?: string;\n        pros?: string;\n        cons?: string;\n        matchingSize?: string;\n        text?: string;\n        productValuation?: number;\n        createdDate?: string;\n        answer?: { text?: string; state?: string; editable?: boolean };\n        state?: string;\n        productDetails?: {\n          nmId?: number;\n          imtId?: number;\n          productName?: string;\n          supplierArticle?: string;\n          supplierName?: string;\n          brandName?: string;\n          size?: string;\n        };\n        photoLinks?: { fullSize?: string; miniSize?: string }[];\n        video?: { previewImage?: string; link?: string; durationSec?: number };\n        wasViewed?: boolean;\n        isAbleSupplierFeedbackValuation?: boolean;\n        supplierFeedbackValuation?: number;\n        isAbleSupplierProductValuation?: boolean;\n        supplierProductValuation?: number;\n        isAbleReturnProductOrders?: boolean;\n        returnProductOrdersDate?: string;\n        bables?: string[];\n        lastOrderShkId?: number;\n        lastOrderCreatedAt?: string;\n        color?: string;\n        subjectId?: number;\n        subjectName?: string;\n        parentFeedbackId?: string;\n        childFeedbackId?: string;\n      };\n      error?: boolean;\n      errorText?: string;\n      additionalErrors?: string[];\n    }>('https://feedbacks-api.wildberries.ru/api/v1/feedback', {\n      params: options,\n      rateLimitKey: 'communications.feedback',\n    });\n  }\n\n  /**\n   * Список архивных отзывов\n   *\n   * Метод возвращает список архивных [отзывов](/openapi/user-communication#tag/Otzyvy/paths/~1api~1v1~1feedbacks/get). <br><br> Отзыв становится архивным, если: - на отзыв получен ответ - на отзыв не получен ответ в течение 30 дней - в отзыве нет текста и фото <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца для всех методов категории <strong>Вопросы и отзывы</strong>: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 3 запроса | 333 миллисекунды | 6 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.communications.getFeedbacksArchive({});\n  console.log(result);\n   */\n  async getFeedbacksArchive(options?: {\n    nmId?: number;\n    take: number;\n    skip: number;\n    order?: 'dateAsc' | 'dateDesc';\n  }): Promise<{\n    data?: { feedbacks?: ResponseFeedback };\n    error?: boolean;\n    errorText?: string;\n    additionalErrors?: string[];\n  }> {\n    return this.client.get<{\n      data?: { feedbacks?: ResponseFeedback };\n      error?: boolean;\n      errorText?: string;\n      additionalErrors?: string[];\n    }>('https://feedbacks-api.wildberries.ru/api/v1/feedbacks/archive', {\n      params: options,\n      rateLimitKey: 'communications.feedbacksArchive',\n    });\n  }\n\n  /**\n   * Список чатов\n   *\n   * Метод возвращает список всех чатов продавца. По этим данным можно получить [события чатов](/openapi/user-communication#tag/Chat-s-pokupatelyami/paths/~1api~1v1~1seller~1events/get) или [отправить сообщение покупателю](/openapi/user-communication#tag/Chat-s-pokupatelyami/paths/~1api~1v1~1seller~1message/post). <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 10 секунд | 10 запросов | 1 секунда | 10 запросов | </div>\n   *\n   * **v3.13.0 — replySign format change (deadline 2026-06-04)**: WB updated the `replySign` field\n   * returned by this endpoint. If you cache `replySign` values, you must refresh them via this\n   * method before calling `createSellerMessage()` after 2026-06-04 — old-format values will be\n   * rejected by WB with HTTP 400. New format: `<version>:<UUID>:<crypto-signature>` (~135 chars).\n   * See docs/guides/chat-replysign-format-migration.md.\n   *\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const chats = await sdk.communications.getSellerChats();\n  console.log(chats.result);\n   */\n  async getSellerChats(): Promise<ChatsResponse> {\n    return this.client.get<ChatsResponse>(\n      'https://buyer-chat-api.wildberries.ru/api/v1/seller/chats',\n      { rateLimitKey: 'communications.sellerChats' }\n    );\n  }\n\n  /**\n   * События чатов\n   *\n   * Метод возвращает список событий всех [чатов с покупателями](/openapi/user-communication#tag/Chat-s-pokupatelyami/paths/~1api~1v1~1seller~1chats/get). Чтобы получить все события: 1. Сделайте первый запрос без параметра `next`. 2. Повторяйте запрос со значением параметра `next` из ответа на предыдущий запрос, пока `totalEvents` не станет равным `0`. Это будет означать, что вы получили все события. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 10 секунд | 10 запросов | 1 секунда | 10 запросов | </div>\n   *\n   * **v3.13.0 — replySign format change (deadline 2026-06-04)**: when `Event.isNewChat` is `true`,\n   * the event includes a `replySign` field in the new format (`<version>:<UUID>:<crypto-signature>`).\n   * Old-format `replySign` values (e.g. cached from before 2026-06-04) will be rejected by WB after\n   * the deadline. Prefer refreshing via `getSellerChats()` which always returns the latest values.\n   * See docs/guides/chat-replysign-format-migration.md.\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.communications.getSellerEvents({});\n  console.log(result);\n   */\n  async getSellerEvents(options?: { next?: number }): Promise<EventsResponse> {\n    return this.client.get<EventsResponse>(\n      'https://buyer-chat-api.wildberries.ru/api/v1/seller/events',\n      {\n        params: options,\n        rateLimitKey: 'communications.sellerEvents',\n      }\n    );\n  }\n\n  /**\n   * Отправить сообщение покупателю (multipart/form-data)\n   *\n   * Метод отправляет сообщение в [чат с покупателем](/openapi/user-communication#tag/Chat-s-pokupatelyami/paths/~1api~1v1~1seller~1chats/get). <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 10 секунд | 10 запросов | 1 секунда | 10 запросов | </div>\n   *\n   * **v3.13.0 fix**: this method previously took zero parameters and always sent an empty body\n   * (broken since introduction). It now requires a `data` parameter with `replySign`.\n   *\n   * **replySign deadline 2026-06-04**: WB rejects old-format `replySign` values with HTTP 400.\n   * Always fetch a fresh `replySign` from `getSellerChats()` before sending. New-format pattern:\n   * `<version>:<UUID>:<crypto-signature>` (~135 chars, e.g. `1:1e265a58-a120-b178-008c-60af2460207c:66f136...`).\n   * If you pass a value that does not match this pattern the SDK emits a one-time `console.warn`\n   * (see `warnOnce` — key `communications.createSellerMessage:legacy-replysign-format`).\n   * See docs/guides/chat-replysign-format-migration.md.\n   *\n   * @param data - Request body: `replySign` (required), optional `message` and `file` attachments\n   * @returns Успешно\n   * @throws {ValidationError} When `replySign` is missing/empty/exceeds 255 chars, `message` > 1000 chars, or total file size > 30 MB\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  // 1. Fetch chats to get a fresh replySign\n  const chats = await sdk.communications.getSellerChats();\n  const chat = chats.result?.[0];\n  if (!chat?.replySign) throw new Error('No chat found');\n\n  // 2. Send message (optionally with attachments)\n  const result = await sdk.communications.createSellerMessage({\n    replySign: chat.replySign,\n    message: 'Thank you for your order!',\n  });\n  console.log(result);\n   */\n  async createSellerMessage(data: SellerMessageRequest): Promise<MessageResponse> {\n    // H1: null-guard — JS callers may pass null/undefined; throw documented ValidationError.\n    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- JS-caller guard\n    if (data == null) {\n      throw new ValidationError('data is required: pass { replySign, message?, file? }');\n    }\n    // M4: trim() so whitespace-only strings are rejected.\n    /* eslint-disable @typescript-eslint/no-unnecessary-condition -- JS-caller guard */\n    if (\n      data.replySign == null ||\n      typeof data.replySign !== 'string' ||\n      data.replySign.trim().length === 0\n    ) {\n      /* eslint-enable @typescript-eslint/no-unnecessary-condition */\n      throw new ValidationError('replySign is required (string, non-empty after trim)');\n    }\n    if (data.replySign.length > MAX_REPLYSIGN_LENGTH) {\n      throw new ValidationError(`replySign exceeds maxLength ${String(MAX_REPLYSIGN_LENGTH)}`);\n    }\n    if (data.message && data.message.length > MAX_MESSAGE_LENGTH) {\n      throw new ValidationError(`message exceeds maxLength ${String(MAX_MESSAGE_LENGTH)}`);\n    }\n    // H2: per-file 5 MB check before total; total check preserved.\n    if (data.file) {\n      let totalSize = 0;\n      for (const f of data.file) {\n        const sz = f instanceof Blob ? f.size : f.content.length;\n        if (sz > MAX_PER_FILE_SIZE) {\n          throw new ValidationError(\n            `file size exceeds 5 MB (got ${String(sz)} bytes). WB limit: 5 MB per file.`\n          );\n        }\n        totalSize += sz;\n      }\n      if (totalSize > MAX_TOTAL_FILE_SIZE) {\n        throw new ValidationError(`total file size exceeds 30 MB (got ${String(totalSize)} bytes)`);\n      }\n    }\n\n    // Heuristic: warn once when replySign looks like the old format (missing version:UUID: prefix).\n    // Best-effort — does not block the request; WB API enforces hard rejection after 2026-06-04.\n    if (!NEW_FORMAT_REPLYSIGN_REGEX.test(data.replySign)) {\n      warnOnce(\n        'communications.createSellerMessage:legacy-replysign-format',\n        'communications.createSellerMessage: `replySign` does not match the expected ' +\n          'new-format pattern (version:UUID:signature). WB API rejects old-format `replySign` ' +\n          'after 2026-06-04. Refresh via `getSellerChats()` to get current-format values. ' +\n          'See docs/guides/chat-replysign-format-migration.md.'\n      );\n    }\n\n    // Build multipart body; SDK hands raw FormData to axios.\n    const formData = new FormData();\n    formData.append('replySign', data.replySign);\n    if (data.message) formData.append('message', data.message);\n    if (data.file) {\n      // H3: infer MIME from filename extension so multipart part has correct Content-Type.\n      for (const f of data.file) {\n        if (f instanceof Blob) {\n          formData.append('file', f);\n        } else {\n          const mime = inferMimeFromFilename(f.filename);\n          formData.append('file', new Blob([f.content], { type: mime }), f.filename);\n        }\n      }\n    }\n\n    return this.client.post<MessageResponse>(\n      'https://buyer-chat-api.wildberries.ru/api/v1/seller/message',\n      formData,\n      {\n        rateLimitKey: 'communications.postSellerMessage',\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any -- axios + FormData auto-sets\n        // multipart/form-data boundary; overriding to undefined removes the default application/json\n        headers: { 'Content-Type': undefined as unknown as string },\n      }\n    );\n  }\n\n  /**\n   * Получить файл из сообщения\n   *\n   * Метод возвращает файл или изображение из сообщения по его ID. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 10 секунд | 10 запросов | 1 секунда | 10 запросов | </div>\n   *\n   * @param id - ID файла, см. значение поля `downloadID` в методе [События чатов](https://dev.wildberries.ru/openapi/user-communication#tag/Chat-s-pokupatelyami/paths/~1api~1v1~1seller~1events/get)\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.communications.getSellerDownload('id-value');\n  console.log(result);\n   */\n  async getSellerDownload(id: string): Promise<unknown> {\n    return this.client.get<unknown>(\n      `https://buyer-chat-api.wildberries.ru/api/v1/seller/download/${id}`,\n      {\n        rateLimitKey: 'communications.sellerDownload',\n      }\n    );\n  }\n\n  /**\n   * Заявки покупателей на возврат\n   *\n   * Метод возвращает заявки покупателей на возврат товаров за последние 14 дней. Вы можете [отвечать на эти заявки](/openapi/user-communication#tag/Vozvraty-pokupatelyami/paths/~1api~1v1~1claim/patch). <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 минута | 20 запросов | 3 секунды | 10 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Response data\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.communications.claims({});\n  console.log(result);\n   */\n  async claims(options?: {\n    is_archive: boolean;\n    id?: string;\n    limit?: number;\n    offset?: number;\n    nm_id?: number;\n  }): Promise<unknown> {\n    return this.client.get<unknown>('https://returns-api.wildberries.ru/api/v1/claims', {\n      params: options,\n      rateLimitKey: 'communications.claims',\n    });\n  }\n\n  /**\n   * Ответ на заявку покупателя\n   *\n   * Метод отправляет ответ на [заявку](/openapi/user-communication#tag/Vozvraty-pokupatelyami/paths/~1api~1v1~1claims/get) покупателя на возврат товаров. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 минута | 20 запросов | 3 секунды | 10 запросов | </div>\n   *\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.communications.updateClaim();\n  console.log(result);\n   */\n  async updateClaim(): Promise<unknown> {\n    return this.client.patch<unknown>(\n      'https://returns-api.wildberries.ru/api/v1/claim',\n      undefined,\n      {\n        rateLimitKey: 'communications.patchClaim',\n      }\n    );\n  }\n\n  // ============================================================================\n  // Pinned Reviews Methods (Закреплённые отзывы)\n  // ============================================================================\n\n  /**\n   * Get count of pinned/unpinned reviews\n   *\n   * Returns the count of pinned and unpinned reviews for the given filters.\n   * Unpinned reviews are only those that were automatically unpinned due to reasons\n   * specified in the `unpinnedCause` field.\n   *\n   * Rate limit: 3 requests per second with 333ms interval, burst of 6 requests.\n   *\n   * @param params - Optional filter parameters\n   * @returns Count of reviews matching the filter\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/user-communication#tag/Zakreplyonnye-otzyvy}\n   * @example\n   * ```typescript\n   * // Get count of all pinned reviews\n   * const count = await sdk.communications.getPinnedFeedbacksCount({ state: 'pinned' });\n   * console.log(`Pinned reviews: ${count.data}`);\n   *\n   * // Get count of pinned reviews on product cards\n   * const cardCount = await sdk.communications.getPinnedFeedbacksCount({\n   *   state: 'pinned',\n   *   pinOn: 'nm'\n   * });\n   * ```\n   */\n  async getPinnedFeedbacksCount(\n    params?: PinnedReviewsCountParams\n  ): Promise<PinnedReviewsCountResponse> {\n    return this.client.get<PinnedReviewsCountResponse>(\n      'https://feedbacks-api.wildberries.ru/api/feedbacks/v1/pins/count',\n      { params, rateLimitKey: 'communications.getPinnedFeedbacksCount' }\n    );\n  }\n\n  /**\n   * Get limits for pinning reviews\n   *\n   * Returns the limits for pinning reviews by subscription and tariff option.\n   * Shows total limits, used count, remaining slots, and per-unit limits.\n   *\n   * Rate limit: 3 requests per second with 333ms interval, burst of 6 requests.\n   *\n   * @returns Limits data for subscription and tariff\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/user-communication#tag/Zakreplyonnye-otzyvy}\n   * @example\n   * ```typescript\n   * const limits = await sdk.communications.getPinnedFeedbacksLimits();\n   * if (limits.data.subscription) {\n   *   console.log(`Subscription remaining: ${limits.data.subscription.remaining}`);\n   * }\n   * if (limits.data.tariff) {\n   *   console.log(`Tariff remaining: ${limits.data.tariff.remaining}`);\n   * }\n   * ```\n   */\n  async getPinnedFeedbacksLimits(): Promise<PinnedReviewsLimitsResponse> {\n    return this.client.get<PinnedReviewsLimitsResponse>(\n      'https://feedbacks-api.wildberries.ru/api/feedbacks/v1/pins/limits',\n      { rateLimitKey: 'communications.getPinnedFeedbacksLimits' }\n    );\n  }\n\n  /**\n   * Get list of pinned/unpinned reviews\n   *\n   * Returns a list of pinned and unpinned reviews with pagination support.\n   * Unpinned reviews are only those that were automatically unpinned due to reasons\n   * specified in the `unpinnedCause` field.\n   *\n   * Rate limit: 3 requests per second with 333ms interval, burst of 6 requests.\n   *\n   * @param params - Optional filter and pagination parameters\n   * @returns List of pinned/unpinned review items with pagination cursor\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/user-communication#tag/Zakreplyonnye-otzyvy}\n   * @example\n   * ```typescript\n   * // Get first page of pinned reviews\n   * const response = await sdk.communications.getPinnedFeedbacks({\n   *   state: 'pinned',\n   *   limit: 100\n   * });\n   * console.log(`Found ${response.data.length} pinned reviews`);\n   *\n   * // Get next page if available\n   * if (response.next) {\n   *   const nextPage = await sdk.communications.getPinnedFeedbacks({\n   *     state: 'pinned',\n   *     next: response.next\n   *   });\n   * }\n   * ```\n   */\n  async getPinnedFeedbacks(params?: PinnedReviewsListParams): Promise<PinnedReviewsListResponse> {\n    return this.client.get<PinnedReviewsListResponse>(\n      'https://feedbacks-api.wildberries.ru/api/feedbacks/v1/pins',\n      { params, rateLimitKey: 'communications.getPinnedFeedbacks' }\n    );\n  }\n\n  /**\n   * Pin reviews to product cards or merged groups\n   *\n   * Pins reviews to a product card or group of merged product cards.\n   * Requires an active Jam subscription or tariff option for pinning reviews.\n   * Maximum 500 reviews can be pinned in a single request.\n   *\n   * Rate limit: 3 requests per second with 333ms interval, burst of 6 requests.\n   *\n   * @param data - Array of reviews to pin (max 500 items)\n   * @returns Result of pin operations with success/error details per item\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400)\n   * @throws {ForbiddenError} When no active subscription or tariff (403)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/user-communication#tag/Zakreplyonnye-otzyvy}\n   * @example\n   * ```typescript\n   * const result = await sdk.communications.pinFeedback([\n   *   {\n   *     pinMethod: 'subscription',\n   *     pinOn: 'imt',\n   *     feedbackId: 'VlbkVVl7mtw37wyWkJZz'\n   *   },\n   *   {\n   *     pinMethod: 'tariff',\n   *     pinOn: 'nm',\n   *     feedbackId: 'DibuRAImknLyiqgzvGcU'\n   *   }\n   * ]);\n   *\n   * result.data.forEach(item => {\n   *   if (item.isErrors) {\n   *     console.log(`Failed to pin ${item.feedbackId}:`, item.errors);\n   *   } else {\n   *     console.log(`Pinned ${item.feedbackId} with pinId: ${item.pinId}`);\n   *   }\n   * });\n   * ```\n   */\n  async pinFeedback(data: PinnedReviewsCreateRequest): Promise<PinnedReviewsCreateResponse> {\n    return this.client.post<PinnedReviewsCreateResponse>(\n      'https://feedbacks-api.wildberries.ru/api/feedbacks/v1/pins',\n      data,\n      { rateLimitKey: 'communications.pinFeedback' }\n    );\n  }\n\n  /**\n   * Unpin reviews from product cards or merged groups\n   *\n   * Unpins reviews using their pin operation IDs (pinId).\n   * Get pinId values from the getPinnedFeedbacks method.\n   * Maximum 500 pin IDs can be unpinned in a single request.\n   *\n   * Rate limit: 3 requests per second with 333ms interval, burst of 6 requests.\n   *\n   * @param data - Array of pin IDs to unpin (max 500 items)\n   * @returns Array of successfully unpinned pin IDs\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/user-communication#tag/Zakreplyonnye-otzyvy}\n   * @example\n   * ```typescript\n   * // Get pinned reviews first to obtain pinIds\n   * const pinned = await sdk.communications.getPinnedFeedbacks({ state: 'pinned' });\n   * const pinIdsToUnpin = pinned.data.slice(0, 3).map(item => item.pinId);\n   *\n   * // Unpin the reviews\n   * const result = await sdk.communications.unpinFeedback(pinIdsToUnpin);\n   * console.log(`Successfully unpinned: ${result.data.join(', ')}`);\n   * ```\n   */\n  async unpinFeedback(data: PinnedReviewsDeleteRequest): Promise<PinnedReviewsDeleteResponse> {\n    return this.client.delete<PinnedReviewsDeleteResponse>(\n      'https://feedbacks-api.wildberries.ru/api/feedbacks/v1/pins',\n      data,\n      { rateLimitKey: 'communications.unpinFeedback' }\n    );\n  }\n}\n// Re-export all communications types from the subpath import 'daytona-wildberries-typescript-sdk/communications'.\n// Without these, consumers can import the module class but cannot access type definitions.\n// Caught by DX integration test for v3.6.0; generated as explicit list because `export type *`\n// did not propagate through the build chain in v3.6.1.\n// @since v3.6.1\nexport type {\n  ReviewPinMethod,\n  ReviewPinOn,\n  ReviewState,\n  UnpinnedCause,\n  PinnedReviewErrorStatus,\n  PinnedReviewError,\n  RespondResultError,\n  PinReviewItem,\n  PinReviewItemResultData,\n  PinnedReviewItemResult,\n  PinnedReviewsCreateRequest,\n  PinnedReviewsCreateResponse,\n  PinnedReviewsDeleteRequest,\n  PinnedReviewsDeleteResponse,\n  PinnedReviewsListParams,\n  PinnedReviewsListResponse,\n  PinnedReviewsCountParams,\n  PinnedReviewsCountResponse,\n  SellerLimit,\n  SellerLimitsData,\n  PinnedReviewsLimitsResponse,\n  StandardizedFQError,\n  ResponsefeedbackErr,\n  ResponseFeedback,\n  LastMessage,\n  Chat,\n  ChatsResponse,\n  Event,\n  EventAttachments,\n  EventType,\n  File,\n  GoodCard,\n  Image,\n  MessageResponse,\n  Sender,\n  EventsResponse,\n  EventsResult,\n  FeedbackListResponse,\n  NewFeedbacksQuestionsResponse,\n} from '../../types/communications.types';\n","/**\n * Auto-generated module\n * Generated from: wildberries_api_doc/12-reports.yaml\n * DO NOT EDIT MANUALLY - Changes will be overwritten on next generation\n */\n\nimport { BaseClient } from '../../client/base-client';\nimport type {\n  AcceptanceReportDownloadItem,\n  AntifraudDetailsResponse,\n  BannedProductsBlockedResponse,\n  BannedProductsShadowedResponse,\n  BrandShareBrandsResponse,\n  BrandShareParentSubjectsResponse,\n  BrandShareResponse,\n  CreateTaskResponse,\n  DeductionsParams,\n  DeductionsResponse,\n  ExciseReportRequest,\n  ExciseReportResponse,\n  GetTasksResponse,\n  GoodsLabelingResponse,\n  GoodsReturnResponse,\n  MeasurementPenaltiesParams,\n  MeasurementPenaltiesResponse,\n  OrdersItem,\n  RegionSaleResponse,\n  ResponsePaidStorage,\n  SalesItem,\n  StocksItem,\n  WarehouseMeasurementsV2Params,\n  WarehouseMeasurementsV2Response,\n  WarehouseRemainsDownloadItem,\n} from '../../types/reports.types';\n\nexport class ReportsModule {\n  constructor(private client: BaseClient) {}\n\n  /**\n   * Склады\n   *\n   * Метод возвращает количество остатков товаров на складах WB.<br>Данные обновляются раз в 30 минут. <br><br> Для одного ответа в системе установлено условное ограничение 60000 строк. Поэтому, чтобы получить все остатки, может потребоваться более, чем один запрос. Во втором и далее запросе в параметре `dateFrom` используйте полное значение поля `lastChangeDate` из последней строки ответа на предыдущий запрос.<br> Если в ответе отдаётся пустой массив `[]`, все остатки уже выгружены. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 минута | 1 запрос | 1 минута | 1 запрос | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.reports.getSupplierStocks({});\n   * console.log(result);\n   */\n  async getSupplierStocks(options?: { dateFrom: string }): Promise<StocksItem[]> {\n    return this.client.get<StocksItem[]>(\n      'https://statistics-api.wildberries.ru/api/v1/supplier/stocks',\n      { params: options, rateLimitKey: 'reports.supplierStocks' }\n    );\n  }\n\n  /**\n   * Заказы\n   *\n   * Метод возвращает информацию обо всех заказах.<br>Данные обновляются раз в 30 минут.<br><br> 1 строка = 1 заказ = 1 cборочное задание = 1 единица товара.<br>Для определения заказа рекомендуем использовать поле `srid`.<br><br> Информация о заказе хранится 90 дней с момента оформления.<br><br> Для одного ответа на запрос с `flag=0` или без `flag` в системе установлено условное ограничение 80000 строк. Поэтому, чтобы получить все заказы, может потребоваться более, чем один запрос. Во втором и далее запросе в параметре `dateFrom` используйте полное значение поля `lastChangeDate` из последней строки ответа на предыдущий запрос.<br> Если в ответе отдаётся пустой массив `[]`, все заказы уже выгружены. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 минута | 1 запрос | 1 минута | 1 запрос | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.reports.getSupplierOrders({});\n   * console.log(result);\n   */\n  async getSupplierOrders(options?: { dateFrom: string; flag?: number }): Promise<OrdersItem[]> {\n    return this.client.get<OrdersItem[]>(\n      'https://statistics-api.wildberries.ru/api/v1/supplier/orders',\n      { params: options, rateLimitKey: 'reports.supplierOrders' }\n    );\n  }\n\n  /**\n   * Продажи\n   *\n   * Метод возвращает информацию о продажах и возвратах.<br>Данные обновляются раз в 30 минут.<br><br> 1 строка = 1 заказ = 1 cборочное задание = 1 единица товара.<br>Для определения заказа рекомендуем использовать поле `srid`.<br><br> Информация о заказе хранится 90 дней с момента оформления.<br><br> Для одного ответа на запрос с `flag=0` или без `flag` в системе установлено условное ограничение 80000 строк. Поэтому, чтобы получить все продажи и возвраты, может потребоваться более, чем один запрос. Во втором и далее запросе в параметре `dateFrom `используйте полное значение поля `lastChangeDate` из последней строки ответа на предыдущий запрос.<br> Если в ответе отдаётся пустой массив `[]`, все продажи и возвраты уже выгружены. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 минута | 1 запрос | 1 минута | 1 запрос | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.reports.getSupplierSales({});\n   * console.log(result);\n   */\n  async getSupplierSales(options?: { dateFrom: string; flag?: number }): Promise<SalesItem[]> {\n    return this.client.get<SalesItem[]>(\n      'https://statistics-api.wildberries.ru/api/v1/supplier/sales',\n      { params: options, rateLimitKey: 'reports.supplierSales' }\n    );\n  }\n\n  /**\n   * Получить отчёт\n   *\n   * Метод возвращает отчёт с [операциями по товарам с обязательной маркировкой](https://seller.wildberries.ru/analytics-reports/excise-report).<br><br> Данный отчёт можно сохранить в [формате таблиц](https://dev.wildberries.ru/cases/1). <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 5 часов | 10 запросов | 30 минут | 10 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @param [data] - Request body data\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.reports.createAnalyticsExciseReport({}, {});\n   * console.log(result);\n   */\n  async createAnalyticsExciseReport(\n    options?: { dateFrom: string; dateTo: string },\n    data?: ExciseReportRequest\n  ): Promise<ExciseReportResponse> {\n    return this.client.post<ExciseReportResponse>(\n      'https://seller-analytics-api.wildberries.ru/api/v1/analytics/excise-report',\n      data,\n      { params: options, rateLimitKey: 'reports.postAnalyticsExciseReport' }\n    );\n  }\n\n  /**\n   * Создать отчёт\n   *\n   * Метод создаёт [задание на генерацию](/openapi/reports#tag/Otchyot-ob-ostatkah-na-skladah/paths/~1api~1v1~1warehouse_remains~1tasks~1%7Btask_id%7D~1status/get) отчёта об [остатках на складах WB](/openapi/reports#tag/Otchyot-ob-ostatkah-na-skladah/paths/~1api~1v1~1warehouse_remains~1tasks~1%7Btask_id%7D~1download/get).<br><br> Параметры `groupBy` и `filter` (группировки и фильтры) можно задать в любой комбинации — аналогично [версии](https://seller.wildberries.ru/analytics-reports/warehouse-remains) в личном кабинете. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 минута | 1 запрос | 1 минута | 5 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.reports.warehouseRemains({});\n   * console.log(result);\n   */\n  async warehouseRemains(options?: {\n    locale?: string;\n    groupByBrand?: boolean;\n    groupBySubject?: boolean;\n    groupBySa?: boolean;\n    groupByNm?: boolean;\n    groupByBarcode?: boolean;\n    groupBySize?: boolean;\n    filterPics?: number;\n    filterVolume?: number;\n  }): Promise<CreateTaskResponse> {\n    return this.client.get<CreateTaskResponse>(\n      'https://seller-analytics-api.wildberries.ru/api/v1/warehouse_remains',\n      { params: options, rateLimitKey: 'reports.warehouse_remains' }\n    );\n  }\n\n  /**\n   * Проверить статус задания на генерацию отчёта об остатках на складах WB\n   *\n   * @param task_id - ID задания на генерацию\n   * @returns Статус задания\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.reports.getWarehouseRemainsTaskStatus('task-uuid');\n   * console.log(result.data?.status);\n   */\n  async getWarehouseRemainsTaskStatus(task_id: string): Promise<GetTasksResponse> {\n    return this.client.get<GetTasksResponse>(\n      `https://seller-analytics-api.wildberries.ru/api/v1/warehouse_remains/tasks/${task_id}/status`,\n      { rateLimitKey: 'reports.warehouse_remainsTasksStatus' }\n    );\n  }\n\n  /**\n   * Получить отчёт об остатках на складах WB\n   *\n   * @param task_id - ID задания на генерацию\n   * @returns Данные отчёта\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.reports.downloadWarehouseRemainsReport('task-uuid');\n   * console.log(result);\n   */\n  async downloadWarehouseRemainsReport(task_id: string): Promise<WarehouseRemainsDownloadItem[]> {\n    return this.client.get<WarehouseRemainsDownloadItem[]>(\n      `https://seller-analytics-api.wildberries.ru/api/v1/warehouse_remains/tasks/${task_id}/download`,\n      { rateLimitKey: 'reports.warehouse_remainsTasksDownload' }\n    );\n  }\n\n  /**\n   * Самовыкупы\n   *\n   * Метод возвращает отчёт об удержаниях за самовыкупы. Отчёт формируется каждую неделю по средам, до 7:00 по московскому времени, и содержит данные за одну неделю.<br><br> Удержание за самовыкуп — 30% от стоимости товаров.<br>Минимальная сумма всех удержаний — 100 000 ₽, если за неделю в ПВЗ привезли ваших товаров больше, чем на сумму 100 000 ₽.<br><br> Данные доступны с августа 2023. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 100 минут | 10 запросов | 10 минут | 10 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Response data\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.reports.getAnalyticsAntifraudDetails({});\n   * console.log(result);\n   */\n  async getAnalyticsAntifraudDetails(options?: {\n    date?: string;\n  }): Promise<AntifraudDetailsResponse> {\n    return this.client.get<AntifraudDetailsResponse>(\n      'https://seller-analytics-api.wildberries.ru/api/v1/analytics/antifraud-details',\n      { params: options, rateLimitKey: 'reports.analyticsAntifraudDetails' }\n    );\n  }\n\n  /**\n   * Маркировка товара\n   *\n   * Метод возвращает отчёт о штрафах за отсутствие обязательной маркировки товаров.<br> В отчёте представлены фотографии товаров, на которых маркировка отсутствует либо не считывается.<br><br> Можно получить данные максимум за 31 день. Данные доступны с марта 2024. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 10 минут | 10 запросов | 1 минута | 10 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Response data\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.reports.getAnalyticsGoodsLabeling({});\n   * console.log(result);\n   */\n  async getAnalyticsGoodsLabeling(options?: {\n    dateFrom: string;\n    dateTo: string;\n  }): Promise<GoodsLabelingResponse> {\n    return this.client.get<GoodsLabelingResponse>(\n      'https://seller-analytics-api.wildberries.ru/api/v1/analytics/goods-labeling',\n      { params: options, rateLimitKey: 'reports.analyticsGoodsLabeling' }\n    );\n  }\n\n  /**\n   * Создать отчёт\n   *\n   * Метод создаёт [задание на генерацию](/openapi/reports#tag/Platnaya-priyomka/paths/~1api~1v1~1acceptance_report~1tasks~1%7Btask_id%7D~1status/get) отчёта о [платной приёмке](/openapi/reports#tag/Platnaya-priyomka/paths/~1api~1v1~1acceptance_report~1tasks~1%7Btask_id%7D~1download/get).<br><br> Можно получить отчёт максимум за 31 день. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 минута | 1 запрос | 1 минута | 1 запрос | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.reports.acceptanceReport({});\n   * console.log(result);\n   */\n  async acceptanceReport(options?: {\n    dateFrom: string;\n    dateTo: string;\n  }): Promise<CreateTaskResponse> {\n    return this.client.get<CreateTaskResponse>(\n      'https://seller-analytics-api.wildberries.ru/api/v1/acceptance_report',\n      { params: options, rateLimitKey: 'reports.acceptance_report' }\n    );\n  }\n\n  /**\n   * Проверить статус задания на генерацию отчёта о платной приёмке\n   *\n   * @param task_id - ID задания на генерацию\n   * @returns Статус задания\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.reports.getAcceptanceReportTaskStatus('task-uuid');\n   * console.log(result.data?.status);\n   */\n  async getAcceptanceReportTaskStatus(task_id: string): Promise<GetTasksResponse> {\n    return this.client.get<GetTasksResponse>(\n      `https://seller-analytics-api.wildberries.ru/api/v1/acceptance_report/tasks/${task_id}/status`,\n      { rateLimitKey: 'reports.acceptance_reportTasksStatus' }\n    );\n  }\n\n  /**\n   * Получить отчёт о платной приёмке\n   *\n   * @param task_id - ID задания на генерацию\n   * @returns Данные отчёта\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.reports.downloadAcceptanceReport('task-uuid');\n   * console.log(result);\n   */\n  async downloadAcceptanceReport(task_id: string): Promise<AcceptanceReportDownloadItem[]> {\n    return this.client.get<AcceptanceReportDownloadItem[]>(\n      `https://seller-analytics-api.wildberries.ru/api/v1/acceptance_report/tasks/${task_id}/download`,\n      { rateLimitKey: 'reports.acceptance_reportTasksDownload' }\n    );\n  }\n\n  /**\n   * Создать отчёт\n   *\n   * Метод создаёт [задание на генерацию](/openapi/reports#tag/Platnoe-hranenie/paths/~1api~1v1~1paid_storage~1tasks~1%7Btask_id%7D~1status/get) отчёта о [платном хранении](/openapi/reports#tag/Platnoe-hranenie/paths/~1api~1v1~1paid_storage~1tasks~1%7Btask_id%7D~1download/get).<br><br> Можно получить отчёт максимум за 8 дней. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 минута | 1 запрос | 1 минута | 5 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.reports.paidStorage({});\n   * console.log(result);\n   */\n  async paidStorage(options?: { dateFrom: string; dateTo: string }): Promise<CreateTaskResponse> {\n    return this.client.get<CreateTaskResponse>(\n      'https://seller-analytics-api.wildberries.ru/api/v1/paid_storage',\n      { params: options, rateLimitKey: 'reports.paid_storage' }\n    );\n  }\n\n  /**\n   * Проверить статус задания на генерацию отчёта о платном хранении\n   *\n   * @param task_id - ID задания на генерацию\n   * @returns Статус задания\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.reports.getPaidStorageTaskStatus('task-uuid');\n   * console.log(result.data?.status);\n   */\n  async getPaidStorageTaskStatus(task_id: string): Promise<GetTasksResponse> {\n    return this.client.get<GetTasksResponse>(\n      `https://seller-analytics-api.wildberries.ru/api/v1/paid_storage/tasks/${task_id}/status`,\n      { rateLimitKey: 'reports.paid_storageTasksStatus' }\n    );\n  }\n\n  /**\n   * Получить отчёт о платном хранении\n   *\n   * @param task_id - ID задания на генерацию\n   * @returns Данные отчёта\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.reports.downloadPaidStorageReport('task-uuid');\n   * console.log(result);\n   */\n  async downloadPaidStorageReport(task_id: string): Promise<ResponsePaidStorage> {\n    return this.client.get<ResponsePaidStorage>(\n      `https://seller-analytics-api.wildberries.ru/api/v1/paid_storage/tasks/${task_id}/download`,\n      { rateLimitKey: 'reports.paid_storageTasksDownload' }\n    );\n  }\n\n  /**\n   * Получить отчёт\n   *\n   * Метод возвращает отчёт с [данными продаж, сгруппированных по регионам стран](https://seller.wildberries.ru/analytics-reports/region-sale).<br><br> Можно получить отчёт максимум за 31 день. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 10 секунд | 1 запрос | 10 секунд | 5 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Response data\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.reports.getAnalyticsRegionSale({});\n   * console.log(result);\n   */\n  async getAnalyticsRegionSale(options?: {\n    dateFrom: string;\n    dateTo: string;\n  }): Promise<RegionSaleResponse> {\n    return this.client.get<RegionSaleResponse>(\n      'https://seller-analytics-api.wildberries.ru/api/v1/analytics/region-sale',\n      { params: options, rateLimitKey: 'reports.analyticsRegionSale' }\n    );\n  }\n\n  /**\n   * Бренды продавца\n   *\n   * Метод возвращает список брендов продавца для отчёта о [доле бренда в продажах](https://seller.wildberries.ru/analytics-reports/brand-share). <br><br> Можно получить только бренды, которые: - Продавались за последние 90 дней. - Есть на складе WB. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 минута | 1 запрос | 1 минута | 10 запросов | </div>\n   *\n   * @returns Response data\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.reports.getBrandShareBrands();\n   * console.log(result);\n   */\n  async getBrandShareBrands(): Promise<BrandShareBrandsResponse> {\n    return this.client.get<BrandShareBrandsResponse>(\n      'https://seller-analytics-api.wildberries.ru/api/v1/analytics/brand-share/brands',\n      { rateLimitKey: 'reports.analyticsBrandShareBrands' }\n    );\n  }\n\n  /**\n   * Родительские категории бренда\n   *\n   * Метод возвращает родительские категории бренда продавца для отчёта о [доле бренда в продажах](https://seller.wildberries.ru/analytics-reports/brand-share).<br><br> Можно получить отчёт максимум за 365 дней. Данные доступны с 1 ноября 2022. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 5 секунд | 1 запрос | 5 секунд | 20 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Response data\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.reports.getBrandShareParentSubjects({});\n   * console.log(result);\n   */\n  async getBrandShareParentSubjects(options?: {\n    locale?: string;\n    brand: string;\n    dateFrom: string;\n    dateTo: string;\n  }): Promise<BrandShareParentSubjectsResponse> {\n    return this.client.get<BrandShareParentSubjectsResponse>(\n      'https://seller-analytics-api.wildberries.ru/api/v1/analytics/brand-share/parent-subjects',\n      { params: options, rateLimitKey: 'reports.analyticsBrandShareParentSubjects' }\n    );\n  }\n\n  /**\n   * Получить отчёт\n   *\n   * Метод возвращает отчёт о [доле бренда продавца в продажах](https://seller.wildberries.ru/analytics-reports/brand-share). <br><br> Можно получить отчёт максимум за 365 дней. Данные доступны с 1 ноября 2022. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 5 секунд | 1 запрос | 5 секунд | 20 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Response data\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.reports.getAnalyticsBrandShare({});\n   * console.log(result);\n   */\n  async getAnalyticsBrandShare(options?: {\n    parentId: number;\n    brand: string;\n    dateFrom: string;\n    dateTo: string;\n  }): Promise<BrandShareResponse> {\n    return this.client.get<BrandShareResponse>(\n      'https://seller-analytics-api.wildberries.ru/api/v1/analytics/brand-share',\n      { params: options, rateLimitKey: 'reports.analyticsBrandShare' }\n    );\n  }\n\n  /**\n   * Заблокированные карточки\n   *\n   * Метод возвращает список [заблокированных карточек товаров продавца](https://seller.wildberries.ru/analytics-reports/banned-products) с причинами блокировки. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 10 секунд | 1 запрос | 10 секунд | 6 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.reports.getBannedProductsBlocked({});\n   * console.log(result);\n   */\n  async getBannedProductsBlocked(options?: {\n    sort: 'brand' | 'nmId' | 'title' | 'vendorCode' | 'reason';\n    order: 'desc' | 'asc';\n  }): Promise<BannedProductsBlockedResponse> {\n    return this.client.get<BannedProductsBlockedResponse>(\n      'https://seller-analytics-api.wildberries.ru/api/v1/analytics/banned-products/blocked',\n      { params: options, rateLimitKey: 'reports.analyticsBannedProductsBlocked' }\n    );\n  }\n\n  /**\n   * Скрытые из каталога\n   *\n   * Метод возвращает список [товаров продавца, скрытых из каталога](https://seller.wildberries.ru/analytics-reports/banned-products/shadowed). <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 10 секунд | 1 запрос | 10 секунд | 6 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.reports.getBannedProductsShadowed({});\n   * console.log(result);\n   */\n  async getBannedProductsShadowed(options?: {\n    sort: 'brand' | 'nmId' | 'title' | 'vendorCode' | 'nmRating';\n    order: 'desc' | 'asc';\n  }): Promise<BannedProductsShadowedResponse> {\n    return this.client.get<BannedProductsShadowedResponse>(\n      'https://seller-analytics-api.wildberries.ru/api/v1/analytics/banned-products/shadowed',\n      { params: options, rateLimitKey: 'reports.analyticsBannedProductsShadowed' }\n    );\n  }\n\n  /**\n   * Получить отчёт\n   *\n   * Метод возвращает отчёт о [возвратах товаров продавцу](https://seller.wildberries.ru/analytics-reports/goods-return). <br><br> Можно получить отчёт максимум за 31 день. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 минута | 1 запрос | 1 минута | 10 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.reports.getAnalyticsGoodsReturn({});\n   * console.log(result);\n   */\n  async getAnalyticsGoodsReturn(options?: {\n    dateFrom: string;\n    dateTo: string;\n  }): Promise<GoodsReturnResponse> {\n    return this.client.get<GoodsReturnResponse>(\n      'https://seller-analytics-api.wildberries.ru/api/v1/analytics/goods-return',\n      { params: options, rateLimitKey: 'reports.analyticsGoodsReturn' }\n    );\n  }\n\n  // ==========================================================================\n  // New Deduction Endpoints - EPIC 44\n  // ==========================================================================\n\n  /**\n   * Занижение габаритов упаковки (штрафы)\n   *\n   * Метод возвращает отчёт об удержаниях за занижение габаритов упаковки.\n   *\n   * Rate limit: 1 req/min, 1 min interval, burst 1\n   *\n   * @param options - Query parameters\n   * @param options.dateFrom - Start of reporting period (ISO 8601)\n   * @param options.dateTo - End of reporting period (ISO 8601, required)\n   * @param options.limit - Number of items in response (max 1000, required)\n   * @param options.offset - Number of items to skip (default 0)\n   * @returns Penalty reports with total count\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see EPIC 44 - New endpoint replacing tab=penalty on old warehouse-measurements\n   * @example\n   * const result = await sdk.reports.getMeasurementPenalties({\n   *   dateTo: '2026-02-06',\n   *   limit: 100\n   * });\n   * console.log(result.data?.reports);\n   */\n  async getMeasurementPenalties(\n    options: MeasurementPenaltiesParams\n  ): Promise<MeasurementPenaltiesResponse> {\n    return this.client.get<MeasurementPenaltiesResponse>(\n      'https://seller-analytics-api.wildberries.ru/api/analytics/v1/measurement-penalties',\n      { params: options, rateLimitKey: 'reports.measurementPenalties' }\n    );\n  }\n\n  /**\n   * Замеры склада\n   *\n   * Метод возвращает отчёт о замерах склада.\n   *\n   * Rate limit: 1 req/min, 1 min interval, burst 1\n   *\n   * @param options - Query parameters\n   * @param options.dateFrom - Start of reporting period (ISO 8601)\n   * @param options.dateTo - End of reporting period (ISO 8601, required)\n   * @param options.limit - Number of items in response (max 1000, required)\n   * @param options.offset - Number of items to skip (default 0)\n   * @returns Measurement reports with total count\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see EPIC 44 - New endpoint replacing tab=measurement on old warehouse-measurements\n   * @example\n   * const result = await sdk.reports.getWarehouseMeasurementsV2({\n   *   dateTo: '2026-02-06',\n   *   limit: 100\n   * });\n   * console.log(result.data?.reports);\n   */\n  async getWarehouseMeasurementsV2(\n    options: WarehouseMeasurementsV2Params\n  ): Promise<WarehouseMeasurementsV2Response> {\n    return this.client.get<WarehouseMeasurementsV2Response>(\n      'https://seller-analytics-api.wildberries.ru/api/analytics/v1/warehouse-measurements',\n      { params: options, rateLimitKey: 'reports.warehouseMeasurementsV2' }\n    );\n  }\n\n  /**\n   * Удержания за подмену и некорректные вложения\n   *\n   * Метод возвращает отчёт об удержаниях за подмену товара и некорректные вложения.\n   * Заменяет удалённый endpoint /api/v1/analytics/incorrect-attachments.\n   *\n   * Rate limit: 1 req/min, 1 min interval, burst 1\n   *\n   * @param options - Query parameters\n   * @param options.dateFrom - Start of reporting period (ISO 8601)\n   * @param options.dateTo - End of reporting period (ISO 8601, required)\n   * @param options.sort - Sort field: nmId, dtBonus, bonusSumm (default: dtBonus)\n   * @param options.order - Sort order: desc, asc (default: desc)\n   * @param options.limit - Number of items in response (max 1000, required)\n   * @param options.offset - Number of items to skip (default 0)\n   * @returns Deduction reports with total count\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see EPIC 44 - New endpoint replacing removed incorrect-attachments\n   * @example\n   * const result = await sdk.reports.getDeductions({\n   *   dateTo: '2026-02-06',\n   *   limit: 100,\n   *   sort: 'dtBonus',\n   *   order: 'desc'\n   * });\n   * console.log(result.data?.reports);\n   */\n  async getDeductions(options: DeductionsParams): Promise<DeductionsResponse> {\n    return this.client.get<DeductionsResponse>(\n      'https://seller-analytics-api.wildberries.ru/api/analytics/v1/deductions',\n      { params: options, rateLimitKey: 'reports.deductions' }\n    );\n  }\n}\n// Re-export all reports types from the subpath import 'daytona-wildberries-typescript-sdk/reports'.\n// Without these, consumers can import the module class but cannot access type definitions.\n// Caught by DX integration test for v3.6.0; generated as explicit list because `export type *`\n// did not propagate through the build chain in v3.6.1.\n// @since v3.6.1\nexport type {\n  IncomesItem,\n  StocksItem,\n  OrdersItem,\n  SalesItem,\n  ResponseErrorStatistics,\n  ResponseErrorStatistics2,\n  ExciseReportRequest,\n  ExciseReportResponse,\n  ModelsExciseReportResponse,\n  ModelsExciseReportResponseData,\n  Penalty,\n  Measurement,\n  Response400Retentions,\n  Response403Retentions,\n  ResponsePaidStorage,\n  GetTasksResponse,\n  GetTasksResponseData,\n  CreateTaskResponse,\n  CreateTaskResponseData,\n  Response4xxResponse,\n  AntifraudDetailsItem,\n  AntifraudDetailsResponse,\n  GoodsLabelingItem,\n  GoodsLabelingResponse,\n  RegionSaleItem,\n  RegionSaleResponse,\n  BrandShareBrandsItem,\n  BrandShareBrandsResponse,\n  BrandShareParentSubjectsItem,\n  BrandShareParentSubjectsResponse,\n  BrandShareItem,\n  BrandShareResponse,\n  WarehouseRemainsDownloadItem,\n  WarehouseQuantity,\n  AcceptanceReportDownloadItem,\n  BannedProductBlockedItem,\n  BannedProductsBlockedResponse,\n  BannedProductShadowedItem,\n  BannedProductsShadowedResponse,\n  GoodsReturnItem,\n  GoodsReturnResponse,\n  MeasurementPenaltiesParams,\n  WarehouseMeasurementsV2Params,\n  DeductionsParams,\n  DeductionItem,\n  DeductionsResponse,\n  MeasurementPenaltiesResponse,\n  WarehouseMeasurementsV2Response,\n} from '../../types/reports.types';\n","/**\n * Auto-generated module\n * Generated from: wildberries_api_doc/08-promotion.yaml\n * DO NOT EDIT MANUALLY - Changes will be overwritten on next generation\n */\n\nimport { BaseClient } from '../../client/base-client';\nimport { warnOnce } from '../../utils/deprecation';\nimport type {\n  BidsRecommendationsResponse,\n  CampaignProductsUpdate,\n  CreateCampaignRequest,\n  GetAdverts,\n  GetAdvertsV2Response,\n  GetBidsRecommendationsParams,\n  GetCampaignCountResponse,\n  GetMinusPhrasesRequest,\n  GetMinusPhrasesResponse,\n  GetSearchClusterStatsRequest,\n  GetSearchClusterStatsResponse,\n  GetSupplierSubjectsParams,\n  PlacementType,\n  RequestWithCampaignID,\n  RequestWithDate,\n  RequestWithInterval,\n  ResponseFullStats,\n  ResponseWithReturn,\n  SetMinusPhrasesRequest,\n  Stat,\n  StatDate,\n  StatInterval,\n  SupplierNmItem,\n  SupplierSubject,\n  UpdateBidsRequest,\n  UpdateBidsResponse,\n  UpdateCampaignProductsRequest,\n  UpdateCampaignProductsResponse,\n  V0GetNormQueryBidsRequest,\n  V0GetNormQueryBidsResponse,\n  V0GetNormQueryMinusRequest,\n  V0GetNormQueryMinusResponse,\n  V0GetNormQueryStatsRequest,\n  V0GetNormQueryStatsResponse,\n  V0KeywordsStatisticsResponse,\n  V0SetMinusNormQueryRequest,\n  V0SetNormQueryBidsRequest,\n} from '../../types/promotion.types';\n\nexport class PromotionModule {\n  constructor(private client: BaseClient) {}\n\n  /**\n   * Удаление кампании\n   *\n   * Метод удаляет [кампании](/openapi/promotion#tag/Kampanii/paths/~1adv~1v1~1promotion~1adverts/post) в статусе `4` — готова к запуску.<br><br> После удаления кампания некоторое время будет находиться в статусе `-1` — кампания в процессе удаления. Полное удаление кампании занимает от 3 до 10 минут. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 5 запросов | 200 миллисекунд | 5 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.promotion.getAdvDelete({});\n  console.log(result);\n   */\n  async getAdvDelete(options?: { id: number }): Promise<void> {\n    return this.client.get('https://advert-api.wildberries.ru/adv/v0/delete', {\n      params: options,\n      rateLimitKey: 'promotion.advDelete',\n    });\n  }\n\n  /**\n   * Переименование кампании\n   *\n   * Метод меняет название [кампании](/openapi/promotion#tag/Kampanii/paths/~1adv~1v1~1promotion~1adverts/post). Это можно сделать в любой момент существования кампании. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 5 запросов | 200 миллисекунд | 5 запросов | </div>\n   *\n   * @param [data] - Request body data\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.promotion.createAdvRename({});\n  console.log(result);\n   */\n  async createAdvRename(data?: { advertId: number; name: string }): Promise<void> {\n    return this.client.post('https://advert-api.wildberries.ru/adv/v0/rename', data, {\n      rateLimitKey: 'promotion.postAdvRename',\n    });\n  }\n\n  /**\n   * Завершение кампании\n   *\n   * Метод завершает [кампании](/openapi/promotion#tag/Kampanii/paths/~1adv~1v1~1promotion~1adverts/post) в статусах: - `4` — готово к запуску - `9` — активна - `11` — пауза <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 5 запросов | 200 миллисекунд | 5 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.promotion.getAdvStop({});\n  console.log(result);\n   */\n  async getAdvStop(options?: { id: number }): Promise<void> {\n    return this.client.get('https://advert-api.wildberries.ru/adv/v0/stop', {\n      params: options,\n      rateLimitKey: 'promotion.advStop',\n    });\n  }\n\n  /**\n   * Изменение мест размещения в кампаниях с ручной ставкой\n   *\n   * Метод меняет места размещения в кампаниях с ручной ставкой. <br><br> Для кампаний в статусах `4`, `9` и `11`. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 1 запрос | 1 секунда | 1 запрос | </div>\n   *\n   * @param data - Request body data\n   * @returns Response data\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.promotion.updateAuctionPlacement({});\n   */\n  async updateAuctionPlacement(data: {\n    placements: { advert_id: number; placements: { search: boolean; recommendations: boolean } }[];\n  }): Promise<void> {\n    return this.client.put('https://advert-api.wildberries.ru/adv/v0/auction/placements', data, {\n      rateLimitKey: 'promotion.putAdvAuctionPlacements',\n    });\n  }\n\n  /**\n   * Изменение ставок в кампаниях\n   *\n   * Метод меняет ставки карточек товаров по артикулам WB в кампаниях типа `9` с единой или ручной ставкой. <br><br> Для кампаний в статусах `4`, `9` и `11`. <br><br> В запросе укажите место размещения в параметре `placement`: - `combined` — в поиске и рекомендациях для кампаний с единой ставкой - `search `или `recommendations` — в поиске или рекомендациях для кампаний с ручной ставкой <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 5 запросов | 200 миллисекунд | 5 запросов | </div>\n   *\n   * @deprecated Use updateBidsV2() instead for kopeck-based bidding.\n   * @param data - Request body data\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.promotion.updateAuctionBid({});\n  console.log(result);\n   */\n  async updateAuctionBid(data: {\n    bids: {\n      advert_id: number;\n      nm_bids: {\n        nm_id: number;\n        bid: number;\n        placement: 'search' | 'recommendations' | 'combined';\n      }[];\n    }[];\n  }): Promise<{\n    bids: { advert_id: number; nm_bids: { nm_id: number; bid: number; placement: string }[] }[];\n  }> {\n    return this.client.patch<{\n      bids: { advert_id: number; nm_bids: { nm_id: number; bid: number; placement: string }[] }[];\n    }>('https://advert-api.wildberries.ru/adv/v0/auction/bids', data, {\n      rateLimitKey: 'promotion.patchAdvAuctionBids',\n    });\n  }\n\n  /**\n   * Баланс\n   *\n   * Метод возвращает информацию о: - счёте кабинета Продвижения WB. Его пополняет продавец. - балансе — максимальной сумме для оплаты камапнии по взаиморасчету: удержании средств из будущих продаж. Баланс пополнить нельзя, он рассчитывается автоматически на основе отчётов по продвижению. - бонусных начислениях WB. Информацию о бюджете кампаний можно получить в [отдельном методе](/openapi/promotion#tag/Finansy/paths/~1adv~1v1~1budget/get). <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 1 запрос | 1 секунда | 5 запросов | </div>\n   *\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.promotion.getAdvBalance();\n  console.log(result);\n   */\n  async getAdvBalance(): Promise<{\n    balance?: number;\n    net?: number;\n    bonus?: number;\n    cashbacks?: { sum?: number; percent?: number; expiration_date?: string }[];\n  }> {\n    return this.client.get<{\n      balance?: number;\n      net?: number;\n      bonus?: number;\n      cashbacks?: { sum?: number; percent?: number; expiration_date?: string }[];\n    }>('https://advert-api.wildberries.ru/adv/v1/balance', {\n      rateLimitKey: 'promotion.advBalance',\n    });\n  }\n\n  /**\n   * Бюджет кампании\n   *\n   * Метод возвращает информацию о бюджете [кампании](/openapi/promotion#tag/Kampanii/paths/~1adv~1v1~1promotion~1adverts/post) — максимальной сумме затрат на кампанию. Бюджет кампании можно [пополнить](/openapi/promotion#tag/Finansy/paths/~1adv~1v1~1budget~1deposit/post). <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 4 запроса | 250 миллисекунд | 4 запроса | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.promotion.getAdvBudget({});\n  console.log(result);\n   */\n  async getAdvBudget(options?: {\n    id: number;\n  }): Promise<{ cash?: number; netting?: number; total?: number }> {\n    return this.client.get<{ cash?: number; netting?: number; total?: number }>(\n      'https://advert-api.wildberries.ru/adv/v1/budget',\n      { params: options, rateLimitKey: 'promotion.advBudget' }\n    );\n  }\n\n  /**\n   * Пополнение бюджета кампании\n   *\n   * Метод пополняет [бюджет](/openapi/promotion#tag/Finansy/paths/~1adv~1v1~1budget/get) кампании в статусе `11` — на паузе. <br> Чтобы запустить кампанию после пополнения бюджета, используйте метод [Запуск кампании](/openapi/promotion#tag/Upravlenie-kampaniyami/paths/~1adv~1v0~1start/get). <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 1 запрос | 1 секунда | 5 запросов | </div>\n   *\n   * @param data - Request body data\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.promotion.createBudgetDeposit({}, {});\n  console.log(result);\n   */\n  async createBudgetDeposit(\n    data: {\n      sum?: number;\n      cashback_sum?: number;\n      cashback_percent?: number;\n      type?: number;\n      return?: boolean;\n    },\n    options?: { id: number }\n  ): Promise<ResponseWithReturn> {\n    return this.client.post<ResponseWithReturn>(\n      'https://advert-api.wildberries.ru/adv/v1/budget/deposit',\n      data,\n      { params: options, rateLimitKey: 'promotion.postAdvBudgetDeposit' }\n    );\n  }\n\n  /**\n   * Получение истории затрат\n   *\n   * Метод формирует список фактических затрат на рекламные кампании за заданный период. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 1 запрос | 1 секунда | 5 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.promotion.getAdvUpd({});\n  console.log(result);\n   */\n  async getAdvUpd(options?: { from: string; to: string }): Promise<\n    {\n      updNum?: number;\n      updTime?: string;\n      updSum?: number;\n      advertId?: number;\n      campName?: string;\n      advertType?: number;\n      paymentType?: string;\n      advertStatus?: number;\n    }[]\n  > {\n    return this.client.get<\n      {\n        updNum?: number;\n        updTime?: string;\n        updSum?: number;\n        advertId?: number;\n        campName?: string;\n        advertType?: number;\n        paymentType?: string;\n        advertStatus?: number;\n      }[]\n    >('https://advert-api.wildberries.ru/adv/v1/upd', {\n      params: options,\n      rateLimitKey: 'promotion.advUpd',\n    });\n  }\n\n  /**\n   * Получение истории пополнений счёта\n   *\n   * Метод возвращает историю пополнений счёта **WB Продвижение** за заданный период. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 1 запрос | 1 секунда | 5 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.promotion.getAdvPayments({});\n  console.log(result);\n   */\n  async getAdvPayments(options?: { from?: string; to?: string }): Promise<\n    {\n      id?: number;\n      date?: string;\n      sum?: number;\n      type?: number;\n      statusId?: number;\n      cardStatus?: string;\n    }[]\n  > {\n    return this.client.get<\n      {\n        id?: number;\n        date?: string;\n        sum?: number;\n        type?: number;\n        statusId?: number;\n        cardStatus?: string;\n      }[]\n    >('https://advert-api.wildberries.ru/adv/v1/payments', {\n      params: options,\n      rateLimitKey: 'promotion.advPayments',\n    });\n  }\n\n  /**\n   * Установка/удаление минус-фраз для кампании с единой ставкой\n   *\n   * <div class=\"description_important\"> ⚠️ **DEPRECATED**: Этот метод устарел и будет отключён **2 февраля 2026**.<br><br> **Обновление**: Дата отключения перенесена с 15 января на 2 февраля 2026.<br><br> **Причина**: Переход от кампаний с единой ставкой (type 8) к кампаниям с ручной и единой ставкой (type 9).<br><br> **Альтернатива**: Для работы с минус-фразами в кампаниях type 9 используйте соответствующие методы управления кампаниями с ручной ставкой. </div> Метод устанавливает и удаляет минус-фразы для кампании [с единой ставкой](/openapi/promotion#tag/Sozdanie-kampanij/paths/~1adv~1v1~1save-ad/post).<br><br> Данные фразы можно выбрать из списка запросов, по которым покупатели находили ваш товар. Список запросов можно получить в [статистике ключевых фраз](/openapi/analytics#tag/Statistika-po-prodvizheniyu/paths/~1adv~1v0~1stats~1keywords/get).<br> Отправка пустого массива удаляет все минус-фразы из кампании. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 6 секунд | 1 запрос | 6 секунд | 5 запросов | </div>\n   *\n   * @deprecated This method will be disabled by Wildberries API on February 2, 2026.\n   * Use setNormqueryMinus() for type 9 campaigns with manual bidding instead.\n   * @see {@link https://dev.wildberries.ru/release-notes?id=388} Release notes\n   * @see {@link PromotionModule.setNormqueryMinus} New method\n   *\n   * @param data - Request body data\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.promotion.createAutoSetExcluded({}, {}); // February 2, 2026\n   * console.log(result);\n   */\n  async createAutoSetExcluded(\n    data: { excluded?: string[] },\n    options?: { id: number }\n  ): Promise<void> {\n    warnOnce(\n      'PromotionModule.createAutoSetExcluded',\n      '[DEPRECATED] createAutoSetExcluded() will be disabled by Wildberries API on February 2, 2026. ' +\n        'Use setNormqueryMinus() for type 9 campaigns with manual bidding instead.'\n    );\n    return this.client.post('https://advert-api.wildberries.ru/adv/v1/auto/set-excluded', data, {\n      params: options,\n      rateLimitKey: 'promotion.postAdvAutoSetExcluded',\n    });\n  }\n\n  /**\n   * Изменение списка карточек товаров в кампании с единой ставкой\n   *\n   * <div class=\"description_important\"> ⚠️ **DEPRECATED**: Этот метод устарел и будет отключён **2 февраля 2026**.<br><br> **Причина**: Переход от кампаний с единой ставкой (type 8) к кампаниям с ручной и единой ставкой (type 9).<br><br> **Альтернатива**: Для работы с товарами в кампаниях type 9 используйте метод [Управление товарами в кампаниях](/openapi/promotion#tag/Upravlenie-kampaniyami/paths/~1adv~1v0~1auction~1nms/patch). </div> Метод добавляет и удаляет карточки товаров в кампании с единой ставкой.<br><br> <div class=\"description_important\"> Добавить можно только те карточки товаров, которые вернутся в <a href=\"/openapi/promotion#tag/Parametry-avtomaticheskih-kampanij/paths/~1adv~1v1~1auto~1getnmtoadd/get\">списке карточек товаров для кампании с единой ставкой</a>.<br>Удалить единственную карточку товара из кампании нельзя. </div> Проверки по параметру `delete` не предусмотрено. Если пришел ответ со статус-кодом `200`, а изменений не произошло, проверьте, чтобы запрос соответствовал документации. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 минута | 60 запросов | 1 секунда | 5 запросов | </div>\n   *\n   * @deprecated This method will be disabled by Wildberries API on February 2, 2026.\n   * Use updateAuctionNm() for type 9 campaigns instead.\n   * @see {@link https://dev.wildberries.ru/release-notes?id=388} Release notes\n   * @see {@link PromotionModule.updateAuctionNm} New method\n   *\n   * @param data - Request body data\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.promotion.createAutoUpdatenm({}, {}); // February 2, 2026\n   * console.log(result);\n   */\n  async createAutoUpdatenm(\n    data: { add?: number[]; delete?: number[] },\n    options?: { id: number }\n  ): Promise<void> {\n    warnOnce(\n      'PromotionModule.createAutoUpdatenm',\n      '[DEPRECATED] createAutoUpdatenm() will be disabled by Wildberries API on February 2, 2026. ' +\n        'Use updateAuctionNm() for type 9 campaigns instead.'\n    );\n    return this.client.post('https://advert-api.wildberries.ru/adv/v1/auto/updatenm', data, {\n      params: options,\n      rateLimitKey: 'promotion.postAdvAutoUpdatenm',\n    });\n  }\n\n  /**\n   * Изменение списка карточек товаров в кампаниях\n   *\n   * Метод добавляет и удаляет карточки товаров в кампаниях. <br><br> Для кампаний в статусах `4`, `9` и `11`. <br><br> Для добавляемых товаров устанавливается текущая минимальная ставка. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 1 запрос | 1 секунда | 1 запрос | </div>\n   *\n   * @param data - Request body data\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.promotion.updateAuctionNm({});\n  console.log(result);\n   */\n  async updateAuctionNm(data: {\n    nms: { advert_id: number; nms: { add?: unknown; delete?: number[] } }[];\n  }): Promise<{ nms: { advert_id: number; nms: { added: number[]; deleted: number[] } }[] }> {\n    return this.client.patch<{\n      nms: { advert_id: number; nms: { added: number[]; deleted: number[] } }[];\n    }>('https://advert-api.wildberries.ru/adv/v0/auction/nms', data, {\n      rateLimitKey: 'promotion.patchAdvAuctionNms',\n    });\n  }\n\n  /**\n   * Количество медиакампаний\n   *\n   * Метод возвращает количество [медиакампаний](/openapi/promotion#tag/Media/paths/~1adv~1v1~1advert/get) продавца с группировкой по статусам. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 10 запросов | 100 миллисекунд | 10 запросов | </div>\n   *\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.promotion.getAdvCount();\n  console.log(result);\n   */\n  async getAdvCount(): Promise<{\n    all?: number;\n    adverts?: { type?: number; status?: number; count?: number };\n  }> {\n    return this.client.get<{\n      all?: number;\n      adverts?: { type?: number; status?: number; count?: number };\n    }>('https://advert-media-api.wildberries.ru/adv/v1/count', {\n      rateLimitKey: 'promotion.advCount',\n    });\n  }\n\n  /**\n   * Список медиакампаний\n   *\n   * Метод возвращает список всех [медиакампаний](/openapi/promotion#tag/Media/paths/~1adv~1v1~1advert/get) продавца по их типам и статусам. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 10 запросов | 100 миллисекунд | 10 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.promotion.getAdvAdverts({});\n  console.log(result);\n   */\n  async getAdvAdverts(options?: {\n    status?: number;\n    type?: number;\n    limit?: number;\n    offset?: number;\n    order?: string;\n    direction?: string;\n  }): Promise<\n    {\n      advertId?: number;\n      name?: string;\n      brand?: string;\n      type?: number;\n      status?: number;\n      createTime?: string;\n      endTime?: string;\n    }[]\n  > {\n    return this.client.get<\n      {\n        advertId?: number;\n        name?: string;\n        brand?: string;\n        type?: number;\n        status?: number;\n        createTime?: string;\n        endTime?: string;\n      }[]\n    >('https://advert-media-api.wildberries.ru/adv/v1/adverts', {\n      params: options,\n      rateLimitKey: 'promotion.advAdverts',\n    });\n  }\n\n  /**\n   * Информация о медиакампании\n   *\n   * Метод возвращает информацию о кампании [WB Медиа](https://cmp.wildberries.ru/cmpf/list). Вместо карточек товаров в медиакампаниях продвигаются рекламные баннеры продавца на сайте и в приложении WB. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 10 запросов | 100 миллисекунд | 10 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.promotion.getAdvAdvert({});\n  console.log(result);\n   */\n  async getAdvAdvert(options?: { id: number }): Promise<{\n    advertId?: number;\n    name?: string;\n    brand?: string;\n    type?: number;\n    status?: number;\n    createTime?: string;\n    extended?: {\n      reason?: string;\n      expenses?: number;\n      from?: string;\n      to?: string;\n      updated_at?: string;\n      price?: number;\n      budget?: number;\n      operation?: number;\n      contract_id?: number;\n    };\n    items?: {\n      id?: number;\n      name?: string;\n      status?: number;\n      place?: number;\n      budget?: number;\n      daily_limit?: number;\n      category_name?: string;\n      cpm?: number;\n      url?: string;\n      advert_type?: number;\n      created_at?: string;\n      updated_at?: string;\n      date_from?: string;\n      date_to?: string;\n      nms?: number[];\n      bottomText1?: string;\n      bottomText2?: string;\n      message?: string;\n      additionalSettings?: number;\n      receiversCount?: number;\n      subject_id?: number;\n      subject_name?: string;\n      action_name?: string;\n      show_hours?: { From?: number; To?: number }[];\n      Erid?: string;\n    }[];\n  }> {\n    return this.client.get<{\n      advertId?: number;\n      name?: string;\n      brand?: string;\n      type?: number;\n      status?: number;\n      createTime?: string;\n      extended?: {\n        reason?: string;\n        expenses?: number;\n        from?: string;\n        to?: string;\n        updated_at?: string;\n        price?: number;\n        budget?: number;\n        operation?: number;\n        contract_id?: number;\n      };\n      items?: {\n        id?: number;\n        name?: string;\n        status?: number;\n        place?: number;\n        budget?: number;\n        daily_limit?: number;\n        category_name?: string;\n        cpm?: number;\n        url?: string;\n        advert_type?: number;\n        created_at?: string;\n        updated_at?: string;\n        date_from?: string;\n        date_to?: string;\n        nms?: number[];\n        bottomText1?: string;\n        bottomText2?: string;\n        message?: string;\n        additionalSettings?: number;\n        receiversCount?: number;\n        subject_id?: number;\n        subject_name?: string;\n        action_name?: string;\n        show_hours?: { From?: number; To?: number }[];\n        Erid?: string;\n      }[];\n    }>('https://advert-media-api.wildberries.ru/adv/v1/advert', {\n      params: options,\n      rateLimitKey: 'promotion.advAdvert',\n    });\n  }\n\n  /**\n   * Статистика кампаний\n   *\n   * Метод формирует статистику для кампаний независимо от типа. <br><br> Максимальный период в запросе — 31 день. <br><br> Для кампаний в статусах `7`, `9` и `11`. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 минута | 3 запроса | 20 секунд | 1 запрос | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.promotion.getAdvFullstats({});\n  console.log(result);\n   */\n  async getAdvFullstats(options?: {\n    ids: string;\n    beginDate: string;\n    endDate: string;\n  }): Promise<ResponseFullStats> {\n    return this.client.get<ResponseFullStats>(\n      'https://advert-api.wildberries.ru/adv/v3/fullstats',\n      { params: options, rateLimitKey: 'promotion.advFullstats' }\n    );\n  }\n\n  /**\n   * Статистика по ключевым фразам\n   *\n   * Метод формирует статистику по ключевым фразам из поисковой строки: количество просмотров товара и затраты по одной ключевой фразе. Подходит для кампаний c единой и ручной ставкой. <br><br> Статистика формируется за каждый день, когда кампания была активна. В одном запросе можно получить данные максимум за 7 дней. <br> Данные обновляются каждый час. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 4 запроса | 250 миллисекунд | 4 запроса | </div>\n   *\n   * @deprecated This endpoint is deprecated. Use alternative methods for keyword statistics.\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.promotion.getStatsKeywords({});\n  console.log(result);\n   */\n  async getStatsKeywords(options?: {\n    advert_id: number;\n    from: string;\n    to: string;\n  }): Promise<V0KeywordsStatisticsResponse> {\n    return this.client.get<V0KeywordsStatisticsResponse>(\n      'https://advert-api.wildberries.ru/adv/v0/stats/keywords',\n      { params: options, rateLimitKey: 'promotion.advStatsKeywords' }\n    );\n  }\n\n  /**\n   * Статистика медиакампаний\n   *\n   * Метод формирует статистику кампаний сервиса [WB Медиа](https://cmp.wildberries.ru/cmpf/statistics). Статистику можно группировать по датам и/или интервалам. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 секунда | 10 запросов | 100 миллисекунд | 10 запросов | </div>\n   *\n   * @param data - Request body data\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.promotion.createAdvStat({});\n  console.log(result);\n   */\n  async createAdvStat(\n    data: RequestWithDate | RequestWithInterval | RequestWithCampaignID[]\n  ): Promise<StatInterval | StatDate | Stat[]> {\n    return this.client.post<StatInterval | StatDate | Stat[]>(\n      'https://advert-media-api.wildberries.ru/adv/v1/stats',\n      data,\n      { rateLimitKey: 'promotion.postAdvStats' }\n    );\n  }\n\n  /**\n   * Список акций\n   *\n   * Метод возвращает список [акций](/openapi/promotion#tag/Kalendar-akcij/paths/~1api~1v1~1calendar~1promotions~1details/get) в WB с датами и временем проведения. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца для всех методов категории <strong>Календарь акций</strong>: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 6 секунд | 10 запросов | 600 миллисекунд | 5 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Response data\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.promotion.getCalendarPromotions({});\n  console.log(result);\n   */\n  async getCalendarPromotions(options?: {\n    startDateTime: string;\n    endDateTime: string;\n    allPromo: boolean;\n    limit?: number;\n    offset?: number;\n  }): Promise<unknown> {\n    return this.client.get<unknown>(\n      'https://dp-calendar-api.wildberries.ru/api/v1/calendar/promotions',\n      { params: options, rateLimitKey: 'promotion.calendarPromotions' }\n    );\n  }\n\n  /**\n   * Детальная информация об акциях\n   *\n   * Метод возвращает подробную информацию об [акции](/openapi/promotion#tag/Kalendar-akcij/paths/~1api~1v1~1calendar~1promotions~1details/get) по ID. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца для всех методов категории <strong>Календарь акций</strong>: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 6 секунд | 10 запросов | 600 миллисекунд | 5 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Response data\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.promotion.getPromotionsDetails({});\n  console.log(result);\n   */\n  async getPromotionsDetails(options?: { promotionIDs: string }): Promise<unknown> {\n    return this.client.get<unknown>(\n      'https://dp-calendar-api.wildberries.ru/api/v1/calendar/promotions/details',\n      { params: options, rateLimitKey: 'promotion.calendarPromotionsDetails' }\n    );\n  }\n\n  /**\n   * Список товаров для участия в акции\n   *\n   * Метод формирует список товаров, подходящих для участия в [акции](/openapi/promotion#tag/Kalendar-akcij/paths/~1api~1v1~1calendar~1promotions~1details/get). Эти товары можно добавить в акцию с помощью [отдельного метода](/openapi/promotion#tag/Kalendar-akcij/paths/~1api~1v1~1calendar~1promotions~1upload/post). <div class=\"description_important\"> Данный метод неприменим для автоакций. </div> <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца для всех методов категории <strong>Календарь акций</strong>: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 6 секунд | 10 запросов | 600 миллисекунд | 5 запросов | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Response data\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.promotion.getPromotionsNomenclatures({});\n  console.log(result);\n   */\n  async getPromotionsNomenclatures(options?: {\n    promotionID: number;\n    inAction: boolean;\n    limit?: number;\n    offset?: number;\n  }): Promise<unknown> {\n    return this.client.get<unknown>(\n      'https://dp-calendar-api.wildberries.ru/api/v1/calendar/promotions/nomenclatures',\n      { params: options, rateLimitKey: 'promotion.calendarPromotionsNomenclatures' }\n    );\n  }\n\n  /**\n   * Добавить товар в акцию\n   *\n   * Метод создаёт задание на загрузку товара в [акцию](/openapi/promotion#tag/Kalendar-akcij/paths/~1api~1v1~1calendar~1promotions~1details/get).<br> Состояние загрузки можно проверить с помощью [отдельных методов](/openapi/work-with-products#tag/Ceny-i-skidki/paths/~1api~1v2~1history~1tasks/get). <div class=\"description_important\"> Данный метод неприменим для автоакций. </div> <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца для всех методов категории <strong>Календарь акций</strong>: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 6 секунд | 10 запросов | 600 миллисекунд | 5 запросов | </div>\n   *\n   * @returns Response data\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n  const result = await sdk.promotion.createPromotionsUpload();\n  console.log(result);\n   */\n  async createPromotionsUpload(): Promise<unknown> {\n    return this.client.post<unknown>(\n      'https://dp-calendar-api.wildberries.ru/api/v1/calendar/promotions/upload',\n      undefined,\n      { rateLimitKey: 'promotion.postCalendarPromotionsUpload' }\n    );\n  }\n\n  // ============================================================================\n  // Deprecated V0/V1 Methods - Will be removed February 2, 2026\n  // ============================================================================\n\n  /**\n   * Получить информацию о кампаниях (устаревший метод)\n   *\n   * Метод возвращает информацию о рекламных кампаниях по их идентификаторам.\n   *\n   * @deprecated Будет удалён 2 февраля 2026. Используйте getAdvertsV2() вместо этого.\n   * @see {@link https://dev.wildberries.ru/release-notes?id=388} Release notes\n   * @see {@link PromotionModule.getAdvertsV2} Новый метод\n   *\n   * @param ids - Массив идентификаторов кампаний\n   * @returns Информация о кампаниях\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * ```typescript\n   * const adverts = await sdk.promotion.getPromotionAdverts([12345, 67890]);\n   * console.log(adverts);\n   * ```\n   */\n  async getPromotionAdverts(ids: number[]): Promise<GetAdverts> {\n    warnOnce(\n      'PromotionModule.getPromotionAdverts',\n      '[DEPRECATED] getPromotionAdverts() будет удалён 2 февраля 2026. Используйте getAdvertsV2().'\n    );\n    return this.client.post<GetAdverts>(\n      'https://advert-api.wildberries.ru/adv/v1/promotion/adverts',\n      ids,\n      { rateLimitKey: 'promotion.postAdvPromotionAdverts' }\n    );\n  }\n\n  /**\n   * Получить список аукционных кампаний (устаревший метод)\n   *\n   * Метод возвращает список рекламных кампаний типа \"аукцион\".\n   *\n   * @deprecated Будет удалён 2 февраля 2026. Используйте getAdvertsV2() вместо этого.\n   * @see {@link https://dev.wildberries.ru/release-notes?id=388} Release notes\n   * @see {@link PromotionModule.getAdvertsV2} Новый метод\n   *\n   * @param params - Параметры фильтрации\n   * @returns Список аукционных кампаний\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * ```typescript\n   * const adverts = await sdk.promotion.getAuctionAdverts({ status: 9 });\n   * console.log(adverts);\n   * ```\n   */\n  async getAuctionAdverts(params?: { status?: number; type?: number }): Promise<GetAdverts> {\n    warnOnce(\n      'PromotionModule.getAuctionAdverts',\n      '[DEPRECATED] getAuctionAdverts() будет удалён 2 февраля 2026. Используйте getAdvertsV2().'\n    );\n    return this.client.get<GetAdverts>('https://advert-api.wildberries.ru/adv/v0/auction/adverts', {\n      params,\n      rateLimitKey: 'promotion.advAuctionAdverts',\n    });\n  }\n\n  // ============================================================================\n  // Search Clusters (NormQuery) Methods - NEW in Feb 2026\n  // ============================================================================\n\n  /**\n   * Статистика поисковых кластеров\n   *\n   * Метод возвращает статистику по поисковым кластерам за указанный период.\n   * Можно использовать только для кампаний с моделью оплаты `cpm` — за показы.\n   *\n   * Rate limit: 10 requests per minute, 6 second interval, burst 20\n   *\n   * @param data - Request body with date range and campaign/product items\n   * @returns Statistics for search clusters\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/promotion#tag/Statistika/paths/~1adv~1v0~1normquery~1stats/post}\n   * @example\n   * ```typescript\n   * const stats = await sdk.promotion.getNormqueryStats({\n   *   from: '2025-10-07',\n   *   to: '2025-10-08',\n   *   items: [{ advert_id: 1825035, nm_id: 983512347 }]\n   * });\n   * console.log(stats.stats);\n   * ```\n   */\n  async getNormqueryStats(data: V0GetNormQueryStatsRequest): Promise<V0GetNormQueryStatsResponse> {\n    return this.client.post<V0GetNormQueryStatsResponse>(\n      'https://advert-api.wildberries.ru/adv/v0/normquery/stats',\n      data,\n      { rateLimitKey: 'promotion.normqueryStats' }\n    );\n  }\n\n  /**\n   * Список ставок поисковых кластеров\n   *\n   * Метод возвращает список поисковых кластеров со ставками по ID кампаний и артикулам WB.\n   *\n   * Rate limit: 5 requests per second, 200ms interval, burst 10\n   *\n   * @param data - Request body with campaign/product items\n   * @returns List of search cluster bids\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/promotion#tag/Poiskovye-klastery/paths/~1adv~1v0~1normquery~1get-bids/post}\n   * @example\n   * ```typescript\n   * const bids = await sdk.promotion.getNormqueryBids({\n   *   items: [{ advert_id: 1825035, nm_id: 983512347 }]\n   * });\n   * console.log(bids.bids);\n   * ```\n   */\n  async getNormqueryBids(data: V0GetNormQueryBidsRequest): Promise<V0GetNormQueryBidsResponse> {\n    return this.client.post<V0GetNormQueryBidsResponse>(\n      'https://advert-api.wildberries.ru/adv/v0/normquery/get-bids',\n      data,\n      { rateLimitKey: 'promotion.normqueryGetBids' }\n    );\n  }\n\n  /**\n   * Установить ставки для поисковых кластеров\n   *\n   * Метод устанавливает ставки на поисковые кластеры.\n   * Можно использовать только для кампаний с ручной ставкой и моделью оплаты `cpm` — за показы.\n   *\n   * Rate limit: 2 requests per second, 500ms interval, burst 4\n   *\n   * @param data - Request body with bids to set\n   * @returns void on success\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/promotion#tag/Poiskovye-klastery/paths/~1adv~1v0~1normquery~1bids/post}\n   * @example\n   * ```typescript\n   * await sdk.promotion.setNormqueryBids({\n   *   bids: [{\n   *     advert_id: 1825035,\n   *     nm_id: 983512347,\n   *     norm_query: 'Фраза 1',\n   *     bid: 1000\n   *   }]\n   * });\n   * ```\n   */\n  async setNormqueryBids(data: V0SetNormQueryBidsRequest): Promise<void> {\n    await this.client.post('https://advert-api.wildberries.ru/adv/v0/normquery/bids', data, {\n      rateLimitKey: 'promotion.normquerySetBids',\n    });\n  }\n\n  /**\n   * Удалить ставки поисковых кластеров\n   *\n   * Метод удаляет ставки с поисковых кластеров.\n   * Можно использовать только для кампаний с ручной ставкой и моделью оплаты `cpm` — за показы.\n   *\n   * Rate limit: 5 requests per second, 200ms interval, burst 10\n   *\n   * @param data - Request body with bids to delete\n   * @returns void on success\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/promotion#tag/Poiskovye-klastery/paths/~1adv~1v0~1normquery~1bids/delete}\n   * @example\n   * ```typescript\n   * await sdk.promotion.deleteNormqueryBids({\n   *   bids: [{\n   *     advert_id: 1825035,\n   *     nm_id: 983512347,\n   *     norm_query: 'Фраза 1',\n   *     bid: 1000\n   *   }]\n   * });\n   * ```\n   */\n  async deleteNormqueryBids(data: V0SetNormQueryBidsRequest): Promise<void> {\n    await this.client.delete('https://advert-api.wildberries.ru/adv/v0/normquery/bids', data, {\n      rateLimitKey: 'promotion.normqueryDeleteBids',\n    });\n  }\n\n  /**\n   * Список минус-фраз кампаний\n   *\n   * Метод возвращает список минус-фраз по ID кампаний и артикулам WB.\n   *\n   * Rate limit: 5 requests per second, 200ms interval, burst 10\n   *\n   * @param data - Request body with campaign/product items\n   * @returns List of minus-phrases\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/promotion#tag/Poiskovye-klastery/paths/~1adv~1v0~1normquery~1get-minus/post}\n   * @example\n   * ```typescript\n   * const minusPhrases = await sdk.promotion.getNormqueryMinus({\n   *   items: [{ advert_id: 1825035, nm_id: 983512347 }]\n   * });\n   * console.log(minusPhrases.items);\n   * ```\n   */\n  async getNormqueryMinus(data: V0GetNormQueryMinusRequest): Promise<V0GetNormQueryMinusResponse> {\n    return this.client.post<V0GetNormQueryMinusResponse>(\n      'https://advert-api.wildberries.ru/adv/v0/normquery/get-minus',\n      data,\n      { rateLimitKey: 'promotion.normqueryGetMinus' }\n    );\n  }\n\n  /**\n   * Установка и удаление минус-фраз\n   *\n   * Метод устанавливает и удаляет минус-фразы в кампаниях с ручной ставкой и моделью оплаты `cpm` — за показы.\n   * Отправка пустого массива удаляет все минус-фразы.\n   *\n   * Rate limit: 5 requests per second, 200ms interval, burst 10\n   *\n   * @param data - Request body with minus-phrases to set\n   * @returns void on success\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/promotion#tag/Poiskovye-klastery/paths/~1adv~1v0~1normquery~1set-minus/post}\n   * @example\n   * ```typescript\n   * await sdk.promotion.setNormqueryMinus({\n   *   advert_id: 1825035,\n   *   nm_id: 983512347,\n   *   norm_queries: ['Фраза 1', 'Фраза 2']\n   * });\n   * ```\n   */\n  async setNormqueryMinus(data: V0SetMinusNormQueryRequest): Promise<void> {\n    await this.client.post('https://advert-api.wildberries.ru/adv/v0/normquery/set-minus', data, {\n      rateLimitKey: 'promotion.normquerySetMinus',\n    });\n  }\n\n  // ============================================================================\n  // V2 Replacement Methods - NEW in Feb 2026\n  // ============================================================================\n\n  /**\n   * Информация о кампаниях (V2)\n   *\n   * Метод возвращает информацию о рекламных кампаниях с единой или ручной ставкой\n   * по их статусам, типам оплаты и ID. Replaces deprecated v1 endpoints.\n   *\n   * Данные синхронизируются с базой раз в 3 минуты. Статусы кампаний меняются раз в минуту.\n   * Ставки кампаний меняются раз в 30 секунд.\n   *\n   * Rate limit: 5 requests per second, 200ms interval, burst 5\n   *\n   * @param options - Query parameters for filtering campaigns\n   * @param options.ids - Campaign IDs, comma-separated (max 50)\n   * @param options.statuses - Campaign statuses: -1 (deleted), 4 (ready), 7 (finished), 8 (cancelled), 9 (active), 11 (paused)\n   * @param options.payment_type - Payment type: cpm (per impressions) or cpc (per click)\n   * @returns List of campaigns with bid_type (auto/manual) and bids in kopecks\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @since 3.4.0 — Return type changed from GetAdverts to GetAdvertsV2Response\n   * @see {@link https://dev.wildberries.ru/docs/openapi/promotion#tag/Kampanii/paths/~1api~1advert~1v2~1adverts/get}\n   * @example\n   * ```typescript\n   * const campaigns = await sdk.promotion.getAdvertsV2({\n   *   ids: '12345,23456',\n   *   statuses: '9,11',\n   *   payment_type: 'cpm',\n   * });\n   * for (const advert of campaigns.adverts) {\n   *   console.log(advert.id, advert.bid_type, advert.status);\n   *   for (const nm of advert.nm_settings) {\n   *     console.log(`  nmId=${nm.nm_id} search=${nm.bids_kopecks.search} reco=${nm.bids_kopecks.recommendations}`);\n   *   }\n   * }\n   * ```\n   */\n  async getAdvertsV2(options?: {\n    ids?: string;\n    statuses?: string;\n    payment_type?: 'cpm' | 'cpc';\n  }): Promise<GetAdvertsV2Response> {\n    return this.client.get<GetAdvertsV2Response>(\n      'https://advert-api.wildberries.ru/api/advert/v2/adverts',\n      {\n        params: options,\n        rateLimitKey: 'promotion.advertsV2',\n      }\n    );\n  }\n\n  /**\n   * Минимальные ставки для карточек товаров (V1 API)\n   *\n   * Метод возвращает минимальные ставки для карточек товаров в копейках\n   * по типу оплаты и местам размещения. Replaces deprecated v0 endpoint.\n   *\n   * Rate limit: 20 requests per minute, 3 second interval, burst 5\n   *\n   * @param data - Request body with campaign ID, product IDs, payment type, and placement types\n   * @returns Minimum bids for products by placement type (in kopecks)\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/promotion#tag/Sozdanie-kampanij/paths/~1api~1advert~1v1~1bids~1min/post}\n   * @example\n   * ```typescript\n   * const minBids = await sdk.promotion.getBidsMinV2({\n   *   advert_id: 98765432,\n   *   nm_ids: [12345678, 87654321],\n   *   payment_type: 'cpm',\n   *   placement_types: ['combined', 'search', 'recommendation']\n   * });\n   * console.log(minBids.bids);\n   * ```\n   */\n  async getBidsMinV2(data: {\n    advert_id: number;\n    nm_ids: number[];\n    payment_type: 'cpm' | 'cpc';\n    placement_types: ('combined' | 'search' | 'recommendation')[];\n  }): Promise<{\n    bids: {\n      nm_id: number;\n      bids: { type: PlacementType; value: number }[];\n    }[];\n  }> {\n    return this.client.post<{\n      bids: {\n        nm_id: number;\n        bids: { type: PlacementType; value: number }[];\n      }[];\n    }>('https://advert-api.wildberries.ru/api/advert/v1/bids/min', data, {\n      rateLimitKey: 'promotion.bidsMinV1',\n    });\n  }\n\n  /**\n   * Рекомендуемые ставки для карточек товаров и поисковых кластеров\n   *\n   * Метод возвращает рекомендуемые ставки для карточек товаров и поисковых кластеров кампании.\n   * Только для кампаний с типом оплаты cpm (за показы).\n   *\n   * Данные синхронизируются с базой раз в 3 минуты.\n   * Для приостановленных кампаний `normQueries` может быть пустым массивом.\n   *\n   * Rate limit: 5 requests per minute, 12-second interval, burst 5\n   *\n   * @param params - Campaign ID and WB article ID\n   * @param params.advertId - Campaign ID\n   * @param params.nmId - WB article ID (must belong to the campaign)\n   * @returns Recommended bids: base (card-level) and normQueries (per search cluster)\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When nmId does not belong to campaign or params invalid (400)\n   * @throws {NetworkError} When network request fails or times out\n   * @since 3.4.0\n   * @see {@link https://dev.wildberries.ru/docs/openapi/promotion#tag/Upravlenie-kampaniyami/paths/~1api~1advert~1v0~1bids~1recommendations/get}\n   * @example\n   * ```typescript\n   * const reco = await sdk.promotion.getBidsRecommendations({\n   *   advertId: 29081652,\n   *   nmId: 148190095,\n   * });\n   * for (const nq of reco.normQueries) {\n   *   console.log(`${nq.normQuery}: min=${nq.reachMin.bidKopecks} med=${nq.reachMedium.bidKopecks} max=${nq.reachMax.bidKopecks}`);\n   * }\n   * ```\n   */\n  async getBidsRecommendations(\n    params: GetBidsRecommendationsParams\n  ): Promise<BidsRecommendationsResponse> {\n    return this.client.get<BidsRecommendationsResponse>(\n      'https://advert-api.wildberries.ru/api/advert/v0/bids/recommendations',\n      {\n        params: { advertId: params.advertId, nmId: params.nmId },\n        rateLimitKey: 'promotion.getBidsRecommendations',\n      }\n    );\n  }\n\n  /**\n   * Изменение ставок в кампаниях (V1 API)\n   *\n   * Метод меняет ставки карточек товаров по артикулам WB в кампаниях с единой или ручной ставкой.\n   * Для кампаний в статусах 4, 9 и 11. Replaces deprecated v0 endpoint.\n   *\n   * Rate limit: 5 requests per second, 200ms interval, burst 5\n   *\n   * @param data - Request body with bids in kopecks\n   * @returns Updated bids\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/promotion#tag/Upravlenie-kampaniyami/paths/~1api~1advert~1v1~1bids/patch}\n   * @example\n   * ```typescript\n   * const result = await sdk.promotion.updateBidsV2({\n   *   bids: [{\n   *     advert_id: 12345,\n   *     nm_bids: [{\n   *       nm_id: 13335157,\n   *       bid_kopecks: 250,\n   *       placement: 'recommendations'\n   *     }]\n   *   }]\n   * });\n   * console.log(result.bids);\n   * ```\n   */\n  async updateBidsV2(data: {\n    bids: {\n      advert_id: number;\n      nm_bids: {\n        nm_id: number;\n        bid_kopecks: number;\n        placement: 'search' | 'recommendations' | 'combined';\n      }[];\n    }[];\n  }): Promise<{\n    bids: {\n      advert_id: number;\n      nm_bids: {\n        nm_id: number;\n        bid_kopecks: number;\n        placement: string;\n      }[];\n    }[];\n  }> {\n    return this.client.patch<{\n      bids: {\n        advert_id: number;\n        nm_bids: {\n          nm_id: number;\n          bid_kopecks: number;\n          placement: string;\n        }[];\n      }[];\n    }>('https://advert-api.wildberries.ru/api/advert/v1/bids', data, {\n      rateLimitKey: 'promotion.bidsV1',\n    });\n  }\n\n  // ============================================================================\n  // Campaign Management Methods - NEW\n  // ============================================================================\n\n  /**\n   * Получение списков кампаний\n   *\n   * Возвращает списки всех рекламных кампаний продавца с их ID.\n   * Кампании сгруппированы по типу и статусу, у каждой указана дата последнего изменения.\n   *\n   * Rate limit:\n   * | Период | Лимит | Интервал | Всплеск |\n   * | --- | --- | --- | --- |\n   * | 1 сек | 5 запросов | 200 мс | 5 запросов |\n   *\n   * @readonly\n   * @returns Списки кампаний по типам и статусам\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @see {@link https://dev.wildberries.ru/openapi/promotion#tag/Kampanii}\n   * @example\n   * ```typescript\n   * const campaigns = await sdk.promotion.getCampaignCount();\n   * console.log(`Total campaigns: ${campaigns.all}`);\n   * for (const group of campaigns.adverts || []) {\n   *   console.log(`Type ${group.type}, Status ${group.status}: ${group.count} campaigns`);\n   * }\n   * ```\n   */\n  async getCampaignCount(): Promise<GetCampaignCountResponse> {\n    return this.client.get<GetCampaignCountResponse>(\n      'https://advert-api.wildberries.ru/adv/v1/promotion/count',\n      { rateLimitKey: 'promotion.getCampaignCount' }\n    );\n  }\n\n  /**\n   * Создание кампании\n   *\n   * Метод создаёт рекламную кампанию с единой или ручной ставкой.\n   * Возвращает ID созданной кампании.\n   *\n   * Rate limit:\n   * | Период | Лимит | Интервал | Всплеск |\n   * | --- | --- | --- | --- |\n   * | 1 мин | 5 запросов | 12 сек | 5 запросов |\n   *\n   * @param data - Данные для создания кампании\n   * @returns ID созданной кампании\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @see {@link https://dev.wildberries.ru/openapi/promotion#tag/Sozdanie-kampanij}\n   * @example\n   * ```typescript\n   * const campaignId = await sdk.promotion.createCampaign({\n   *   name: 'My Campaign',\n   *   nms: [12345678, 87654321],\n   *   bid_type: 'manual',\n   *   payment_type: 'cpm',\n   *   placement_types: ['search', 'recommendations']\n   * });\n   * console.log(`Created campaign with ID: ${campaignId}`);\n   * ```\n   */\n  async createCampaign(data: CreateCampaignRequest): Promise<number> {\n    return this.client.post<number>(\n      'https://advert-api.wildberries.ru/adv/v2/seacat/save-ad',\n      data,\n      { rateLimitKey: 'promotion.createCampaign' }\n    );\n  }\n\n  /**\n   * Список предметов продавца\n   *\n   * Метод возвращает список предметов, для которых можно создать кампанию.\n   * Возвращает null, если нет товаров для создания кампаний.\n   *\n   * Rate limit:\n   * | Период | Лимит | Интервал | Всплеск |\n   * | --- | --- | --- | --- |\n   * | 1 мин | 5 запросов | 12 сек | 5 запросов |\n   *\n   * @param params - Параметры фильтрации\n   * @returns Список предметов или null\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @see {@link https://dev.wildberries.ru/openapi/promotion#tag/Sozdanie-kampanij}\n   * @example\n   * ```typescript\n   * const subjects = await sdk.promotion.getSupplierSubjects({ payment_type: 'cpm' });\n   * if (subjects) {\n   *   for (const subject of subjects) {\n   *     console.log(`${subject.name}: ${subject.count} products`);\n   *   }\n   * }\n   * ```\n   */\n  async getSupplierSubjects(params?: GetSupplierSubjectsParams): Promise<SupplierSubject[] | null> {\n    return this.client.get<SupplierSubject[] | null>(\n      'https://advert-api.wildberries.ru/adv/v1/supplier/subjects',\n      { params: params ? { ...params } : undefined, rateLimitKey: 'promotion.getSupplierSubjects' }\n    );\n  }\n\n  /**\n   * Список карточек товаров продавца\n   *\n   * Метод возвращает список карточек товаров по указанным предметам.\n   * Используется для получения артикулов WB для добавления в кампанию.\n   *\n   * Rate limit:\n   * | Период | Лимит | Интервал | Всплеск |\n   * | --- | --- | --- | --- |\n   * | 1 мин | 5 запросов | 12 сек | 5 запросов |\n   *\n   * @param subjectIds - Массив ID предметов\n   * @returns Список карточек товаров\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @see {@link https://dev.wildberries.ru/openapi/promotion#tag/Sozdanie-kampanij}\n   * @example\n   * ```typescript\n   * const products = await sdk.promotion.getSupplierNms([123, 456]);\n   * for (const product of products) {\n   *   console.log(`${product.title} (nmId: ${product.nm})`);\n   * }\n   * ```\n   */\n  async getSupplierNms(subjectIds: number[]): Promise<SupplierNmItem[]> {\n    return this.client.post<SupplierNmItem[]>(\n      'https://advert-api.wildberries.ru/adv/v2/supplier/nms',\n      subjectIds,\n      { rateLimitKey: 'promotion.getSupplierNms' }\n    );\n  }\n\n  /**\n   * Запуск кампании\n   *\n   * Метод запускает кампании в статусах:\n   * - `4` — готова к запуску\n   * - `11` — на паузе\n   *\n   * Rate limit:\n   * | Период | Лимит | Интервал | Всплеск |\n   * | --- | --- | --- | --- |\n   * | 1 сек | 5 запросов | 200 мс | 5 запросов |\n   *\n   * @param id - ID кампании\n   * @returns void\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When campaign is in wrong status (400)\n   * @see {@link https://dev.wildberries.ru/openapi/promotion#tag/Upravlenie-kampaniyami}\n   * @example\n   * ```typescript\n   * await sdk.promotion.startCampaign(12345);\n   * console.log('Campaign started successfully');\n   * ```\n   */\n  async startCampaign(id: number): Promise<void> {\n    return this.client.get('https://advert-api.wildberries.ru/adv/v0/start', {\n      params: { id },\n      rateLimitKey: 'promotion.startCampaign',\n    });\n  }\n\n  /**\n   * Пауза кампании\n   *\n   * Метод ставит кампании на паузу. Работает только для кампаний в статусе:\n   * - `9` — активна\n   *\n   * Rate limit:\n   * | Период | Лимит | Интервал | Всплеск |\n   * | --- | --- | --- | --- |\n   * | 1 сек | 5 запросов | 200 мс | 5 запросов |\n   *\n   * @param id - ID кампании\n   * @returns void\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When campaign is in wrong status (400)\n   * @see {@link https://dev.wildberries.ru/openapi/promotion#tag/Upravlenie-kampaniyami}\n   * @example\n   * ```typescript\n   * await sdk.promotion.pauseCampaign(12345);\n   * console.log('Campaign paused successfully');\n   * ```\n   */\n  async pauseCampaign(id: number): Promise<void> {\n    return this.client.get('https://advert-api.wildberries.ru/adv/v0/pause', {\n      params: { id },\n      rateLimitKey: 'promotion.pauseCampaign',\n    });\n  }\n\n  // ============================================================================\n  // Minus Phrases Methods (task-54) - New naming convention\n  // ============================================================================\n\n  /**\n   * Получить минус-фразы для кампаний\n   *\n   * Возвращает список минус-фраз по ID кампаний и артикулам WB.\n   *\n   * **nm_id по типу кампании:**\n   * - Type 8 (устаревший): nm_id=0 для всей кампании\n   * - Type 9 (актуальный): nm_id = реальный артикул WB\n   *\n   * Rate limit: 5 requests per second, 200ms interval, burst 10\n   *\n   * @param request - Запрос с массивом items (max 100)\n   * @returns Promise<GetMinusPhrasesResponse>\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/promotion#tag/Poiskovye-klastery/paths/~1adv~1v0~1normquery~1get-minus/post}\n   * @example\n   * ```typescript\n   * const result = await sdk.promotion.getMinusPhrases({\n   *   items: [{ advert_id: 123456, nm_id: 789012 }]\n   * });\n   * console.log(result.items[0].norm_queries); // ['фраза1', 'фраза2']\n   * ```\n   */\n  async getMinusPhrases(request: GetMinusPhrasesRequest): Promise<GetMinusPhrasesResponse> {\n    return this.client.post<GetMinusPhrasesResponse>(\n      'https://advert-api.wildberries.ru/adv/v0/normquery/get-minus',\n      request,\n      { rateLimitKey: 'promotion.getMinusPhrases' }\n    );\n  }\n\n  /**\n   * Установить минус-фразы для кампании\n   *\n   * Устанавливает минус-фразы в кампаниях с ручной ставкой и CPM.\n   *\n   * **ВАЖНО:** Отправка пустого массива norm_queries УДАЛЯЕТ ВСЕ минус-фразы!\n   *\n   * **nm_id по типу кампании:**\n   * - Type 8: nm_id=0 для настроек всей кампании\n   * - Type 9: nm_id = реальный артикул WB\n   *\n   * Rate limit: 5 requests per second, 200ms interval, burst 10\n   *\n   * @param request - Запрос (max 1000 norm_queries)\n   * @returns Promise<void>\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/promotion#tag/Poiskovye-klastery/paths/~1adv~1v0~1normquery~1set-minus/post}\n   * @example\n   * ```typescript\n   * // Установить минус-фразы\n   * await sdk.promotion.setMinusPhrases({\n   *   advert_id: 123456,\n   *   nm_id: 789012,\n   *   norm_queries: ['нежелательная фраза', 'другая фраза']\n   * });\n   *\n   * // Удалить ВСЕ минус-фразы\n   * await sdk.promotion.setMinusPhrases({\n   *   advert_id: 123456,\n   *   nm_id: 789012,\n   *   norm_queries: []  // УДАЛЯЕТ ВСЕ!\n   * });\n   * ```\n   */\n  async setMinusPhrases(request: SetMinusPhrasesRequest): Promise<void> {\n    await this.client.post(\n      'https://advert-api.wildberries.ru/adv/v0/normquery/set-minus',\n      request,\n      { rateLimitKey: 'promotion.setMinusPhrases' }\n    );\n  }\n\n  // ============================================================================\n  // Search Cluster Statistics (task-55) - New naming convention\n  // ============================================================================\n\n  /**\n   * Получить статистику поисковых кластеров\n   *\n   * Возвращает статистику по поисковым кластерам за период.\n   *\n   * Поддерживает кампании cpm и cpc. Для cpc-кампаний поля `views`, `ctr`, `cpm` отсутствуют в ответе.\n   *\n   * **nm_id по типу кампании:**\n   * - Type 8: nm_id=0 для агрегированной статистики\n   * - Type 9: nm_id = реальный артикул WB\n   *\n   * Rate limit: 10 requests per minute, 6 second interval, burst 20\n   *\n   * @param request - Запрос с периодом и items (max 100)\n   * @returns Promise<GetSearchClusterStatsResponse>\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/promotion#tag/Statistika/paths/~1adv~1v0~1normquery~1stats/post}\n   * @example\n   * ```typescript\n   * const stats = await sdk.promotion.getSearchClusterStats({\n   *   from: '2026-02-01',\n   *   to: '2026-02-09',\n   *   items: [{ advert_id: 123456, nm_id: 789012 }]\n   * });\n   * // stats.stats[0].stats[0].norm_query = \"фраза\"\n   * // stats.stats[0].stats[0].views = 1949\n   * ```\n   */\n  async getSearchClusterStats(\n    request: GetSearchClusterStatsRequest\n  ): Promise<GetSearchClusterStatsResponse> {\n    return this.client.post<GetSearchClusterStatsResponse>(\n      'https://advert-api.wildberries.ru/adv/v0/normquery/stats',\n      request,\n      { rateLimitKey: 'promotion.getSearchClusterStats' }\n    );\n  }\n\n  // ============================================================================\n  // V1 API Methods with kopecks (bid_kopecks)\n  // ============================================================================\n\n  /**\n   * Изменение ставок в кампаниях (V1 API с копейками)\n   *\n   * Меняет ставки карточек товаров по артикулам WB в кампаниях с единой или ручной ставкой.\n   * Для кампаний в статусах 4, 9 и 11.\n   *\n   * **ВАЖНО**: Ставки указываются в КОПЕЙКАХ (bid_kopecks), не в рублях!\n   *\n   * Rate limit: 5 requests per second, 200ms interval, burst 5\n   *\n   * @param data - Request body with bids in kopecks\n   * @returns Updated bids\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/promotion#tag/Upravlenie-kampaniyami/paths/~1api~1advert~1v1~1bids/patch}\n   * @example\n   * ```typescript\n   * const result = await sdk.promotion.updateBids({\n   *   bids: [{\n   *     advert_id: 12345,\n   *     nm_bids: [{\n   *       nm_id: 13335157,\n   *       bid_kopecks: 250, // = 2.50 RUB\n   *       placement: 'recommendations'\n   *     }]\n   *   }]\n   * });\n   * ```\n   */\n  async updateBids(data: UpdateBidsRequest): Promise<UpdateBidsResponse> {\n    return this.client.patch<UpdateBidsResponse>(\n      'https://advert-api.wildberries.ru/api/advert/v1/bids',\n      data,\n      { rateLimitKey: 'promotion.updateBids' }\n    );\n  }\n\n  /**\n   * Управление товарами в кампаниях\n   *\n   * Добавляет и удаляет карточки товаров в кампаниях типа 9.\n   * Для кампаний в статусах 4, 9 и 11.\n   * Для добавляемых товаров устанавливается текущая минимальная ставка.\n   *\n   * Rate limit: 1 request per second, 1000ms interval, burst 1\n   *\n   * @param data - Request body with campaigns and products to add/delete\n   * @returns Results of product updates\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/promotion#tag/Upravlenie-kampaniyami/paths/~1adv~1v0~1auction~1nms/patch}\n   * @example\n   * ```typescript\n   * const result = await sdk.promotion.updateCampaignProducts({\n   *   campaigns: [{\n   *     advert_id: 12345,\n   *     add_nms: [111, 222],\n   *     delete_nms: [333]\n   *   }]\n   * });\n   * ```\n   */\n  async updateCampaignProducts(\n    data: UpdateCampaignProductsRequest\n  ): Promise<UpdateCampaignProductsResponse> {\n    return this.client.patch<UpdateCampaignProductsResponse>(\n      'https://advert-api.wildberries.ru/adv/v0/auction/nms',\n      {\n        nms: data.campaigns.map((c: CampaignProductsUpdate) => ({\n          advert_id: c.advert_id,\n          nms: { add: c.add_nms, delete: c.delete_nms },\n        })),\n      },\n      { rateLimitKey: 'promotion.updateCampaignProducts' }\n    );\n  }\n}\n","/**\n * Auto-generated module\n * Generated from: wildberries_api_doc/10-tariffs.yaml\n * DO NOT EDIT MANUALLY - Changes will be overwritten on next generation\n */\n\nimport { BaseClient } from '../../client/base-client';\nimport type {\n  Commission,\n  CommissionChina,\n  CommissionTurkey,\n  CommissionUAE,\n  CommissionUzbekistan,\n  ReturnTariffsResponse,\n  TariffsBoxResponse,\n  TariffsPalletResponse,\n  ModelsAcceptanceCoefficient,\n} from '../../types/tariffs.types';\n\nexport class TariffsModule {\n  constructor(private client: BaseClient) {}\n\n  /**\n   * Комиссия по категориям товаров\n   *\n   * Метод возвращает данные о [комиссии](https://seller.wildberries.ru/dynamic-product-categories/commission) WB по [родительским категориям товаров](/openapi/work-with-products#tag/Kategorii-predmety-i-harakteristiki/paths/~1content~1v2~1object~1parent~1all/get) согласно модели продаж. <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 минута | 1 запрос | 1 минута | 2 запроса | </div>\n   *\n   * @param [options] - Query parameters\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * // Get commission rates (default locale)\n   * const result = await sdk.tariffs.getTariffsCommission();\n   * console.log(result);\n   *\n   * @example\n   * // Get commission rates with English locale\n   * const result = await sdk.tariffs.getTariffsCommission({ locale: 'en' });\n   * console.log(result);\n   */\n  async getTariffsCommission(options?: {\n    locale?: string;\n  }): Promise<\n    Commission | CommissionChina | CommissionTurkey | CommissionUzbekistan | CommissionUAE\n  > {\n    return this.client.get<\n      Commission | CommissionChina | CommissionTurkey | CommissionUzbekistan | CommissionUAE\n    >('https://common-api.wildberries.ru/api/v1/tariffs/commission', {\n      params: options,\n      rateLimitKey: 'tariffs.tariffsCommission',\n    });\n  }\n\n  /**\n   * Тарифы для коробов\n   *\n   * Для товаров, которые поставляются на склад в коробах, метод возвращает [тарифы на остаток](https://seller.wildberries.ru/dynamic-product-categories): - доставка со склада или пункта приёма до покупателя - доставка от покупателя до пункта приёма - хранение на складе WB <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 минута | 60 запросов | 1 секунда | 5 запросов | </div>\n   *\n   * @param date - Date for tariffs in YYYY-MM-DD format (required)\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.tariffs.getTariffsBox('2024-01-15');\n   * console.log(result);\n   */\n  async getTariffsBox(date: string): Promise<TariffsBoxResponse> {\n    return this.client.get<TariffsBoxResponse>(\n      'https://common-api.wildberries.ru/api/v1/tariffs/box',\n      { params: { date }, rateLimitKey: 'tariffs.tariffsBox' }\n    );\n  }\n\n  /**\n   * Тарифы для монопаллет\n   *\n   * Для товаров, которые поставляются на склад WB на монопаллетах, метод возвращает [стоимость](https://seller.wildberries.ru/dynamic-product-categories): - доставки со склада до покупателя - доставки от покупателя до склада - хранения на складе WB <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 минута | 60 запросов | 1 секунда | 5 запросов | </div>\n   *\n   * @param date - Date for tariffs in YYYY-MM-DD format (required)\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.tariffs.getTariffsPallet('2024-01-15');\n   * console.log(result);\n   */\n  async getTariffsPallet(date: string): Promise<TariffsPalletResponse> {\n    return this.client.get<TariffsPalletResponse>(\n      'https://common-api.wildberries.ru/api/v1/tariffs/pallet',\n      { params: { date }, rateLimitKey: 'tariffs.tariffsPallet' }\n    );\n  }\n\n  /**\n   * Тарифы на возврат\n   *\n   * Метод возвращает [тарифы](https://seller.wildberries.ru/dynamic-product-categories/return-cost): - на перевозку товаров со склада WB или из пункта приёма до продавца - на обратную перевозку возвратов, которые не забрал продавец <div class=\"description_limit\"> <a href=\"/openapi/api-information#tag/Vvedenie/Limity-zaprosov\">Лимит запросов</a> на один аккаунт продавца: | Период | Лимит | Интервал | Всплеск | | --- | --- | --- | --- | | 1 минута | 60 запросов | 1 секунда | 5 запросов | </div>\n   *\n   * @param date - Date for tariffs in YYYY-MM-DD format (required)\n   * @returns Успешно\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.tariffs.getTariffsReturn('2024-01-15');\n   * console.log(result);\n   */\n  async getTariffsReturn(date: string): Promise<ReturnTariffsResponse> {\n    return this.client.get<ReturnTariffsResponse>(\n      'https://common-api.wildberries.ru/api/v1/tariffs/return',\n      { params: { date }, rateLimitKey: 'tariffs.tariffsReturn' }\n    );\n  }\n\n  /**\n   * Тарифы на поставку\n   *\n   * Метод возвращает тарифы на поставку для конкретных складов на ближайшие 14 дней.\n   *\n   * Приёмка для поставки доступна только при сочетании:\n   * - `coefficient` — `0` или `1`\n   * - `allowUnload` — `true`\n   *\n   * Rate limit: 6 requests per minute, 10 second interval, burst 6\n   *\n   * @param options - Query parameters\n   * @param options.warehouseIDs - Warehouse IDs, comma-separated. Returns all warehouses by default\n   * @returns Array of acceptance coefficients for the next 14 days\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * // Get coefficients for all warehouses\n   * const allCoeffs = await sdk.tariffs.getAcceptanceCoefficients();\n   * console.log(allCoeffs);\n   *\n   * @example\n   * // Get coefficients for specific warehouses\n   * const coeffs = await sdk.tariffs.getAcceptanceCoefficients({ warehouseIDs: '507,117501' });\n   * console.log(coeffs);\n   */\n  async getAcceptanceCoefficients(options?: {\n    warehouseIDs?: string;\n  }): Promise<ModelsAcceptanceCoefficient[]> {\n    return this.client.get<ModelsAcceptanceCoefficient[]>(\n      'https://common-api.wildberries.ru/api/tariffs/v1/acceptance/coefficients',\n      { params: options, rateLimitKey: 'tariffs.acceptanceCoefficients' }\n    );\n  }\n}\n","/**\n * In-Store Pickup Module\n * Generated from: wildberries_api_doc/06-in-store-pickup.yaml\n *\n * Provides methods for managing click-and-collect (self-pickup) orders,\n * including assembly task lifecycle, customer verification, and metadata management.\n *\n * @module modules/in-store-pickup\n */\n\nimport { BaseClient } from '../../client/base-client';\nimport type {\n  ApiCheckIdentityRequest,\n  ApiCheckedIdentity,\n  ApiGTINRequest,\n  ApiIMEIRequest,\n  ApiNewOrders,\n  ApiOrderClientInfoResp,\n  ApiOrderStatuses,\n  ApiOrders,\n  ApiOrdersMeta,\n  ApiOrdersRequest,\n  ApiSGTINsRequest,\n  ApiUINRequest,\n} from '../../types/in-store-pickup.types';\n\nexport class InStorePickupModule {\n  constructor(private client: BaseClient) {}\n\n  /**\n   * Получить список новых сборочных заданий\n   *\n   * Метод возвращает список всех новых сборочных заданий, которые есть у продавца на момент запроса.\n   *\n   * @returns Список новых сборочных заданий\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.inStorePickup.getOrdersNew();\n   * console.log(result);\n   */\n  async getOrdersNew(): Promise<ApiNewOrders> {\n    return this.client.get<ApiNewOrders>(\n      'https://marketplace-api.wildberries.ru/api/v3/click-collect/orders/new',\n      { rateLimitKey: 'in-store-pickup.clickCollectOrdersNew' }\n    );\n  }\n\n  /**\n   * Перевести на сборку\n   *\n   * Метод переводит сборочное задание в статус confirm — на сборке.\n   *\n   * @param orderId - ID сборочного задания\n   * @returns Response data\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * await sdk.inStorePickup.updateOrdersConfirm(12345);\n   */\n  async updateOrdersConfirm(orderId: number): Promise<void> {\n    return this.client.patch(\n      `https://marketplace-api.wildberries.ru/api/v3/click-collect/orders/${orderId}/confirm`,\n      {},\n      { rateLimitKey: 'in-store-pickup.patchClickCollectOrdersConfirm' }\n    );\n  }\n\n  /**\n   * Сообщить, что сборочное задание готово к выдаче\n   *\n   * Метод переводит сборочное задание в статус prepare — готово к выдаче.\n   *\n   * @param orderId - ID сборочного задания\n   * @returns Response data\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * await sdk.inStorePickup.updateOrdersPrepare(12345);\n   */\n  async updateOrdersPrepare(orderId: number): Promise<void> {\n    return this.client.patch(\n      `https://marketplace-api.wildberries.ru/api/v3/click-collect/orders/${orderId}/prepare`,\n      {},\n      { rateLimitKey: 'in-store-pickup.patchClickCollectOrdersPrepare' }\n    );\n  }\n\n  /**\n   * Информация о покупателе\n   *\n   * Метод возвращает информацию о покупателе по ID сборочного задания.\n   * Доступно только для сборочных заданий в статусах confirm и prepare.\n   *\n   * @param data - Request body data\n   * @returns Информация о покупателе\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.inStorePickup.createOrdersClient({ orders: [12345] });\n   * console.log(result);\n   */\n  async createOrdersClient(data: ApiOrdersRequest): Promise<ApiOrderClientInfoResp> {\n    return this.client.post<ApiOrderClientInfoResp>(\n      'https://marketplace-api.wildberries.ru/api/v3/click-collect/orders/client',\n      data,\n      { rateLimitKey: 'in-store-pickup.postClickCollectOrdersClient' }\n    );\n  }\n\n  /**\n   * Проверить, что заказ принадлежит покупателю\n   *\n   * Метод сообщает, принадлежит ли проверяемый заказ покупателю или нет по переданному коду.\n   * Доступно, если хотя бы одно сборочное задание из заказа находится в статусе prepare.\n   *\n   * @param data - Request body data\n   * @returns Результат проверки идентификации\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.inStorePickup.createClientIdentity({ orderCode: '170046918-0011', passcode: '4567' });\n   * console.log(result);\n   */\n  async createClientIdentity(data: ApiCheckIdentityRequest): Promise<ApiCheckedIdentity> {\n    return this.client.post<ApiCheckedIdentity>(\n      'https://marketplace-api.wildberries.ru/api/v3/click-collect/orders/client/identity',\n      data,\n      { rateLimitKey: 'in-store-pickup.postClickCollectOrdersClientIdentity' }\n    );\n  }\n\n  /**\n   * Сообщить, что заказ принят покупателем\n   *\n   * Метод переводит сборочное задание в статус receive — получено покупателем.\n   *\n   * @param orderId - ID сборочного задания\n   * @returns Response data\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * await sdk.inStorePickup.updateOrdersReceive(12345);\n   */\n  async updateOrdersReceive(orderId: number): Promise<void> {\n    return this.client.patch(\n      `https://marketplace-api.wildberries.ru/api/v3/click-collect/orders/${orderId}/receive`,\n      {},\n      { rateLimitKey: 'in-store-pickup.patchClickCollectOrdersReceive' }\n    );\n  }\n\n  /**\n   * Сообщить, что покупатель отказался от заказа\n   *\n   * Метод переводит сборочное задание в статус reject — отказ при получении.\n   *\n   * @param orderId - ID сборочного задания\n   * @returns Response data\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * await sdk.inStorePickup.updateOrdersReject(12345);\n   */\n  async updateOrdersReject(orderId: number): Promise<void> {\n    return this.client.patch(\n      `https://marketplace-api.wildberries.ru/api/v3/click-collect/orders/${orderId}/reject`,\n      {},\n      { rateLimitKey: 'in-store-pickup.patchClickCollectOrdersReject' }\n    );\n  }\n\n  /**\n   * Получить статусы сборочных заданий\n   *\n   * Метод возвращает статусы сборочных заданий по их ID.\n   *\n   * @param data - Request body data\n   * @returns Статусы сборочных заданий\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.inStorePickup.createOrdersStatus({ orders: [12345] });\n   * console.log(result);\n   */\n  async createOrdersStatus(data: ApiOrdersRequest): Promise<ApiOrderStatuses> {\n    return this.client.post<ApiOrderStatuses>(\n      'https://marketplace-api.wildberries.ru/api/v3/click-collect/orders/status',\n      data,\n      { rateLimitKey: 'in-store-pickup.postClickCollectOrdersStatus' }\n    );\n  }\n\n  /**\n   * Получить информацию о завершённых сборочных заданиях\n   *\n   * Метод возвращает информацию о завершённых сборочных заданиях после продажи или отмены заказа.\n   * Можно получить данные за заданный период, максимум 30 календарных дней одним запросом.\n   *\n   * @param [options] - Query parameters\n   * @returns Список завершённых сборочных заданий\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.inStorePickup.getClickCollectOrders({ limit: 10, next: 0, dateFrom: 0, dateTo: 0 });\n   * console.log(result);\n   */\n  async getClickCollectOrders(options: {\n    limit: number;\n    next: number;\n    dateFrom: number;\n    dateTo: number;\n  }): Promise<ApiOrders> {\n    return this.client.get<ApiOrders>(\n      'https://marketplace-api.wildberries.ru/api/v3/click-collect/orders',\n      { params: options, rateLimitKey: 'in-store-pickup.clickCollectOrders' }\n    );\n  }\n\n  /**\n   * Отменить сборочное задание\n   *\n   * Метод отменяет сборочное задание и переводит в статус cancel — отменено продавцом.\n   *\n   * @param orderId - ID сборочного задания\n   * @returns Response data\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * await sdk.inStorePickup.updateOrdersCancel(12345);\n   */\n  async updateOrdersCancel(orderId: number): Promise<void> {\n    return this.client.patch(\n      `https://marketplace-api.wildberries.ru/api/v3/click-collect/orders/${orderId}/cancel`,\n      {},\n      { rateLimitKey: 'in-store-pickup.patchClickCollectOrdersCancel' }\n    );\n  }\n\n  /**\n   * Получить метаданные сборочного задания\n   *\n   * Метод возвращает метаданные сборочного задания.\n   * Перечень метаданных, доступных для сборочного задания, можно получить в списке новых сборочных заданий, поле requiredMeta.\n   *\n   * @param orderId - ID сборочного задания\n   * @returns Метаданные сборочного задания\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * const result = await sdk.inStorePickup.getOrdersMeta(12345);\n   * console.log(result);\n   */\n  async getOrdersMeta(orderId: number): Promise<ApiOrdersMeta> {\n    return this.client.get<ApiOrdersMeta>(\n      `https://marketplace-api.wildberries.ru/api/v3/click-collect/orders/${orderId}/meta`,\n      { rateLimitKey: 'in-store-pickup.clickCollectOrdersMeta' }\n    );\n  }\n\n  /**\n   * Удалить метаданные сборочного задания\n   *\n   * Метод удаляет значение метаданных сборочного задания для переданного ключа.\n   * Возможные метаданные: imei, uin, gtin, sgtin. Передается только одно значение.\n   *\n   * @param orderId - ID сборочного задания\n   * @param options - Query parameters\n   * @param options.key - Metadata key to delete (imei, uin, gtin, sgtin)\n   * @returns Response data\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * await sdk.inStorePickup.deleteOrdersMeta(12345, { key: 'imei' });\n   */\n  async deleteOrdersMeta(orderId: number, options: { key: string }): Promise<void> {\n    return this.client.delete(\n      `https://marketplace-api.wildberries.ru/api/v3/click-collect/orders/${orderId}/meta`,\n      {},\n      { params: options, rateLimitKey: 'in-store-pickup.deleteClickCollectOrdersMeta' }\n    );\n  }\n\n  /**\n   * Закрепить за сборочным заданием код маркировки товара (SGTIN)\n   *\n   * Метод закрепляет за сборочным заданием код маркировки Честный знак.\n   * Закрепить код маркировки можно только, если в метаданных есть поле sgtins,\n   * а сборочное задание находится в статусе confirm.\n   *\n   * @param orderId - ID сборочного задания\n   * @param data - Request body data\n   * @returns Response data\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * await sdk.inStorePickup.updateMetaSgtin(12345, { sgtins: ['1234567890123456'] });\n   */\n  async updateMetaSgtin(orderId: number, data: ApiSGTINsRequest): Promise<void> {\n    return this.client.put(\n      `https://marketplace-api.wildberries.ru/api/v3/click-collect/orders/${orderId}/meta/sgtin`,\n      data,\n      { rateLimitKey: 'in-store-pickup.putClickCollectOrdersMetaSgtin' }\n    );\n  }\n\n  /**\n   * Закрепить за сборочным заданием УИН (уникальный идентификационный номер)\n   *\n   * Метод обновляет УИН сборочного задания. У одного сборочного задания может быть только один УИН.\n   * Добавлять маркировку можно только для сборочных заданий в статусе confirm.\n   *\n   * @param orderId - ID сборочного задания\n   * @param data - Request body data\n   * @returns Response data\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * await sdk.inStorePickup.updateMetaUin(12345, { uin: '1234567890123456' });\n   */\n  async updateMetaUin(orderId: number, data: ApiUINRequest): Promise<void> {\n    return this.client.put(\n      `https://marketplace-api.wildberries.ru/api/v3/click-collect/orders/${orderId}/meta/uin`,\n      data,\n      { rateLimitKey: 'in-store-pickup.putClickCollectOrdersMetaUin' }\n    );\n  }\n\n  /**\n   * Закрепить за сборочным заданием IMEI\n   *\n   * Метод обновляет IMEI сборочного задания. У одного сборочного задания может быть только один IMEI.\n   * Добавлять маркировку можно только для сборочных заданий в статусе confirm.\n   *\n   * @param orderId - ID сборочного задания\n   * @param data - Request body data\n   * @returns Response data\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * await sdk.inStorePickup.updateMetaImei(12345, { imei: '123456789012345' });\n   */\n  async updateMetaImei(orderId: number, data: ApiIMEIRequest): Promise<void> {\n    return this.client.put(\n      `https://marketplace-api.wildberries.ru/api/v3/click-collect/orders/${orderId}/meta/imei`,\n      data,\n      { rateLimitKey: 'in-store-pickup.putClickCollectOrdersMetaImei' }\n    );\n  }\n\n  /**\n   * Закрепить за сборочным заданием GTIN\n   *\n   * Метод обновляет GTIN (уникальный ID товара в Беларуси) сборочного задания.\n   * У одного сборочного задания может быть только один GTIN.\n   * Добавлять маркировку можно только для сборочных заданий в статусе confirm.\n   *\n   * @param orderId - ID сборочного задания\n   * @param data - Request body data\n   * @returns Response data\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @example\n   * await sdk.inStorePickup.updateMetaGtin(12345, { gtin: '1234567890123456' });\n   */\n  async updateMetaGtin(orderId: number, data: ApiGTINRequest): Promise<void> {\n    return this.client.put(\n      `https://marketplace-api.wildberries.ru/api/v3/click-collect/orders/${orderId}/meta/gtin`,\n      data,\n      { rateLimitKey: 'in-store-pickup.putClickCollectOrdersMetaGtin' }\n    );\n  }\n}\n","/**\n * Orders DBS Module - Delivery by Seller\n * Generated from: wildberries_api_doc/04-orders-dbs.yaml\n *\n * Provides methods for managing DBS (Delivery by Seller) orders where\n * sellers handle both storage AND delivery directly to customers.\n *\n * Key DBS Characteristics:\n * - Direct Delivery: Seller delivers to customer's address (not pickup points)\n * - Customer Contact: Access to customer phone and full address with coordinates\n * - Delivery Windows: Specific delivery date/time windows (dTimeFrom, dTimeTo)\n * - Required Metadata: Orders may require IMEI, UIN, GTIN, SGTIN, or customs declarations\n *\n * @module orders-dbs\n */\n\nimport { BaseClient } from '../../client/base-client';\nimport { ValidationError } from '../../errors';\nimport type {\n  GetNewOrdersResponse,\n  GetOrdersParams,\n  GetOrdersResponse,\n  GetClientInfoResponse,\n  GetB2BInfoResponse,\n  GetStatusInfoResponse,\n  BulkStatusChangeResponse,\n  OrderCodeRequest,\n  OrderGroupsRequest,\n  OrderGroupsResponse,\n  DeliveryDatesRequest,\n  DeliveryDatesInfoResponse,\n  GetMetaBulkRequest,\n  GetOrderMetaBulkResponse,\n  DeleteMetaBulkRequest,\n  DeleteMetaBulkResponse,\n  SetSgtinBulkRequest,\n  SetUinBulkRequest,\n  SetImeiBulkRequest,\n  SetGtinBulkRequest,\n  SetCustomsDeclarationBulkRequest,\n  SetMetaBulkResponse,\n} from '../../types/orders-dbs.types';\n\n/** Base URL for DBS API endpoints */\nconst BASE_URL = 'https://marketplace-api.wildberries.ru';\n\n/** Maximum date range in seconds (30 days) */\nconst MAX_DATE_RANGE_SECONDS = 30 * 24 * 60 * 60;\n\n/**\n * Orders DBS Module for managing Delivery by Seller orders\n *\n * DBS (Delivery by Seller) is a fulfillment model where sellers handle\n * both storage AND delivery directly to customers. Unlike FBS (where WB\n * delivers to pickup points) or FBW (where WB stores and delivers),\n * DBS gives sellers full control over the delivery process.\n *\n * @example\n * ```typescript\n * const sdk = new WildberriesSDK({ apiKey: 'your-api-key' });\n *\n * // Get new orders awaiting processing\n * const newOrders = await sdk.ordersDBS.getNewOrders();\n *\n * // Get customer contact info for delivery coordination\n * const clientInfo = await sdk.ordersDBS.getClientInfo([123456]);\n * ```\n */\nexport class OrdersDbsModule {\n  constructor(private client: BaseClient) {}\n\n  /**\n   * Get list of new DBS assembly tasks\n   *\n   * Returns all new orders awaiting processing. Each order includes:\n   * - Customer address with GPS coordinates for delivery routing\n   * - Delivery window (ddate, dTimeFrom, dTimeTo)\n   * - requiredMeta indicating which metadata must be added before shipping\n   *\n   * Rate limit: 300 requests/min, 200ms interval, 20 burst\n   *\n   * @returns Promise resolving to list of new DBS orders\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {NetworkError} When network request fails\n   *\n   * @see {@link https://dev.wildberries.ru/openapi/orders-dbs#tag/Sborochnye-zadaniya-DBS/paths/~1api~1v3~1dbs~1orders~1new/get}\n   *\n   * @example\n   * ```typescript\n   * const newOrders = await sdk.ordersDBS.getNewOrders();\n   *\n   * for (const order of newOrders.orders ?? []) {\n   *   console.log(`Order ${order.id}: ${order.address?.fullAddress}`);\n   *   console.log(`Delivery: ${order.ddate} ${order.dTimeFrom}-${order.dTimeTo}`);\n   *\n   *   if (order.requiredMeta && order.requiredMeta.length > 0) {\n   *     console.log(`Required metadata: ${order.requiredMeta.join(', ')}`);\n   *   }\n   * }\n   * ```\n   */\n  async getNewOrders(): Promise<GetNewOrdersResponse> {\n    return this.client.get<GetNewOrdersResponse>(`${BASE_URL}/api/v3/dbs/orders/new`, {\n      rateLimitKey: 'orders-dbs.getNewOrders',\n    });\n  }\n\n  /**\n   * Get completed DBS orders with pagination and date filtering\n   *\n   * Returns orders that have been completed (delivered) or cancelled.\n   * Maximum 30 calendar days per request.\n   *\n   * Rate limit: 300 requests/min, 200ms interval, 20 burst\n   *\n   * @param params - Query parameters for filtering and pagination\n   * @param params.limit - Number of orders to return (1-1000)\n   * @param params.next - Pagination cursor (0 for first request)\n   * @param params.dateFrom - Start date as Unix timestamp\n   * @param params.dateTo - End date as Unix timestamp\n   * @returns Promise resolving to orders and next pagination cursor\n   * @throws {ValidationError} When parameters are invalid (limit out of range, date range > 30 days)\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {NetworkError} When network request fails\n   *\n   * @see {@link https://dev.wildberries.ru/openapi/orders-dbs#tag/Zakazy-DBS/paths/~1api~1v3~1dbs~1orders/get}\n   *\n   * @example\n   * ```typescript\n   * // Get orders from last 7 days with pagination\n   * const now = Math.floor(Date.now() / 1000);\n   * const weekAgo = now - 7 * 24 * 60 * 60;\n   *\n   * let next = 0;\n   * do {\n   *   const result = await sdk.ordersDBS.getOrders({\n   *     limit: 100,\n   *     next,\n   *     dateFrom: weekAgo,\n   *     dateTo: now\n   *   });\n   *\n   *   console.log(`Fetched ${result.orders?.length ?? 0} orders`);\n   *   next = result.next ?? 0;\n   * } while (next > 0);\n   * ```\n   */\n  async getOrders(params: GetOrdersParams): Promise<GetOrdersResponse> {\n    // Validate limit range\n    if (params.limit < 1 || params.limit > 1000) {\n      throw new ValidationError('limit must be between 1 and 1000');\n    }\n\n    // Validate next cursor\n    if (params.next < 0) {\n      throw new ValidationError('next must be >= 0');\n    }\n\n    // Validate date range (max 30 days)\n    const dateRange = params.dateTo - params.dateFrom;\n    if (dateRange > MAX_DATE_RANGE_SECONDS) {\n      throw new ValidationError('Date range cannot exceed 30 calendar days');\n    }\n\n    if (dateRange < 0) {\n      throw new ValidationError('dateFrom must be less than or equal to dateTo');\n    }\n\n    return this.client.get<GetOrdersResponse>(`${BASE_URL}/api/v3/dbs/orders`, {\n      params: {\n        limit: params.limit,\n        next: params.next,\n        dateFrom: params.dateFrom,\n        dateTo: params.dateTo,\n      },\n      rateLimitKey: 'orders-dbs.getOrders',\n    });\n  }\n\n  /**\n   * Get customer contact information for DBS orders\n   *\n   * Returns customer name, phone number, and additional contact codes.\n   * Use this to contact customers for delivery coordination.\n   *\n   * Rate limit: 300 requests/min, 200ms interval, 20 burst\n   *\n   * @param orderIds - Array of order IDs to get client info for\n   * @returns Promise resolving to customer contact information\n   * @throws {ValidationError} When orderIds array is empty\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {NotFoundError} When order not found (404)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {NetworkError} When network request fails\n   *\n   * @see {@link https://dev.wildberries.ru/openapi/orders-dbs#tag/Zakazy-DBS/paths/~1api~1v3~1dbs~1orders~1client/post}\n   *\n   * @example\n   * ```typescript\n   * const clientInfo = await sdk.ordersDBS.getClientInfo([123456, 234567]);\n   *\n   * for (const client of clientInfo.orders ?? []) {\n   *   console.log(`Order ${client.orderID}:`);\n   *   console.log(`  Name: ${client.fullName}`);\n   *   console.log(`  Phone: +${client.phoneCode}${client.phone}`);\n   * }\n   * ```\n   */\n  async getClientInfo(orderIds: number[]): Promise<GetClientInfoResponse> {\n    // Validate orderIds array\n    if (orderIds.length === 0) {\n      throw new ValidationError('orderIds array cannot be empty');\n    }\n\n    return this.client.post<GetClientInfoResponse>(\n      `${BASE_URL}/api/v3/dbs/orders/client`,\n      { orders: orderIds },\n      { rateLimitKey: 'orders-dbs.getClientInfo' }\n    );\n  }\n\n  /**\n   * Get B2B buyer information for DBS orders\n   *\n   * Returns B2B buyer details (organization name, INN, KPP) for orders\n   * placed by business customers. For B2C orders, returns an error\n   * indicating the order is not a B2B order.\n   *\n   * Note: Individual Entrepreneurs (IP) may have empty KPP field\n   * and a 12-digit INN instead of 10-digit INN for legal entities.\n   *\n   * Rate limit: Standard DBS rate limits apply\n   *\n   * @param orderIds - Array of order IDs to get B2B info for (1-1000 items)\n   * @returns Promise resolving to B2B buyer information for each order\n   * @throws {ValidationError} When orderIds array is empty or exceeds 1000 items\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {NetworkError} When network request fails\n   *\n   * @see {@link https://dev.wildberries.ru/openapi/orders-dbs#tag/B2B}\n   *\n   * @example\n   * ```typescript\n   * const b2bInfo = await sdk.ordersDBS.getB2BInfo([123456, 234567]);\n   *\n   * for (const result of b2bInfo.results ?? []) {\n   *   if (result.isError) {\n   *     console.log(`Order ${result.orderId}: Not a B2B order`);\n   *   } else {\n   *     console.log(`Order ${result.orderId}:`);\n   *     console.log(`  Organization: ${result.data?.orgName}`);\n   *     console.log(`  INN: ${result.data?.inn}`);\n   *     console.log(`  KPP: ${result.data?.kpp || 'N/A (IP)'}`);\n   *   }\n   * }\n   * ```\n   */\n  async getB2BInfo(orderIds: number[]): Promise<GetB2BInfoResponse> {\n    // Validate orderIds array is not empty\n    if (orderIds.length === 0) {\n      throw new ValidationError('orderIds array cannot be empty');\n    }\n\n    // Validate orderIds array does not exceed maximum\n    if (orderIds.length > 1000) {\n      throw new ValidationError('orderIds array cannot exceed 1000 items');\n    }\n\n    return this.client.post<GetB2BInfoResponse>(\n      `${BASE_URL}/api/marketplace/v3/dbs/orders/b2b/info`,\n      { ordersIds: orderIds },\n      { rateLimitKey: 'orders-dbs.getB2BInfo' }\n    );\n  }\n\n  // ==========================================================================\n  // New Info Endpoints (Story 26.1)\n  // ==========================================================================\n\n  /**\n   * Get paid delivery group information\n   *\n   * @param request - Request with order IDs\n   * @returns Promise resolving to order group information\n   *\n   * @example\n   * ```typescript\n   * const groups = await sdk.ordersDBS.getGroupsInfo({ orders: [123456] });\n   * ```\n   */\n  async getGroupsInfo(request: OrderGroupsRequest): Promise<OrderGroupsResponse> {\n    return this.client.post<OrderGroupsResponse>(`${BASE_URL}/api/v3/dbs/groups/info`, request, {\n      rateLimitKey: 'orders-dbs.getGroupsInfo',\n    });\n  }\n\n  /**\n   * Get delivery dates for DBS orders\n   *\n   * @param request - Request with order IDs\n   * @returns Promise resolving to delivery date information\n   *\n   * @example\n   * ```typescript\n   * const dates = await sdk.ordersDBS.getDeliveryDates({ orders: [123456] });\n   * ```\n   */\n  async getDeliveryDates(request: DeliveryDatesRequest): Promise<DeliveryDatesInfoResponse> {\n    return this.client.post<DeliveryDatesInfoResponse>(\n      `${BASE_URL}/api/v3/dbs/orders/delivery-date`,\n      request,\n      { rateLimitKey: 'orders-dbs.getDeliveryDates' }\n    );\n  }\n\n  // ==========================================================================\n  // Bulk Metadata Endpoints (Story 26.2) - Replace deprecated single-order methods\n  // ==========================================================================\n\n  /**\n   * Get metadata for multiple orders (bulk)\n   *\n   * Replaces the deprecated single-order getMeta() method.\n   * Rate limit: 150 requests/min, 400ms interval, 20 burst\n   *\n   * @param request - Request with order IDs\n   * @returns Promise resolving to bulk metadata response\n   *\n   * @example\n   * ```typescript\n   * const meta = await sdk.ordersDBS.getMetaBulk({ orders: [123456, 234567] });\n   * ```\n   */\n  async getMetaBulk(request: GetMetaBulkRequest): Promise<GetOrderMetaBulkResponse> {\n    return this.client.post<GetOrderMetaBulkResponse>(\n      `${BASE_URL}/api/marketplace/v3/dbs/orders/meta/info`,\n      request,\n      { rateLimitKey: 'orders-dbs.getMetaBulk' }\n    );\n  }\n\n  /**\n   * Delete metadata for multiple orders (bulk)\n   *\n   * Replaces the deprecated single-order deleteMeta() method.\n   * Rate limit: 150 requests/min, 400ms interval, 20 burst\n   *\n   * @param request - Request with order IDs and metadata key to delete\n   * @returns Promise resolving to bulk delete response\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.ordersDBS.deleteMetaBulk({ orders: [123456], key: 'imei' });\n   * ```\n   */\n  async deleteMetaBulk(request: DeleteMetaBulkRequest): Promise<DeleteMetaBulkResponse> {\n    return this.client.post<DeleteMetaBulkResponse>(\n      `${BASE_URL}/api/marketplace/v3/dbs/orders/meta/delete`,\n      request,\n      { rateLimitKey: 'orders-dbs.deleteMetaBulk' }\n    );\n  }\n\n  /**\n   * Set SGTIN codes for multiple orders (bulk)\n   *\n   * Replaces the deprecated single-order setSgtin() method.\n   * Rate limit: 500 requests/min, 120ms interval, 20 burst\n   *\n   * @param request - Request with order SGTIN data\n   * @returns Promise resolving to bulk set response\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.ordersDBS.setSgtinBulk({\n   *   orders: [{ orderId: 123456, sgtins: ['1234567890123456'] }]\n   * });\n   * ```\n   */\n  async setSgtinBulk(request: SetSgtinBulkRequest): Promise<SetMetaBulkResponse> {\n    return this.client.post<SetMetaBulkResponse>(\n      `${BASE_URL}/api/marketplace/v3/dbs/orders/meta/sgtin`,\n      request,\n      { rateLimitKey: 'orders-dbs.setSgtinBulk' }\n    );\n  }\n\n  /**\n   * Set UIN codes for multiple orders (bulk)\n   *\n   * Replaces the deprecated single-order setUin() method.\n   * Rate limit: 500 requests/min, 120ms interval, 20 burst\n   *\n   * @param request - Request with order UIN data\n   * @returns Promise resolving to bulk set response\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.ordersDBS.setUinBulk({\n   *   orders: [{ orderId: 123456, uin: '1234567890123456' }]\n   * });\n   * ```\n   */\n  async setUinBulk(request: SetUinBulkRequest): Promise<SetMetaBulkResponse> {\n    return this.client.post<SetMetaBulkResponse>(\n      `${BASE_URL}/api/marketplace/v3/dbs/orders/meta/uin`,\n      request,\n      { rateLimitKey: 'orders-dbs.setUinBulk' }\n    );\n  }\n\n  /**\n   * Set IMEI codes for multiple orders (bulk)\n   *\n   * Replaces the deprecated single-order setImei() method.\n   * Rate limit: 500 requests/min, 120ms interval, 20 burst\n   *\n   * @param request - Request with order IMEI data\n   * @returns Promise resolving to bulk set response\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.ordersDBS.setImeiBulk({\n   *   orders: [{ orderId: 123456, imei: '123456789012345' }]\n   * });\n   * ```\n   */\n  async setImeiBulk(request: SetImeiBulkRequest): Promise<SetMetaBulkResponse> {\n    return this.client.post<SetMetaBulkResponse>(\n      `${BASE_URL}/api/marketplace/v3/dbs/orders/meta/imei`,\n      request,\n      { rateLimitKey: 'orders-dbs.setImeiBulk' }\n    );\n  }\n\n  /**\n   * Set GTIN codes for multiple orders (bulk)\n   *\n   * Replaces the deprecated single-order setGtin() method.\n   * Rate limit: 500 requests/min, 120ms interval, 20 burst\n   *\n   * @param request - Request with order GTIN data\n   * @returns Promise resolving to bulk set response\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.ordersDBS.setGtinBulk({\n   *   orders: [{ orderId: 123456, gtin: '1234567890123' }]\n   * });\n   * ```\n   */\n  async setGtinBulk(request: SetGtinBulkRequest): Promise<SetMetaBulkResponse> {\n    return this.client.post<SetMetaBulkResponse>(\n      `${BASE_URL}/api/marketplace/v3/dbs/orders/meta/gtin`,\n      request,\n      { rateLimitKey: 'orders-dbs.setGtinBulk' }\n    );\n  }\n\n  /**\n   * Set customs declaration for multiple orders (bulk)\n   *\n   * Replaces the deprecated single-order setCustomsDeclaration() method.\n   * Rate limit: 500 requests/min, 120ms interval, 20 burst\n   *\n   * @param request - Request with order customs declaration data\n   * @returns Promise resolving to bulk set response\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.ordersDBS.setCustomsDeclarationBulk({\n   *   orders: [{ orderId: 123456, customsDeclaration: 'CD-123456789' }]\n   * });\n   * ```\n   */\n  async setCustomsDeclarationBulk(\n    request: SetCustomsDeclarationBulkRequest\n  ): Promise<SetMetaBulkResponse> {\n    return this.client.post<SetMetaBulkResponse>(\n      `${BASE_URL}/api/marketplace/v3/dbs/orders/meta/customs-declaration`,\n      request,\n      { rateLimitKey: 'orders-dbs.setCustomsDeclarationBulk' }\n    );\n  }\n\n  // ==========================================================================\n  // Bulk Status Management Methods (Story 12.2)\n  // ==========================================================================\n\n  /**\n   * Get status information for multiple DBS orders (bulk)\n   *\n   * Retrieves the current status and tracking information for up to 1000 orders\n   * in a single request. This is more efficient than individual status queries\n   * for batch processing scenarios.\n   *\n   * Rate limit: Standard DBS rate limits apply\n   *\n   * @param orderIds - Array of order IDs to get status for (1-1000 items)\n   * @returns Promise resolving to status information for each order\n   * @throws {ValidationError} When orderIds array is empty or exceeds 1000 items\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {NetworkError} When network request fails\n   *\n   * @see {@link https://dev.wildberries.ru/openapi/orders-dbs#tag/Status-DBS}\n   *\n   * @example\n   * ```typescript\n   * // Get status for multiple orders\n   * const statuses = await sdk.ordersDBS.getStatusesBulk([123456, 234567, 345678]);\n   *\n   * for (const order of statuses.orders ?? []) {\n   *   console.log(`Order ${order.orderId}: ${order.wbStatus}`);\n   *   console.log(`  Seller status: ${order.supplierStatus}`);\n   *   console.log(`  Updated: ${order.changedAt}`);\n   * }\n   * ```\n   */\n  async getStatusesBulk(orderIds: number[]): Promise<GetStatusInfoResponse> {\n    if (orderIds.length === 0) {\n      throw new ValidationError('orderIds array cannot be empty');\n    }\n    if (orderIds.length > 1000) {\n      throw new ValidationError('orderIds array cannot exceed 1000 items');\n    }\n    return this.client.post<GetStatusInfoResponse>(\n      `${BASE_URL}/api/marketplace/v3/dbs/orders/status/info`,\n      { orders: orderIds },\n      { rateLimitKey: 'orders-dbs.getStatusesBulk' }\n    );\n  }\n\n  /**\n   * Confirm multiple DBS orders for assembly (bulk)\n   *\n   * Moves up to 1000 orders from \"new\" to \"confirmed\" status in a single request.\n   * This indicates the seller has acknowledged the orders and will begin\n   * preparing them for delivery.\n   *\n   * Rate limit: Standard DBS rate limits apply\n   *\n   * @param orderIds - Array of order IDs to confirm (1-1000 items)\n   * @returns Promise resolving to confirmation results for each order\n   * @throws {ValidationError} When orderIds array is empty or exceeds 1000 items\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {NetworkError} When network request fails\n   *\n   * @see {@link https://dev.wildberries.ru/openapi/orders-dbs#tag/Status-DBS}\n   *\n   * @example\n   * ```typescript\n   * // Confirm multiple orders at once\n   * const result = await sdk.ordersDBS.confirmBulk([123456, 234567, 345678]);\n   *\n   * for (const order of result.orders ?? []) {\n   *   if (order.isError) {\n   *     console.log(`Order ${order.orderId} failed: ${order.errorText}`);\n   *   } else {\n   *     console.log(`Order ${order.orderId} confirmed successfully`);\n   *   }\n   * }\n   * ```\n   */\n  async confirmBulk(orderIds: number[]): Promise<BulkStatusChangeResponse> {\n    if (orderIds.length === 0) {\n      throw new ValidationError('orderIds array cannot be empty');\n    }\n    if (orderIds.length > 1000) {\n      throw new ValidationError('orderIds array cannot exceed 1000 items');\n    }\n    return this.client.post<BulkStatusChangeResponse>(\n      `${BASE_URL}/api/marketplace/v3/dbs/orders/status/confirm`,\n      { orders: orderIds },\n      { rateLimitKey: 'orders-dbs.confirmBulk' }\n    );\n  }\n\n  /**\n   * Mark multiple DBS orders as delivered (bulk)\n   *\n   * Moves up to 1000 orders to \"delivered\" status in a single request.\n   * Use this when the seller has handed over the packages for delivery\n   * to the customer. This triggers the delivery tracking process.\n   *\n   * **Important:** Orders requiring IMEI must have it attached before calling this method.\n   * Check `requiredMeta` array in `getNewOrders()` response — if it contains `\"imei\"`,\n   * call `setImei()` first. Otherwise this method returns 409 with `\"detail\":\"ImeiIsNotFilled\"`.\n   *\n   * Rate limit: Standard DBS rate limits apply\n   *\n   * @param orderIds - Array of order IDs to mark as delivered (1-1000 items)\n   * @returns Promise resolving to delivery status results for each order. When WB returns\n   *   application-level 409 MetaValidationFail, it surfaces in `result.results[].errors[]`\n   *   with `code === 409` and `detail === 'MetaValidationFail'`; check\n   *   `result.results[].errors[].metaDetails[]` per-order before retrying. (since 3.11.0 — WB API 2026-05-06)\n   * @throws {ValidationError} When orderIds array is empty or exceeds 1000 items\n   * @throws {WBAPIError} 409 — ImeiIsNotFilled: mandatory IMEI not attached to order\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {NetworkError} When network request fails\n   *\n   * @see {@link https://dev.wildberries.ru/openapi/orders-dbs#tag/Status-DBS}\n   *\n   * @example\n   * ```typescript\n   * // Mark multiple orders as delivered to carrier\n   * const result = await sdk.ordersDBS.deliverBulk([123456, 234567, 345678]);\n   *\n   * for (const order of result.orders ?? []) {\n   *   if (order.isError) {\n   *     console.log(`Order ${order.orderId} failed: ${order.errorText}`);\n   *   } else {\n   *     console.log(`Order ${order.orderId} marked as delivered`);\n   *   }\n   * }\n   * ```\n   */\n  async deliverBulk(orderIds: number[]): Promise<BulkStatusChangeResponse> {\n    if (orderIds.length === 0) {\n      throw new ValidationError('orderIds array cannot be empty');\n    }\n    if (orderIds.length > 1000) {\n      throw new ValidationError('orderIds array cannot exceed 1000 items');\n    }\n    return this.client.post<BulkStatusChangeResponse>(\n      `${BASE_URL}/api/marketplace/v3/dbs/orders/status/deliver`,\n      { orders: orderIds },\n      { rateLimitKey: 'orders-dbs.deliverBulk' }\n    );\n  }\n\n  /**\n   * Confirm customer receipt for multiple DBS orders (bulk)\n   *\n   * Moves up to 1000 orders to \"received\" status in a single request.\n   * Use this when the customer has received and accepted the delivery.\n   * Requires the customer confirmation code for each order.\n   *\n   * Rate limit: Standard DBS rate limits apply\n   *\n   * @param orders - Array of orders with IDs and customer confirmation codes (1-1000 items)\n   * @returns Promise resolving to receive confirmation results for each order\n   * @throws {ValidationError} When orders array is empty, exceeds 1000 items, contains invalid orderId, or missing code\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {NetworkError} When network request fails\n   *\n   * @see {@link https://dev.wildberries.ru/openapi/orders-dbs#tag/Status-DBS}\n   *\n   * @example\n   * ```typescript\n   * // Confirm receipt for multiple orders with customer codes\n   * const result = await sdk.ordersDBS.receiveBulk([\n   *   { orderId: 123456, code: 'ABC123' },\n   *   { orderId: 234567, code: 'DEF456' },\n   *   { orderId: 345678, code: 'GHI789' }\n   * ]);\n   *\n   * for (const order of result.orders ?? []) {\n   *   if (order.isError) {\n   *     console.log(`Order ${order.orderId} failed: ${order.errorText}`);\n   *   } else {\n   *     console.log(`Order ${order.orderId} receipt confirmed`);\n   *   }\n   * }\n   * ```\n   */\n  async receiveBulk(orders: OrderCodeRequest[]): Promise<BulkStatusChangeResponse> {\n    if (orders.length === 0) {\n      throw new ValidationError('orders array cannot be empty');\n    }\n    if (orders.length > 1000) {\n      throw new ValidationError('orders array cannot exceed 1000 items');\n    }\n    for (const order of orders) {\n      if (order.orderId <= 0) {\n        throw new ValidationError('orderId must be a positive number');\n      }\n      if (!order.code || order.code === '') {\n        throw new ValidationError('code cannot be empty');\n      }\n    }\n    return this.client.post<BulkStatusChangeResponse>(\n      `${BASE_URL}/api/marketplace/v3/dbs/orders/status/receive`,\n      { orders },\n      { rateLimitKey: 'orders-dbs.receiveBulk' }\n    );\n  }\n\n  /**\n   * Reject delivery for multiple DBS orders (bulk)\n   *\n   * Moves up to 1000 orders to \"rejected\" status in a single request.\n   * Use this when the customer has refused to accept the delivery\n   * (e.g., wrong product, damaged package, changed mind).\n   * Requires the rejection code for each order.\n   *\n   * Rate limit: Standard DBS rate limits apply\n   *\n   * @param orders - Array of orders with IDs and rejection codes (1-1000 items)\n   * @returns Promise resolving to rejection results for each order\n   * @throws {ValidationError} When orders array is empty, exceeds 1000 items, contains invalid orderId, or missing code\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {NetworkError} When network request fails\n   *\n   * @see {@link https://dev.wildberries.ru/openapi/orders-dbs#tag/Status-DBS}\n   *\n   * @example\n   * ```typescript\n   * // Reject delivery for multiple orders with rejection codes\n   * const result = await sdk.ordersDBS.rejectBulk([\n   *   { orderId: 123456, code: 'DAMAGED' },\n   *   { orderId: 234567, code: 'WRONG_ITEM' },\n   *   { orderId: 345678, code: 'CUSTOMER_REFUSED' }\n   * ]);\n   *\n   * for (const order of result.orders ?? []) {\n   *   if (order.isError) {\n   *     console.log(`Order ${order.orderId} rejection failed: ${order.errorText}`);\n   *   } else {\n   *     console.log(`Order ${order.orderId} rejected successfully`);\n   *   }\n   * }\n   * ```\n   */\n  async rejectBulk(orders: OrderCodeRequest[]): Promise<BulkStatusChangeResponse> {\n    if (orders.length === 0) {\n      throw new ValidationError('orders array cannot be empty');\n    }\n    if (orders.length > 1000) {\n      throw new ValidationError('orders array cannot exceed 1000 items');\n    }\n    for (const order of orders) {\n      if (order.orderId <= 0) {\n        throw new ValidationError('orderId must be a positive number');\n      }\n      if (!order.code || order.code === '') {\n        throw new ValidationError('code cannot be empty');\n      }\n    }\n    return this.client.post<BulkStatusChangeResponse>(\n      `${BASE_URL}/api/marketplace/v3/dbs/orders/status/reject`,\n      { orders },\n      { rateLimitKey: 'orders-dbs.rejectBulk' }\n    );\n  }\n\n  /**\n   * Cancel multiple DBS orders (bulk)\n   *\n   * Cancels up to 1000 orders in a single request. Use this when the seller\n   * cannot fulfill the orders (e.g., out of stock, unable to deliver).\n   * Orders can only be cancelled before they are delivered.\n   *\n   * Rate limit: Standard DBS rate limits apply\n   *\n   * @param orderIds - Array of order IDs to cancel (1-1000 items)\n   * @returns Promise resolving to cancellation results for each order\n   * @throws {ValidationError} When orderIds array is empty or exceeds 1000 items\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {NetworkError} When network request fails\n   *\n   * @see {@link https://dev.wildberries.ru/openapi/orders-dbs#tag/Status-DBS}\n   *\n   * @example\n   * ```typescript\n   * // Cancel multiple orders that cannot be fulfilled\n   * const result = await sdk.ordersDBS.cancelBulk([123456, 234567, 345678]);\n   *\n   * for (const order of result.orders ?? []) {\n   *   if (order.isError) {\n   *     console.log(`Order ${order.orderId} cancellation failed: ${order.errorText}`);\n   *   } else {\n   *     console.log(`Order ${order.orderId} cancelled successfully`);\n   *   }\n   * }\n   * ```\n   */\n  async cancelBulk(orderIds: number[]): Promise<BulkStatusChangeResponse> {\n    if (orderIds.length === 0) {\n      throw new ValidationError('orderIds array cannot be empty');\n    }\n    if (orderIds.length > 1000) {\n      throw new ValidationError('orderIds array cannot exceed 1000 items');\n    }\n    return this.client.post<BulkStatusChangeResponse>(\n      `${BASE_URL}/api/marketplace/v3/dbs/orders/status/cancel`,\n      { orders: orderIds },\n      { rateLimitKey: 'orders-dbs.cancelBulk' }\n    );\n  }\n}\n","/**\n * Auto-generated module\n * Generated from: wildberries_api_doc/01-general.yaml (User Management endpoints)\n * DO NOT EDIT MANUALLY - Changes will be overwritten on next generation\n */\n\nimport { BaseClient } from '../../client/base-client';\nimport type {\n  CreateInviteRequest,\n  CreateInviteResponse,\n  GetUsersParams,\n  GetUsersResponse,\n  UpdateUserAccessRequest,\n} from '../../types/user-management.types';\n\nexport class UserManagementModule {\n  constructor(private client: BaseClient) {}\n\n  /**\n   * Создание приглашения для пользователя\n   *\n   * Создаёт приглашение для нового пользователя профиля продавца.\n   * В запросе указываются номер телефона, должность и настройки доступа к разделам.\n   * Если массив `access` пустой или не указан — будут применены доступы по умолчанию.\n   * Возвращает ID приглашения, ссылку для приглашения и срок действия.\n   *\n   * Rate limit:\n   * | Период | Лимит | Интервал | Всплеск |\n   * | --- | --- | --- | --- |\n   * | 1 мин | 60 запросов | 1 секунда | 5 запросов |\n   *\n   * @param data - Данные для создания приглашения (доступы и информация о приглашённом)\n   * @returns Результат создания приглашения (ID, URL, срок действия, статус)\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/api-information#tag/Upravlenie-polzovatelyami-prodavca}\n   * @example\n   * ```typescript\n   * const result = await sdk.userManagement.createInvite({\n   *   invite: {\n   *     phoneNumber: '+79991234567',\n   *     position: 'Менеджер',\n   *   },\n   *   access: [\n   *     { code: 'balance', disabled: false },\n   *     { code: 'finance', disabled: true },\n   *   ],\n   * });\n   * console.log(result.inviteUrl);\n   * console.log(result.inviteID);\n   * ```\n   */\n  async createInvite(data: CreateInviteRequest): Promise<CreateInviteResponse> {\n    return this.client.post<CreateInviteResponse>(\n      'https://user-management-api.wildberries.ru/api/v1/invite',\n      data,\n      {\n        rateLimitKey: 'userManagement.createInvite',\n      }\n    );\n  }\n\n  /**\n   * Получение списка пользователей профиля продавца\n   *\n   * Возвращает список активных или приглашённых пользователей профиля продавца.\n   * Поддерживает пагинацию через `limit` и `offset`.\n   * Параметр `isInviteOnly` позволяет фильтровать только приглашённых,\n   * которые ещё не активировали доступ.\n   *\n   * Rate limit:\n   * | Период | Лимит | Интервал | Всплеск |\n   * | --- | --- | --- | --- |\n   * | 1 мин | 60 запросов | 1 секунда | 5 запросов |\n   *\n   * @readonly\n   * @param [params] - Параметры запроса (пагинация и фильтрация)\n   * @param [params.limit] - Количество пользователей в ответе (по умолчанию 100, максимум 100)\n   * @param [params.offset] - Сколько элементов пропустить (по умолчанию 0)\n   * @param [params.isInviteOnly] - Фильтр: true — только приглашённые, false — активные\n   * @returns Список пользователей с общим количеством\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/api-information#tag/Upravlenie-polzovatelyami-prodavca}\n   * @example\n   * ```typescript\n   * const result = await sdk.userManagement.getUsers({ limit: 50, offset: 0 });\n   * console.log(result.total);\n   * for (const user of result.users) {\n   *   console.log(user.firstName, user.secondName, user.role);\n   * }\n   * ```\n   */\n  async getUsers(params?: GetUsersParams): Promise<GetUsersResponse> {\n    return this.client.get<GetUsersResponse>(\n      'https://user-management-api.wildberries.ru/api/v1/users',\n      {\n        params: params ? { ...params } : undefined,\n        rateLimitKey: 'userManagement.getUsers',\n      }\n    );\n  }\n\n  /**\n   * Обновление настроек доступа пользователей\n   *\n   * Обновляет настройки доступа к разделам профиля продавца для указанных пользователей.\n   * Для каждого пользователя передаётся массив настроек доступа с кодом раздела\n   * и статусом (disabled: true — запрещён, false — разрешён).\n   *\n   * Rate limit:\n   * | Период | Лимит | Интервал | Всплеск |\n   * | --- | --- | --- | --- |\n   * | 1 мин | 60 запросов | 1 секунда | 5 запросов |\n   *\n   * @param data - Настройки доступа для пользователей\n   * @returns void (200 ответ без тела)\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/api-information#tag/Upravlenie-polzovatelyami-prodavca}\n   * @example\n   * ```typescript\n   * await sdk.userManagement.updateUserAccess({\n   *   usersAccesses: [\n   *     {\n   *       userId: 12345,\n   *       access: [\n   *         { code: 'balance', disabled: false },\n   *         { code: 'finance', disabled: true },\n   *       ],\n   *     },\n   *   ],\n   * });\n   * ```\n   */\n  async updateUserAccess(data: UpdateUserAccessRequest): Promise<void> {\n    return this.client.put('https://user-management-api.wildberries.ru/api/v1/users/access', data, {\n      rateLimitKey: 'userManagement.updateAccess',\n    });\n  }\n\n  /**\n   * Удаление пользователя из профиля продавца\n   *\n   * Удаляет пользователя из профиля продавца по его ID.\n   * ID пользователя передаётся как query-параметр `deletedUserID`.\n   * После удаления пользователь теряет доступ ко всем разделам профиля.\n   *\n   * Rate limit:\n   * | Период | Лимит | Интервал | Всплеск |\n   * | --- | --- | --- | --- |\n   * | 1 мин | 60 запросов | 1 секунда | 10 запросов |\n   *\n   * @param deletedUserID - ID удаляемого пользователя\n   * @returns void (200 ответ без тела)\n   * @throws {AuthenticationError} When API key is invalid (401/403)\n   * @throws {RateLimitError} When rate limit exceeded (429)\n   * @throws {ValidationError} When request data is invalid (400/422)\n   * @throws {NetworkError} When network request fails or times out\n   * @see {@link https://dev.wildberries.ru/openapi/api-information#tag/Upravlenie-polzovatelyami-prodavca}\n   * @example\n   * ```typescript\n   * await sdk.userManagement.deleteUser(12345);\n   * ```\n   */\n  async deleteUser(deletedUserID: number): Promise<void> {\n    return this.client.delete('https://user-management-api.wildberries.ru/api/v1/user', undefined, {\n      params: { deletedUserID },\n      rateLimitKey: 'userManagement.deleteUser',\n    });\n  }\n}\n","/**\n * Standardized return reason codes derived from Wildberries free-text reason strings.\n *\n * @since v3.9.3\n */\nexport type ReturnReasonCode =\n  | 'damage' // Повреждение товара/упаковки\n  | 'defect' // Брак, заводской дефект\n  | 'wrong_size' // Не подошёл размер\n  | 'wrong_item' // Не тот товар, ошибка комплектации\n  | 'customer_refused' // Покупатель отказался\n  | 'expired' // Истёк срок годности / время на возврат\n  | 'not_as_described' // Не соответствует описанию / фото\n  | 'other'; // Не удалось классифицировать\n\n/**\n * Classifies a Wildberries return reason string into a standardized enum code.\n *\n * Pure function — no side effects. Returns 'other' for unknown reasons.\n *\n * @param reason - Free-text Russian reason string from WB API (e.g., GoodsReturnItem.reason)\n * @returns Standardized ReturnReasonCode\n *\n * @example\n * classifyReturnReason('Брак товара') // → 'defect'\n * classifyReturnReason('Не подошёл размер') // → 'wrong_size'\n * classifyReturnReason('') // → 'other'\n *\n * @since v3.9.3\n */\nexport function classifyReturnReason(reason: string | null | undefined): ReturnReasonCode {\n  if (!reason) return 'other';\n  const text = reason.toLowerCase().trim();\n  if (!text) return 'other';\n\n  // damage — повреждения\n  if (/повреждени|поврежд|сломан|разбит|потёрт|царапин|деформ|помят/.test(text)) return 'damage';\n\n  // defect — брак / заводской дефект\n  if (/брак|дефект|неисправн|не работает|сломалось|не включается/.test(text)) return 'defect';\n\n  // wrong_size — размер\n  if (\n    /не подошёл размер|не подошел размер|не по размеру|размер не подошёл|размер не подошел|маловат|великоват|узк|шир/.test(\n      text\n    )\n  ) {\n    return 'wrong_size';\n  }\n\n  // wrong_item — не тот товар\n  if (/не тот товар|неправильный товар|ошибк[аи] комплект|пришло другое|перепутали/.test(text)) {\n    return 'wrong_item';\n  }\n\n  // expired — сроки\n  if (/срок годности|истёк срок|истек срок|просроч|время.*возврат/.test(text)) return 'expired';\n\n  // not_as_described — не соответствует описанию\n  if (/не соответств|не как на фото|описан|качество|не оправда/.test(text))\n    return 'not_as_described';\n\n  // customer_refused — отказ покупателя (catch-all для добровольных)\n  if (/отказ|раздума|передумал|не понравил|не нужен|вернуть/.test(text)) return 'customer_refused';\n\n  return 'other';\n}\n","/**\n * Parse a money amount string from v1 finance reports to a JavaScript number.\n *\n * WB v1 finance report endpoints return money amounts as **strings** (e.g., `\"367.99\"`) to avoid\n * JS float precision loss on very large amounts. Use this helper when you need JS number math\n * (e.g., for sums, averages, comparisons) and don't need exact precision beyond ~15 significant digits.\n *\n * **Precision warning**: For amounts with more than 15 significant digits (extremely rare in WB\n * reports, but possible in aggregated sums), use a dedicated decimal library (decimal.js, big.js)\n * instead. For all typical seller amounts (< 10^12 kopecks), parseFloat is safe.\n *\n * **Behavior**:\n * - Valid numeric string → parsed number (e.g., `\"367.99\"` → `367.99`)\n * - `null` / `undefined` / empty string → `0`\n * - Non-numeric string → `0` (NaN from parseFloat is converted to 0)\n * - Scientific notation → parsed (e.g., `\"1e10\"` → `10000000000`)\n *\n * @param value - Money string from a v1 finance report field, or null/undefined\n * @returns Parsed number, or 0 if input is null/undefined/empty/invalid\n *\n * @example\n * ```typescript\n * import { parseMoneyAmount } from 'daytona-wildberries-typescript-sdk';\n *\n * const rows = await sdk.finances.getSalesReportsDetailed({ dateFrom, dateTo });\n * const total = rows.reduce((sum, r) => sum + parseMoneyAmount(r.forPay), 0);\n * ```\n *\n * @since v3.7.0\n */\nexport function parseMoneyAmount(value?: string | null): number {\n  if (value == null || value === '') return 0;\n  const parsed = parseFloat(value);\n  return Number.isNaN(parsed) ? 0 : parsed;\n}\n","/**\n * ReturnsModule — unified return analytics aggregator.\n *\n * Orchestrates FBO, FBS, and Finance sources into a single `ReturnItem[]`\n * with full partial-failure tolerance, per-source telemetry, and srid-based\n * finance enrichment.\n *\n * @module\n * @since v3.10.0\n */\n\nimport type { BaseClient } from '../../client/base-client';\nimport type { ReportsModule } from '../reports';\nimport type { OrdersFbsModule } from '../orders-fbs';\nimport type { FinancesModule } from '../finances';\nimport type { GoodsReturnItem } from '../../types/reports.types';\nimport type { SalesReportDetailedItem } from '../../types/finances.types';\nimport { classifyReturnReason } from '../../utils/classifyReturnReason';\nimport { parseMoneyAmount } from '../../utils/parseMoneyAmount';\nimport type {\n  ReturnItem,\n  ReturnStatus,\n  ReturnsApiRequest,\n  ReturnsApiResponse,\n  PartialFailure,\n  ReturnsMeta,\n  ReturnByOrderIdParams,\n  ReturnStatsParams,\n  ReturnStatsResult,\n  ReturnStatsBucket,\n} from '../../types/returns.types';\n\n// ============================================================================\n// Private helpers\n// ============================================================================\n\n/**\n * Validates the date range. Throws for invalid date strings, ranges > 31 days,\n * or if dateFrom > dateTo.\n */\nfunction validateDateRange(dateFrom: string, dateTo: string): void {\n  const from = new Date(dateFrom);\n  const to = new Date(dateTo);\n  if (isNaN(from.getTime())) {\n    throw new Error(`Invalid dateFrom: '${dateFrom}' is not a valid date string`);\n  }\n  if (isNaN(to.getTime())) {\n    throw new Error(`Invalid dateTo: '${dateTo}' is not a valid date string`);\n  }\n  const diffMs = to.getTime() - from.getTime();\n  const diffDays = diffMs / (1000 * 60 * 60 * 24);\n  if (diffDays < 0) {\n    throw new Error(`dateFrom (${dateFrom}) must be <= dateTo (${dateTo})`);\n  }\n  if (diffDays > 31) {\n    throw new Error(\n      `Date range exceeds 31-day limit (got ${Math.round(diffDays)} days). ` +\n        `WB getAnalyticsGoodsReturn supports max 31 days. ` +\n        `Split your range and call getReturns() multiple times.`\n    );\n  }\n}\n\n/**\n * Derives the return status for an FBO goods-return record.\n *\n * Rules (in order):\n * - `isStatusActive === 1` → `'initiated'` (still in flight)\n * - `isStatusActive === 0` and `completedDt` present → `'processed'`\n * - otherwise → `'received'`\n */\nfunction deriveFboReturnStatus(item: GoodsReturnItem): ReturnStatus {\n  if (item.isStatusActive === 1) return 'initiated';\n  if (item.isStatusActive === 0 && item.completedDt) return 'processed';\n  return 'received';\n}\n\n/**\n * Maps a `GoodsReturnItem` array from the FBO analytics endpoint to unified\n * `ReturnItem[]`. Skips records that are missing required fields.\n */\nfunction mapFboToReturnItems(items: GoodsReturnItem[]): ReturnItem[] {\n  const result: ReturnItem[] = [];\n  for (const item of items) {\n    // Required: nmId, orderId, at least one date field for returnDate\n    if (item.nmId === undefined) continue;\n    if (!item.orderId && item.orderId !== 0) continue;\n\n    const returnDate = item.completedDt ?? item.readyToReturnDt ?? item.orderDt;\n    if (!returnDate) continue;\n\n    result.push({\n      orderId: String(item.orderId),\n      nmId: item.nmId,\n      orderType: 'fbo',\n      returnDate,\n      returnStatus: deriveFboReturnStatus(item),\n      returnReason: item.reason ?? '',\n      returnReasonCode: classifyReturnReason(item.reason ?? ''),\n      returnCategory: 'unknown',\n      quantity: 1,\n      srid: item.srid,\n    });\n  }\n  return result;\n}\n\n/**\n * Enriches `ReturnItem[]` with `returnAmount` from finance lines.\n *\n * Join strategy (in priority order):\n * 1. Primary: `srid` match (when both sides have srid) — sums all matching lines\n * 2. Fallback: `(orderId, nmId)` tuple — sums all matching lines\n *\n * Finance data only ENRICHES existing rows — it never adds new rows.\n * Multiple finance lines for the same key are SUMMED (not last-write-wins).\n */\nfunction enrichWithFinance(\n  items: ReturnItem[],\n  financeLines: SalesReportDetailedItem[]\n): ReturnItem[] {\n  if (financeLines.length === 0) return items;\n\n  // Aggregate forPay per srid and per (orderId, nmId)\n  const sumBySrid = new Map<string, number>();\n  const sumByOrderNm = new Map<string, number>();\n  const sridFromOrderNm = new Map<string, string>(); // for backfill\n\n  for (const line of financeLines) {\n    const amount = line.forPay !== undefined ? parseMoneyAmount(line.forPay) : 0;\n    if (line.srid) {\n      sumBySrid.set(line.srid, (sumBySrid.get(line.srid) ?? 0) + amount);\n    }\n    if (line.orderId !== undefined && line.nmId !== undefined) {\n      const key = `${line.orderId}:${line.nmId}`;\n      sumByOrderNm.set(key, (sumByOrderNm.get(key) ?? 0) + amount);\n      if (line.srid && !sridFromOrderNm.has(key)) {\n        sridFromOrderNm.set(key, line.srid);\n      }\n    }\n  }\n\n  return items.map((item) => {\n    let returnAmount: number | undefined;\n    let backfilledSrid: string | undefined;\n\n    // 1. Try srid join\n    if (item.srid && sumBySrid.has(item.srid)) {\n      returnAmount = sumBySrid.get(item.srid);\n    } else {\n      // 2. Fallback: (orderId, nmId)\n      const key = `${item.orderId}:${item.nmId}`;\n      if (sumByOrderNm.has(key)) {\n        returnAmount = sumByOrderNm.get(key);\n        backfilledSrid = sridFromOrderNm.get(key);\n      }\n    }\n\n    if (returnAmount === undefined) return item;\n    return { ...item, returnAmount, srid: item.srid ?? backfilledSrid };\n  });\n}\n\n/**\n * Deduplicates merged items by `srid` — when the same srid appears more than\n * once (e.g., from FBO and FBS simultaneously), the first occurrence wins.\n * Items without srid are always kept.\n */\nfunction deduplicateBySrid(items: ReturnItem[]): ReturnItem[] {\n  const seen = new Set<string>();\n  return items.filter((item) => {\n    if (!item.srid) return true;\n    if (seen.has(item.srid)) return false;\n    seen.add(item.srid);\n    return true;\n  });\n}\n\n// ============================================================================\n// ReturnsModule\n// ============================================================================\n\n/**\n * Returns aggregator module — combines FBO, FBS, and Finance sources into a\n * unified `ReturnItem[]` with full partial-failure tolerance.\n *\n * @example\n * ```typescript\n * const result = await sdk.returns.getReturns({\n *   dateFrom: '2026-04-01',\n *   dateTo: '2026-04-30',\n * });\n * console.log(result.data);          // ReturnItem[]\n * console.log(result.partialFailures); // [] or [{ source: 'finance', error: '...' }]\n * ```\n *\n * @since v3.10.0\n */\nexport class ReturnsModule {\n  private readonly reports: ReportsModule;\n  private readonly finances: FinancesModule;\n\n  /**\n   * Constructor parameters `_client` and `_ordersFBS` are reserved for\n   * v3.10.1 FBS status history implementation. The `_` prefix satisfies\n   * TypeScript `noUnusedParameters` while preserving the full DI contract\n   * documented in story 13.2.\n   */\n  constructor(\n    _client: BaseClient,\n    reports: ReportsModule,\n    _ordersFBS: OrdersFbsModule,\n    finances: FinancesModule\n  ) {\n    this.reports = reports;\n    this.finances = finances;\n  }\n\n  /**\n   * Fetches all finance lines via cursor pagination on rrdId.\n   * Returns up to FINANCE_PAGE_LIMIT × FINANCE_MAX_PAGES rows; if truncated,\n   * pushes a warning into the supplied warnings array.\n   */\n  private async fetchAllFinanceLines(\n    dateFrom: string,\n    dateTo: string,\n    warnings: string[]\n  ): Promise<SalesReportDetailedItem[]> {\n    const FINANCE_PAGE_LIMIT = 100000;\n    const FINANCE_MAX_PAGES = 5; // hard cap = 500k rows (safety bound)\n    const all: SalesReportDetailedItem[] = [];\n    let rrdId = 0;\n    for (let page = 0; page < FINANCE_MAX_PAGES; page++) {\n      const chunk = await this.finances.getSalesReportsDetailed({\n        dateFrom,\n        dateTo,\n        limit: FINANCE_PAGE_LIMIT,\n        rrdId,\n      });\n      if (chunk.length === 0) break;\n      all.push(...chunk);\n      if (chunk.length < FINANCE_PAGE_LIMIT) break;\n      // Advance cursor — last item's rrdId (camelCase in SalesReportDetailedItem)\n      const last = chunk[chunk.length - 1];\n      if (last.rrdId === undefined) break;\n      rrdId = last.rrdId;\n    }\n    // Warn if we hit the safety cap (likely more data exists)\n    if (all.length >= FINANCE_PAGE_LIMIT * FINANCE_MAX_PAGES) {\n      warnings.push(\n        `Finance source truncated at ${all.length} lines (safety cap). ` +\n          `Some returnAmount values may be missing for high-volume sellers — ` +\n          `narrow your date range and call getReturns() multiple times.`\n      );\n    }\n    return all;\n  }\n\n  /**\n   * Unified return analytics aggregator.\n   *\n   * Fetches FBO returns from `sdk.reports.getAnalyticsGoodsReturn()`,\n   * optionally FBS returns (reserved — currently skipped), and enriches all\n   * records with financial amounts from `sdk.finances.getSalesReportsDetailed()`.\n   *\n   * Parallel execution via `Promise.allSettled` — one source failing does NOT\n   * abort the response; failures are surfaced in `partialFailures`.\n   *\n   * **Rate limit note**: FBO source is 1 req/min; Finance source is 1 req/min.\n   * Both are fetched in parallel to minimise wall-clock time.\n   *\n   * @param params - Date range, optional filters, and pagination\n   * @returns Unified `ReturnsApiResponse` with data, warnings, partialFailures, _meta\n   * @throws {Error} If `dateFrom > dateTo`, range exceeds 31 days, or date strings are invalid\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.returns.getReturns({\n   *   dateFrom: '2026-04-01',\n   *   dateTo: '2026-04-30',\n   *   orderType: 'fbo',\n   * });\n   * result.data.forEach(r => console.log(r.returnReasonCode, r.returnAmount));\n   * ```\n   *\n   * @since v3.10.0\n   */\n  async getReturns(params: ReturnsApiRequest): Promise<ReturnsApiResponse> {\n    // 1. Validate date range\n    validateDateRange(params.dateFrom, params.dateTo);\n\n    // 2. Decide which sources to fetch\n    // FBS is always skipped in v3.10.0 — implementation deferred\n    const fetchFbo = params.orderType !== 'fbs';\n\n    // 3. Build per-source warnings\n    const warnings: string[] = [];\n\n    if (params.orderType !== 'fbo') {\n      // FBS would have been the target — add appropriate warning\n      if (params.includeFbsStatusHistory === true) {\n        warnings.push(\n          'FBS status history fetching is reserved for future implementation in v3.10.0; FBS source skipped'\n        );\n      } else {\n        warnings.push(\n          'FBS status history skipped — pass includeFbsStatusHistory: true to include (currently no-op in v3.10.0)'\n        );\n      }\n    }\n\n    // 4. Parallel fetch with Promise.allSettled\n    // FBS slot is omitted — always skipped in v3.10.0 (implementation deferred)\n    // Note: Finance is fetched even if FBO fails — by the time we know FBO failed,\n    // finance is already in flight (Promise.allSettled). The wasted call costs ~1\n    // req/min but eliminates serial latency in the happy path.\n    const [fboResult, financeResult] = await Promise.allSettled([\n      fetchFbo\n        ? this.reports.getAnalyticsGoodsReturn({\n            dateFrom: params.dateFrom,\n            dateTo: params.dateTo,\n          })\n        : Promise.resolve(null),\n      this.fetchAllFinanceLines(params.dateFrom, params.dateTo, warnings),\n    ]);\n\n    // 5. Collect partial failures\n    const partialFailures: PartialFailure[] = [];\n    if (fboResult.status === 'rejected') {\n      partialFailures.push({\n        source: 'fbo',\n        error:\n          fboResult.reason instanceof Error ? fboResult.reason.message : String(fboResult.reason),\n      });\n    }\n    if (financeResult.status === 'rejected') {\n      partialFailures.push({\n        source: 'finance',\n        error:\n          financeResult.reason instanceof Error\n            ? financeResult.reason.message\n            : String(financeResult.reason),\n      });\n    }\n\n    // 6. Build per-source telemetry\n    const fboItems =\n      fboResult.status === 'fulfilled' && fboResult.value\n        ? mapFboToReturnItems(fboResult.value.report ?? [])\n        : [];\n\n    const financeLines = financeResult.status === 'fulfilled' ? financeResult.value : [];\n\n    const meta: ReturnsMeta = {\n      sources: {\n        fbo: fetchFbo\n          ? {\n              fetched: fboItems.length,\n              skipped: false,\n              failed: fboResult.status === 'rejected',\n              reason: fboResult.status === 'rejected' ? 'fetch failed' : undefined,\n            }\n          : { fetched: 0, skipped: true, failed: false, reason: 'orderType filter' },\n        fbs: {\n          fetched: 0,\n          skipped: true,\n          failed: false,\n          reason: 'v3.10.0: implementation deferred',\n        },\n        finance: {\n          fetched: financeLines.length,\n          skipped: false,\n          failed: financeResult.status === 'rejected',\n          reason: financeResult.status === 'rejected' ? 'fetch failed' : undefined,\n        },\n      },\n    };\n\n    // 7. Enrich with finance data (srid join, fallback orderId+nmId)\n    const enriched = enrichWithFinance(fboItems, financeLines);\n\n    // 8. Deduplicate by srid (handles FBO+FBS overlap in future)\n    const deduped = deduplicateBySrid(enriched);\n\n    // 9. Apply nmIds post-filter\n    const nmIds = params.nmIds;\n    const filtered = nmIds ? deduped.filter((r) => nmIds.includes(r.nmId)) : deduped;\n\n    // 10. Sort descending by returnDate\n    filtered.sort((a, b) => b.returnDate.localeCompare(a.returnDate));\n\n    // 11. Apply limit / offset pagination\n    const offset = params.offset ?? 0;\n    const total = filtered.length;\n    const limit = params.limit ?? filtered.length;\n    const data = filtered.slice(offset, offset + limit);\n\n    return { data, total, warnings, partialFailures, _meta: meta };\n  }\n\n  /**\n   * Convenience: fetch a single return record by WB orderId.\n   *\n   * Wraps `getReturns()` and filters in-memory. Date range still required because\n   * WB API requires it.\n   *\n   * @param orderId - WB order ID (string for BigInt safety)\n   * @param params - Date window\n   * @returns The matching ReturnItem, or `null` if not found\n   * @throws {Error} When orderId is empty\n   *\n   * @example\n   * ```typescript\n   * const ret = await sdk.returns.getReturnByOrderId('123456789', {\n   *   dateFrom: '2026-04-01',\n   *   dateTo: '2026-04-30',\n   * });\n   * if (ret) console.log(ret.returnReason, ret.returnAmount);\n   * ```\n   *\n   * **Important**: When the underlying `getReturns()` partial-failed (e.g., FBO\n   * source down), this method may return `null` even though the order exists.\n   * If you need failure visibility, call `getReturns()` directly and inspect\n   * the `partialFailures` field.\n   *\n   * @since v3.10.0\n   */\n  async getReturnByOrderId(\n    orderId: string,\n    params: ReturnByOrderIdParams\n  ): Promise<ReturnItem | null> {\n    if (!orderId || orderId.trim() === '') {\n      throw new Error('orderId must be a non-empty string');\n    }\n    const result = await this.getReturns({\n      dateFrom: params.dateFrom,\n      dateTo: params.dateTo,\n      orderType: params.orderType,\n    });\n    return result.data.find((r) => r.orderId === orderId) ?? null;\n  }\n\n  /**\n   * Convenience: aggregate return statistics grouped by nmId / category / orderType.\n   *\n   * Calls `getReturns()` once with the same filters, then post-processes in-memory.\n   * Buckets sorted by `count` descending (key ascending as tiebreaker).\n   *\n   * @example\n   * ```typescript\n   * // Top SKUs by return count\n   * const stats = await sdk.returns.getReturnStats({\n   *   dateFrom: '2026-04-01',\n   *   dateTo: '2026-04-30',\n   *   groupBy: 'nmId',\n   * });\n   * stats.buckets.slice(0, 10).forEach(b => {\n   *   console.log(`nmId=${b.key}: ${b.count} returns, ${b.totalAmount} ₽ ` +\n   *     `(${b.pendingFinanceCount} pending finance)`);\n   * });\n   * ```\n   *\n   * **Important**: When `partialFailures` is non-empty, the bucket counts may be\n   * understated — one or more underlying sources failed. Always check\n   * `result.partialFailures.length === 0` before trusting zero/low counts.\n   *\n   * @example\n   * ```typescript\n   * const stats = await sdk.returns.getReturnStats({ ... });\n   * if (stats.partialFailures.length > 0) {\n   *   console.warn('Some sources failed:', stats.partialFailures);\n   *   // Treat zero counts as \"unknown\", not \"no returns\"\n   * }\n   * ```\n   *\n   * @since v3.10.0\n   */\n  async getReturnStats(params: ReturnStatsParams): Promise<ReturnStatsResult> {\n    const result = await this.getReturns({\n      dateFrom: params.dateFrom,\n      dateTo: params.dateTo,\n      nmIds: params.nmIds,\n      orderType: params.orderType,\n      // No limit — we want ALL records for accurate stats\n    });\n\n    const buckets = new Map<\n      string,\n      { count: number; totalAmount: number; pendingFinanceCount: number }\n    >();\n\n    for (const item of result.data) {\n      let key: string;\n      switch (params.groupBy) {\n        case 'nmId':\n          key = String(item.nmId);\n          break;\n        case 'category':\n          key = item.returnCategory;\n          break;\n        case 'orderType':\n          key = item.orderType;\n          break;\n        default: {\n          // Exhaustive check — TypeScript will error if new groupBy values added\n          // without handling them here.\n          const exhaustive: never = params.groupBy;\n          throw new Error(`Unsupported groupBy value: ${String(exhaustive)}`);\n        }\n      }\n\n      const bucket = buckets.get(key) ?? { count: 0, totalAmount: 0, pendingFinanceCount: 0 };\n      bucket.count++;\n      if (item.returnAmount !== undefined) {\n        bucket.totalAmount += item.returnAmount;\n      } else {\n        bucket.pendingFinanceCount++;\n      }\n      buckets.set(key, bucket);\n    }\n\n    const bucketArray: ReturnStatsBucket[] = Array.from(buckets.entries()).map(([key, v]) => ({\n      key,\n      count: v.count,\n      totalAmount: v.totalAmount,\n      pendingFinanceCount: v.pendingFinanceCount,\n    }));\n\n    // Sort: count desc, key asc as tiebreaker\n    bucketArray.sort((a, b) => {\n      if (b.count !== a.count) return b.count - a.count;\n      return a.key.localeCompare(b.key);\n    });\n\n    return {\n      buckets: bucketArray,\n      totalReturns: bucketArray.reduce((s, b) => s + b.count, 0),\n      totalAmount: bucketArray.reduce((s, b) => s + b.totalAmount, 0),\n      warnings: result.warnings,\n      partialFailures: result.partialFailures,\n      _meta: result._meta,\n    };\n  }\n}\n","/**\n * Supply Cost Calculator Utility\n *\n * Story 11.3: Калькулятор прогноза затрат на поставку\n *\n * Calculates supply costs using acceptance coefficients data.\n *\n * Formulas:\n * - Storage: (storageBaseLiter + (volume-1) * storageAdditionalLiter) * storageCoef/100 * days\n * - Logistics: (deliveryBaseLiter + (volume-1) * deliveryAdditionalLiter) * deliveryCoef/100\n * - Acceptance: coefficient * base_rate (varies by boxType)\n *\n * @module utils/calculateSupplyCost\n */\n\nimport type { ModelsAcceptanceCoefficient } from '../types/orders-fbw.types';\n\n/**\n * Input parameters for supply cost calculation\n */\nexport interface SupplyCostInput {\n  /** Volume of goods in liters */\n  volume: number;\n  /** Warehouse ID */\n  warehouseID: number;\n  /** Number of storage days */\n  days: number;\n  /** Box type: 'box' | 'pallet' | 'supersafe' */\n  boxType?: 'box' | 'pallet' | 'supersafe';\n}\n\n/**\n * Result of supply cost calculation\n */\nexport interface SupplyCostResult {\n  /** Acceptance cost in rubles */\n  acceptanceCost: number;\n  /** Storage cost in rubles */\n  storageCost: number;\n  /** Logistics/delivery cost in rubles */\n  logisticsCost: number;\n  /** Total cost (acceptance + storage + logistics) */\n  totalCost: number;\n  /** Warehouse name */\n  warehouseName: string;\n  /** Applied coefficients for transparency */\n  appliedCoefficients: {\n    acceptance: number;\n    storage: number;\n    delivery: number;\n  };\n}\n\n/** Base acceptance rate per unit in rubles */\nconst BASE_ACCEPTANCE_RATE = 50;\n\n/** Default storage coefficient (100%) */\nconst DEFAULT_STORAGE_COEF = 100;\n\n/** Default delivery coefficient (100%) */\nconst DEFAULT_DELIVERY_COEF = 100;\n\n/**\n * Box type name mappings for filtering coefficients\n */\nconst BOX_TYPE_MAPPINGS: Record<string, string[]> = {\n  box: ['Короба', 'QR-поставка с коробами'],\n  pallet: ['Монопаллеты'],\n  supersafe: ['Суперсейф'],\n};\n\n/**\n * Safely parses a string to number, returns default if undefined/null/invalid\n */\nfunction parseNumeric(value: string | undefined | null, defaultValue = 0): number {\n  if (value === undefined || value === null) {\n    return defaultValue;\n  }\n  const parsed = parseFloat(value);\n  return Number.isFinite(parsed) ? parsed : defaultValue;\n}\n\n/**\n * Rounds a number to 2 decimal places\n * Uses toFixed for consistent rounding behavior with floating-point numbers\n */\nfunction roundTo2Decimals(value: number): number {\n  return Number(value.toFixed(2));\n}\n\n/**\n * Calculates storage cost based on volume, days, and coefficient data\n *\n * Formula: (storageBaseLiter + (volume-1) * storageAdditionalLiter) * storageCoef/100 * days\n * For pallets: storageBaseLiter * storageCoef/100 * days (flat rate)\n */\nfunction calculateStorageCost(\n  volume: number,\n  days: number,\n  coefficient: ModelsAcceptanceCoefficient,\n  isPallet: boolean\n): number {\n  const storageBaseLiter = parseNumeric(coefficient.storageBaseLiter, 0);\n  const storageAdditionalLiter = parseNumeric(coefficient.storageAdditionalLiter, 0);\n  const storageCoef = parseNumeric(coefficient.storageCoef, DEFAULT_STORAGE_COEF);\n\n  let baseCost: number;\n\n  if (isPallet) {\n    // For pallets, use flat rate (storageBaseLiter is per pallet, not per liter)\n    baseCost = storageBaseLiter;\n  } else {\n    // For boxes: base + additional for each liter beyond the first\n    baseCost = storageBaseLiter + (volume - 1) * storageAdditionalLiter;\n  }\n\n  const storageCost = baseCost * (storageCoef / 100) * days;\n\n  return roundTo2Decimals(storageCost);\n}\n\n/**\n * Calculates logistics/delivery cost based on volume and coefficient data\n *\n * Formula: (deliveryBaseLiter + (volume-1) * deliveryAdditionalLiter) * deliveryCoef/100\n */\nfunction calculateLogisticsCost(\n  volume: number,\n  coefficient: ModelsAcceptanceCoefficient,\n  isPallet: boolean\n): number {\n  const deliveryBaseLiter = parseNumeric(coefficient.deliveryBaseLiter, 0);\n  const deliveryAdditionalLiter = parseNumeric(coefficient.deliveryAdditionalLiter, 0);\n  const deliveryCoef = parseNumeric(coefficient.deliveryCoef, DEFAULT_DELIVERY_COEF);\n\n  let baseCost: number;\n\n  if (isPallet) {\n    // For pallets, use flat rate\n    baseCost = deliveryBaseLiter;\n  } else {\n    // For boxes: base + additional for each liter beyond the first\n    baseCost = deliveryBaseLiter + (volume - 1) * deliveryAdditionalLiter;\n  }\n\n  const logisticsCost = baseCost * (deliveryCoef / 100);\n\n  return roundTo2Decimals(logisticsCost);\n}\n\n/**\n * Calculates acceptance cost based on coefficient\n *\n * Rules:\n * - coefficient = 0: free acceptance (0 cost)\n * - coefficient = 1: base rate\n * - coefficient > 1: multiplier of base rate\n */\nfunction calculateAcceptanceCost(acceptanceCoefficient: number): number {\n  if (acceptanceCoefficient === 0) {\n    return 0;\n  }\n\n  return roundTo2Decimals(acceptanceCoefficient * BASE_ACCEPTANCE_RATE);\n}\n\n/**\n * Finds the matching coefficient for given warehouse and box type\n */\nfunction findMatchingCoefficient(\n  coefficients: ModelsAcceptanceCoefficient[],\n  warehouseID: number,\n  boxType?: 'box' | 'pallet' | 'supersafe'\n): ModelsAcceptanceCoefficient | undefined {\n  // Filter by warehouse ID first\n  const warehouseCoefficients = coefficients.filter((c) => c.warehouseID === warehouseID);\n\n  if (warehouseCoefficients.length === 0) {\n    return undefined;\n  }\n\n  // If boxType specified, filter by box type name\n  if (boxType) {\n    const boxTypeNames = BOX_TYPE_MAPPINGS[boxType];\n    const matchingByBoxType = warehouseCoefficients.find((c) =>\n      boxTypeNames.some((name) => c.boxTypeName === name)\n    );\n\n    if (matchingByBoxType) {\n      return matchingByBoxType;\n    }\n  }\n\n  // Return first matching warehouse coefficient (default to box type)\n  return warehouseCoefficients[0];\n}\n\n/**\n * Calculates the total supply cost including acceptance, storage, and logistics\n *\n * @param input - Supply cost input parameters\n * @param getCoefficients - Function to retrieve acceptance coefficients from API\n * @returns Promise resolving to detailed cost breakdown\n *\n * @throws Error when volume is <= 0\n * @throws Error when no coefficients are available\n * @throws Error when warehouse is not found\n * @throws Error when acceptance is unavailable (coefficient = -1)\n *\n * @example\n * ```typescript\n * const result = await calculateSupplyCost(\n *   { volume: 5, warehouseID: 507, days: 30 },\n *   () => sdk.ordersFBW.getAcceptanceCoefficients()\n * );\n *\n * console.log(result.totalCost); // Total cost in rubles\n * console.log(result.storageCost); // Storage cost breakdown\n * ```\n */\nexport async function calculateSupplyCost(\n  input: SupplyCostInput,\n  getCoefficients: () => Promise<ModelsAcceptanceCoefficient[]>\n): Promise<SupplyCostResult> {\n  const { volume, warehouseID, days, boxType } = input;\n\n  // Validate input\n  if (volume <= 0) {\n    throw new Error('Volume must be greater than 0');\n  }\n\n  // Fetch coefficients from API\n  const coefficients = await getCoefficients();\n\n  // Validate coefficients response\n  if (coefficients.length === 0) {\n    throw new Error('No acceptance coefficients available');\n  }\n\n  // Find matching coefficient for warehouse and box type\n  const matchingCoefficient = findMatchingCoefficient(coefficients, warehouseID, boxType);\n\n  if (!matchingCoefficient) {\n    throw new Error(`Warehouse with ID ${warehouseID} not found`);\n  }\n\n  // Check if acceptance is available\n  const acceptanceCoefficient = matchingCoefficient.coefficient ?? 0;\n  if (acceptanceCoefficient === -1) {\n    throw new Error(`Acceptance unavailable for warehouse: ${matchingCoefficient.warehouseName}`);\n  }\n\n  // Determine if this is a pallet shipment\n  const isPallet = boxType === 'pallet' || matchingCoefficient.boxTypeName === 'Монопаллеты';\n\n  // Calculate individual costs\n  const acceptanceCost = calculateAcceptanceCost(acceptanceCoefficient);\n  const storageCost = calculateStorageCost(volume, days, matchingCoefficient, isPallet);\n  const logisticsCost = calculateLogisticsCost(volume, matchingCoefficient, isPallet);\n\n  // Calculate total\n  const totalCost = roundTo2Decimals(acceptanceCost + storageCost + logisticsCost);\n\n  // Build result\n  return {\n    acceptanceCost,\n    storageCost,\n    logisticsCost,\n    totalCost,\n    warehouseName: matchingCoefficient.warehouseName ?? '',\n    appliedCoefficients: {\n      acceptance: acceptanceCoefficient,\n      storage: parseNumeric(matchingCoefficient.storageCoef, DEFAULT_STORAGE_COEF),\n      delivery: parseNumeric(matchingCoefficient.deliveryCoef, DEFAULT_DELIVERY_COEF),\n    },\n  };\n}\n\nexport default calculateSupplyCost;\n","/**\n * Utility for comparing tariffs between inventory storage (tariffs/box) and supply (acceptance/coefficients) APIs\n *\n * Story 11.4: Compare tariffs across different Wildberries APIs\n *\n * @module utils/compareTariffs\n */\n\nimport type { ModelsWarehouseBoxRates } from '../types/tariffs.types';\nimport type { ModelsAcceptanceCoefficient } from '../types/orders-fbw.types';\n\n/**\n * Input parameters for tariff comparison\n */\nexport interface CompareTariffsInput {\n  /** Warehouse name to search for (supports partial matching) */\n  warehouseName: string;\n  /** Date for the comparison (ISO format: YYYY-MM-DD) */\n  date: string;\n}\n\n/**\n * Tariff data from a single source\n */\nexport interface TariffData {\n  /** Base delivery cost per liter */\n  deliveryBase: number;\n  /** Delivery coefficient (percentage) */\n  deliveryCoef: number;\n  /** Base storage cost per liter per day */\n  storageBase: number;\n  /** Storage coefficient (percentage) */\n  storageCoef: number;\n  /** Whether the warehouse was found in this API */\n  found: boolean;\n}\n\n/**\n * Percentage differences between inventory and supply tariffs\n */\nexport interface TariffDifference {\n  /** Percentage difference in delivery base cost: (supply - inventory) / inventory * 100 */\n  deliveryBasePercent: number;\n  /** Percentage difference in storage base cost: (supply - inventory) / inventory * 100 */\n  storageBasePercent: number;\n}\n\n/**\n * Recommendation based on tariff comparison\n */\nexport type TariffRecommendation = 'SUPPLY_CHEAPER' | 'INVENTORY_CHEAPER' | 'EQUAL';\n\n/**\n * Complete tariff comparison result\n */\nexport interface TariffComparison {\n  /** Warehouse name used for comparison */\n  warehouseName: string;\n  /** Date used for comparison */\n  date: string;\n  /** Tariff data from inventory storage API (tariffs/box) */\n  inventory: TariffData;\n  /** Tariff data from supply API (acceptance/coefficients) */\n  supply: TariffData;\n  /** Percentage differences between the two sources */\n  difference: TariffDifference;\n  /** Recommendation based on which source has lower overall costs */\n  recommendation: TariffRecommendation;\n}\n\n/**\n * Safely parse a numeric string value, returning 0 for undefined/null/invalid values\n *\n * @param value - String value to parse\n * @returns Parsed number or 0\n */\nfunction parseNumericValue(value: string | undefined | null): number {\n  if (value === undefined || value === null || value === '') {\n    return 0;\n  }\n  const parsed = parseFloat(value);\n  return isNaN(parsed) ? 0 : parsed;\n}\n\n/**\n * Check if warehouse name matches the search term (case-insensitive, partial match)\n *\n * Supports matching where API names may have additional qualifiers:\n * - \"Краснодар\" matches \"Краснодар (Тихорецкая)\"\n * - \"Коледино\" matches \"Коледино\"\n *\n * @param warehouseName - The warehouse name from API\n * @param searchTerm - The search term to match\n * @returns True if the warehouse name matches\n */\nfunction matchesWarehouseName(warehouseName: string | undefined, searchTerm: string): boolean {\n  if (!warehouseName) {\n    return false;\n  }\n\n  const normalizedWarehouse = warehouseName.toLowerCase().trim();\n  const normalizedSearch = searchTerm.toLowerCase().trim();\n\n  // Exact match or starts with the search term\n  return (\n    normalizedWarehouse === normalizedSearch || normalizedWarehouse.startsWith(normalizedSearch)\n  );\n}\n\n/**\n * Find warehouse in box tariffs data\n *\n * @param boxTariffs - Array of box tariffs from API\n * @param warehouseName - Warehouse name to search for\n * @returns Found tariff or undefined\n */\nfunction findBoxTariff(\n  boxTariffs: ModelsWarehouseBoxRates[],\n  warehouseName: string\n): ModelsWarehouseBoxRates | undefined {\n  return boxTariffs.find((tariff) => matchesWarehouseName(tariff.warehouseName, warehouseName));\n}\n\n/**\n * Find warehouse in acceptance coefficients data\n *\n * @param coefficients - Array of acceptance coefficients from API\n * @param warehouseName - Warehouse name to search for\n * @returns Found coefficient or undefined\n */\nfunction findAcceptanceCoefficient(\n  coefficients: ModelsAcceptanceCoefficient[],\n  warehouseName: string\n): ModelsAcceptanceCoefficient | undefined {\n  return coefficients.find((coef) => matchesWarehouseName(coef.warehouseName, warehouseName));\n}\n\n/**\n * Extract tariff data from box tariff (inventory storage API)\n *\n * @param tariff - Box tariff data from API\n * @returns Normalized tariff data\n */\nfunction extractInventoryTariff(tariff: ModelsWarehouseBoxRates | undefined): TariffData {\n  if (!tariff) {\n    return {\n      deliveryBase: 0,\n      deliveryCoef: 0,\n      storageBase: 0,\n      storageCoef: 0,\n      found: false,\n    };\n  }\n\n  return {\n    deliveryBase: parseNumericValue(tariff.boxDeliveryBase),\n    deliveryCoef: parseNumericValue(tariff.boxDeliveryCoefExpr),\n    storageBase: parseNumericValue(tariff.boxStorageBase),\n    storageCoef: parseNumericValue(tariff.boxStorageCoefExpr),\n    found: true,\n  };\n}\n\n/**\n * Extract tariff data from acceptance coefficient (supply API)\n *\n * @param coefficient - Acceptance coefficient data from API\n * @returns Normalized tariff data\n */\nfunction extractSupplyTariff(coefficient: ModelsAcceptanceCoefficient | undefined): TariffData {\n  if (!coefficient) {\n    return {\n      deliveryBase: 0,\n      deliveryCoef: 0,\n      storageBase: 0,\n      storageCoef: 0,\n      found: false,\n    };\n  }\n\n  return {\n    deliveryBase: parseNumericValue(coefficient.deliveryBaseLiter),\n    deliveryCoef: parseNumericValue(coefficient.deliveryCoef),\n    storageBase: parseNumericValue(coefficient.storageBaseLiter),\n    storageCoef: parseNumericValue(coefficient.storageCoef),\n    found: true,\n  };\n}\n\n/**\n * Calculate percentage difference between two values\n *\n * Formula: (supply - inventory) / inventory * 100\n *\n * @param inventory - Inventory (base) value\n * @param supply - Supply value to compare\n * @returns Percentage difference (positive means supply is higher)\n */\nfunction calculatePercentageDifference(inventory: number, supply: number): number {\n  if (inventory === 0) {\n    // If inventory is 0, we can't calculate percentage difference\n    return supply === 0 ? 0 : 100;\n  }\n  return ((supply - inventory) / inventory) * 100;\n}\n\n/**\n * Calculate differences between inventory and supply tariffs\n *\n * @param inventory - Inventory tariff data\n * @param supply - Supply tariff data\n * @returns Calculated differences\n */\nfunction calculateDifferences(inventory: TariffData, supply: TariffData): TariffDifference {\n  return {\n    deliveryBasePercent: calculatePercentageDifference(inventory.deliveryBase, supply.deliveryBase),\n    storageBasePercent: calculatePercentageDifference(inventory.storageBase, supply.storageBase),\n  };\n}\n\n/**\n * Determine recommendation based on tariff comparison\n *\n * Compares total costs (delivery + storage) to determine which option is cheaper.\n * If only one source has data, that source is recommended as \"cheaper\".\n *\n * @param inventory - Inventory tariff data\n * @param supply - Supply tariff data\n * @returns Recommendation\n */\nfunction determineRecommendation(inventory: TariffData, supply: TariffData): TariffRecommendation {\n  // If only inventory is found, recommend inventory\n  if (inventory.found && !supply.found) {\n    return 'INVENTORY_CHEAPER';\n  }\n\n  // If only supply is found, recommend supply\n  if (!inventory.found && supply.found) {\n    return 'SUPPLY_CHEAPER';\n  }\n\n  // Calculate total costs (weighted comparison using delivery + storage base costs)\n  const inventoryTotal = inventory.deliveryBase + inventory.storageBase;\n  const supplyTotal = supply.deliveryBase + supply.storageBase;\n\n  // Compare totals with small epsilon for floating point comparison\n  const epsilon = 0.0001;\n  if (Math.abs(inventoryTotal - supplyTotal) < epsilon) {\n    return 'EQUAL';\n  }\n\n  return supplyTotal < inventoryTotal ? 'SUPPLY_CHEAPER' : 'INVENTORY_CHEAPER';\n}\n\n/**\n * Compare tariffs between inventory storage (tariffs/box) and supply (acceptance/coefficients) APIs\n *\n * This utility fetches and compares tariff data from two different Wildberries APIs:\n * - tariffs/box (common-api): Inventory storage tariffs\n * - acceptance/coefficients (supplies-api): Supply acceptance tariffs\n *\n * The comparison helps sellers decide which fulfillment option is more cost-effective.\n *\n * @param input - Comparison parameters (warehouseName, date)\n * @param getBoxTariffs - Function to fetch box tariffs from API\n * @param getAcceptanceCoefficients - Function to fetch acceptance coefficients from API\n * @returns Comprehensive tariff comparison result\n * @throws Error if warehouse not found in both APIs\n *\n * @example\n * ```typescript\n * const result = await compareTariffs(\n *   { warehouseName: 'Коледино', date: '2025-01-25' },\n *   () => sdk.tariffs.getBoxTariffs(),\n *   () => sdk.ordersFBW.getAcceptanceCoefficients()\n * );\n *\n * if (result.recommendation === 'SUPPLY_CHEAPER') {\n *   console.log('Supply is more cost-effective');\n * }\n * ```\n */\nexport async function compareTariffs(\n  input: CompareTariffsInput,\n  getBoxTariffs: () => Promise<ModelsWarehouseBoxRates[]>,\n  getAcceptanceCoefficients: () => Promise<ModelsAcceptanceCoefficient[]>\n): Promise<TariffComparison> {\n  const { warehouseName, date } = input;\n\n  // Fetch data from both APIs in parallel\n  const [boxTariffs, acceptanceCoefficients] = await Promise.all([\n    getBoxTariffs(),\n    getAcceptanceCoefficients(),\n  ]);\n\n  // Find matching warehouses\n  const boxTariff = findBoxTariff(boxTariffs, warehouseName);\n  const acceptanceCoef = findAcceptanceCoefficient(acceptanceCoefficients, warehouseName);\n\n  // Extract tariff data\n  const inventory = extractInventoryTariff(boxTariff);\n  const supply = extractSupplyTariff(acceptanceCoef);\n\n  // Check if warehouse was found in at least one API\n  if (!inventory.found && !supply.found) {\n    throw new Error(`Warehouse \"${warehouseName}\" not found`);\n  }\n\n  // Calculate differences\n  const difference = calculateDifferences(inventory, supply);\n\n  // Determine recommendation\n  const recommendation = determineRecommendation(inventory, supply);\n\n  return {\n    warehouseName,\n    date,\n    inventory,\n    supply,\n    difference,\n    recommendation,\n  };\n}\n","import type { SubjectCharacteristic, CardCharacteristicInput } from '../types/products.types';\nimport { warnOnce } from './deprecation';\n\n/**\n * Validates that all mandatory characteristics are present in a card creation request.\n * Returns the list of missing mandatory characteristics.\n *\n * **v3.10.2 update**: added optional `namedFields` parameter to correctly handle WB API\n * characteristics with `existNamedField: true` (e.g. `brand`, `height`, `length`, `name`,\n * `width`, `weight`) which are submitted as top-level card fields rather than inside\n * the `characteristics[]` array.\n *\n * Without the `namedFields` parameter the helper falls back to legacy behaviour and emits\n * a one-time `console.warn` whenever a required `existNamedField: true` characteristic is\n * encountered — this may cause false positives. Pass the named-field values as the third\n * argument to suppress the warning and get accurate results.\n *\n * @param characteristics - All characteristics for the category (from getObjectCharc())\n * @param input - Characteristics included in the card creation request\n * @param namedFields - Optional map of named-field values (brand, height, length, etc.)\n *   keyed by characteristic name. Pass values from the top-level card fields.\n * @returns Array of missing mandatory characteristics (empty if all present)\n *\n * @example New call pattern (v3.10.2+):\n * ```typescript\n * const charcs = await sdk.products.getObjectCharc(1260);\n * const myChars = [{ id: 101, value: '64GB' }];\n * const missing = validateRequiredCharacteristics(\n *   charcs.data ?? [],\n *   myChars,\n *   { brand: 'Acme', height: 10, length: 20, width: 5, weight: 0.5 }\n * );\n * if (missing.length > 0) {\n *   console.error('Missing:', missing.map(c => c.name));\n * }\n * ```\n *\n * @example Legacy call pattern (still supported, emits one-time warn if existNamedField found):\n * ```typescript\n * const missing = validateRequiredCharacteristics(charcs.data ?? [], myChars);\n * ```\n *\n * @see CHANGELOG v3.10.2 for migration details\n * @since v3.9.0\n */\nexport function validateRequiredCharacteristics(\n  characteristics: SubjectCharacteristic[],\n  input: CardCharacteristicInput[],\n  namedFields?: Record<string, unknown>\n): SubjectCharacteristic[] {\n  const inputByCharcId = new Set(input.map((c) => c.id));\n  let warnEmitted = false;\n\n  return characteristics\n    .filter((c) => c.isRequiredForCreate === true)\n    .filter((c) => {\n      if (c.existNamedField === true) {\n        if (!namedFields) {\n          if (!warnEmitted) {\n            warnOnce(\n              'validateRequiredCharacteristics:legacy-call',\n              'validateRequiredCharacteristics: a required characteristic with existNamedField:true was found, ' +\n                'but no `namedFields` parameter was provided. Helper may report false positives. ' +\n                'Pass the named-field values (brand, height, length, etc.) as the third argument. ' +\n                'See CHANGELOG v3.10.2 for migration details.'\n            );\n            warnEmitted = true;\n          }\n          // Legacy fallback: assume not satisfied (matches old behaviour, surfaces the bug visibly)\n          return !inputByCharcId.has(c.charcID ?? -1);\n        }\n        // New behaviour: check namedFields by name\n        const value = c.name ? namedFields[c.name] : undefined;\n        const present = value !== undefined && value !== null && value !== '';\n        return !present;\n      }\n      // existNamedField: false | undefined → check input[] by id (existing behaviour)\n      return !inputByCharcId.has(c.charcID ?? -1);\n    });\n}\n","import type { SubjectCharacteristic, CardCharacteristicInput } from '../types/products.types';\nimport { warnOnce } from './deprecation';\n\n/**\n * A single product variant within a merged card.\n * @since v3.9.2\n */\nexport interface MergedCardVariant {\n  /** Characteristics for this variant */\n  characteristics: CardCharacteristicInput[];\n}\n\n/**\n * Result of merged card variant validation.\n * @since v3.9.2\n */\nexport interface MergedCardValidationResult {\n  /** Non-variable characteristics (isVariable: false) that have DIFFERENT values across variants — WB will reject these. */\n  divergentFixedChars: SubjectCharacteristic[];\n  /** Variable characteristics (isVariable: true) that have IDENTICAL values across all variants — possibly intentional, but flagged for review. */\n  identicalVariableChars: SubjectCharacteristic[];\n  /** True if two or more variants share the exact same combination of variable characteristic values (duplicate variants — WB rejects). */\n  duplicateVariants: boolean;\n}\n\n/**\n * Client-side validator for merged product card variants.\n *\n * Checks that:\n * 1. All variants share the same value for `isVariable: false` characteristics (fixed chars).\n * 2. No two variants have identical combinations of `isVariable: true` values (duplicate variants).\n * 3. Optionally flags variable characteristics that don't actually vary across variants.\n *\n * **v3.10.2 update**: added optional `namedFieldsPerVariant` parameter — an array (one map per\n * variant by index) — to correctly handle WB API characteristics with `existNamedField: true`\n * (e.g. `brand`, `height`, `length`, `name`, `width`, `weight`) which are submitted as top-level\n * card fields rather than inside the variant `characteristics[]` array.\n *\n * Without the `namedFieldsPerVariant` parameter the helper falls back to legacy behaviour and\n * emits a one-time `console.warn` whenever a required `existNamedField: true` characteristic is\n * encountered — this may cause false positives.\n *\n * This is a best-effort client-side hint. The Wildberries API is the final authority —\n * a validation pass here doesn't guarantee API acceptance.\n *\n * @param characteristics - All characteristics for the category (from `getObjectCharc()`)\n * @param variants - Variants planned for the merged card\n * @param namedFieldsPerVariant - Optional array of named-field maps, one per variant (by index).\n *   Each map holds top-level field values (brand, height, etc.) keyed by characteristic name.\n * @returns Validation result with violations grouped by type\n *\n * @example New call pattern (v3.10.2+):\n * ```typescript\n * const charcs = await sdk.products.getObjectCharc(2314);\n * const result = validateMergedCardVariants(\n *   charcs.data ?? [],\n *   [\n *     { characteristics: [{ id: 14177449, value: 'Red' }] },\n *     { characteristics: [{ id: 14177449, value: 'Blue' }] },\n *   ],\n *   [\n *     { brand: 'Acme', height: 10 },\n *     { brand: 'Acme', height: 10 },\n *   ]\n * );\n * if (result.divergentFixedChars.length > 0) {\n *   throw new Error(`Fixed chars differ: ${result.divergentFixedChars.map(c => c.name).join(', ')}`);\n * }\n * ```\n *\n * @example Legacy call pattern (still supported, emits one-time warn if existNamedField found):\n * ```typescript\n * const result = validateMergedCardVariants(charcs.data ?? [], variants);\n * ```\n *\n * @see CHANGELOG v3.10.2 for migration details\n * @since v3.9.2\n */\nexport function validateMergedCardVariants(\n  characteristics: SubjectCharacteristic[],\n  variants: MergedCardVariant[],\n  namedFieldsPerVariant?: Record<string, unknown>[]\n): MergedCardValidationResult {\n  if (variants.length < 2) {\n    return { divergentFixedChars: [], identicalVariableChars: [], duplicateVariants: false };\n  }\n\n  // Build map: charcID -> SubjectCharacteristic for lookup\n  const charcsById = new Map<number, SubjectCharacteristic>();\n  for (const c of characteristics) {\n    if (c.charcID !== undefined) charcsById.set(c.charcID, c);\n  }\n\n  // For each characteristic in any variant, gather distinct values across all variants.\n  // For existNamedField:true chars, values come from namedFieldsPerVariant rather than\n  // the variant's characteristics[] array.\n  const valueByCharcId = new Map<number, Set<string>>();\n\n  // Track whether we have already emitted the legacy warn for this call\n  let legacyWarnEmitted = false;\n\n  // Helper to resolve value for a characteristic in a given variant\n  const resolveValue = (\n    charc: SubjectCharacteristic,\n    variantIndex: number,\n    variant: MergedCardVariant\n  ): string => {\n    if (charc.existNamedField === true) {\n      const namedMap = namedFieldsPerVariant?.[variantIndex];\n      if (namedMap === undefined) {\n        if (!legacyWarnEmitted) {\n          warnOnce(\n            'validateMergedCardVariants:legacy-call',\n            'validateMergedCardVariants: a required characteristic with existNamedField:true was found, ' +\n              'but no `namedFieldsPerVariant` parameter was provided (or the slot for this variant is undefined). ' +\n              'Helper may report false positives. ' +\n              'Pass the named-field values per variant as the third argument. ' +\n              'See CHANGELOG v3.10.2 for migration details.'\n          );\n          legacyWarnEmitted = true;\n        }\n        // Legacy fallback: look in characteristics[] (old behaviour)\n        const input = variant.characteristics.find((c) => c.id === (charc.charcID ?? -1));\n        return JSON.stringify(input?.value ?? null);\n      }\n      // New behaviour: read from namedFields map by characteristic name\n      const fieldValue = charc.name ? namedMap[charc.name] : undefined;\n      return JSON.stringify(fieldValue ?? null);\n    }\n    // existNamedField: false | undefined → existing behaviour\n    const input = variant.characteristics.find((c) => c.id === (charc.charcID ?? -1));\n    return JSON.stringify(input?.value ?? null);\n  };\n\n  // Build valueByCharcId using resolved values\n  for (let i = 0; i < variants.length; i++) {\n    const variant = variants[i];\n\n    // For normal chars (not existNamedField), gather from variant.characteristics\n    for (const input of variant.characteristics) {\n      let set = valueByCharcId.get(input.id);\n      if (!set) {\n        set = new Set();\n        valueByCharcId.set(input.id, set);\n      }\n      set.add(JSON.stringify(input.value));\n    }\n\n    // For existNamedField:true chars, gather from namedFieldsPerVariant (or fallback)\n    for (const c of characteristics) {\n      if (c.existNamedField === true && c.charcID !== undefined) {\n        let set = valueByCharcId.get(c.charcID);\n        if (!set) {\n          set = new Set();\n          valueByCharcId.set(c.charcID, set);\n        }\n        set.add(resolveValue(c, i, variant));\n      }\n    }\n  }\n\n  const divergentFixedChars: SubjectCharacteristic[] = [];\n  const identicalVariableChars: SubjectCharacteristic[] = [];\n\n  for (const [charcId, valueSet] of valueByCharcId) {\n    const charc = charcsById.get(charcId);\n    if (!charc) continue; // Unknown char — skip\n    if (charc.isVariable === false && valueSet.size > 1) {\n      divergentFixedChars.push(charc);\n    }\n    if (charc.isVariable === true && valueSet.size === 1) {\n      identicalVariableChars.push(charc);\n    }\n  }\n\n  // Detect duplicate variants by comparing combined variable-char value signatures\n  const variableCharIds = characteristics\n    .filter(\n      (c): c is SubjectCharacteristic & { charcID: number } =>\n        c.isVariable === true && c.charcID !== undefined\n    )\n    .map((c) => c.charcID);\n\n  const signatures = new Set<string>();\n  let duplicateVariants = false;\n  for (let i = 0; i < variants.length; i++) {\n    const variant = variants[i];\n    const sig = variableCharIds\n      .map((id) => {\n        const c = charcsById.get(id);\n        if (c?.existNamedField === true) {\n          return `${id}:${resolveValue(c, i, variant)}`;\n        }\n        const input = variant.characteristics.find((ci) => ci.id === id);\n        return `${id}:${JSON.stringify(input?.value ?? null)}`;\n      })\n      .join('|');\n    if (signatures.has(sig)) {\n      duplicateVariants = true;\n      break;\n    }\n    signatures.add(sig);\n  }\n\n  return { divergentFixedChars, identicalVariableChars, duplicateVariants };\n}\n","import type { GoodsReturnItem } from '../types/reports.types';\nimport { classifyReturnReason, type ReturnReasonCode } from './classifyReturnReason';\n\n/**\n * Unified return record across FBO and FBS sources.\n *\n * Constructed by `enrichReturnsWithType()` from raw WB API responses.\n * Adds `orderType` (FBO vs FBS) and `reasonCode` (standardized enum) which are\n * not directly available from any single WB endpoint.\n *\n * @since v3.9.3\n */\nexport interface WbReturn {\n  /** Артикул WB (numeric) */\n  nmId: number;\n  /** ID заказа */\n  orderId: number;\n  /** Дата возврата (ISO 8601) — completedDt for FBO, lastChangeDate for FBS */\n  returnDate: string;\n  /** Свободно-текстовая причина возврата */\n  reason: string;\n  /** Стандартизированный код причины (классификатор) */\n  reasonCode: ReturnReasonCode;\n  /** Адрес/имя склада (если доступно) */\n  warehouseName?: string;\n  /** Тип заказа — derived from data source */\n  orderType: 'fbo' | 'fbs';\n  /** Количество (по умолчанию 1 — каждая запись = одна единица) */\n  quantity: number;\n}\n\n/**\n * Minimal FBS return shape — what consumers should pass for FBS returns.\n * The actual FBS return data comes from order status history; consumers shape it\n * into this minimal record before calling enrichReturnsWithType().\n *\n * @since v3.9.3\n */\nexport interface FbsReturnInput {\n  nmId?: number;\n  orderId?: number;\n  /** Дата изменения статуса на возврат */\n  lastChangeDate?: string;\n  /** Причина возврата */\n  reason?: string;\n  /** Имя склада */\n  warehouseName?: string;\n  /** Количество (по умолчанию 1) */\n  quantity?: number;\n}\n\n/**\n * Builds a unified WbReturn[] from FBO returns (sdk.reports.getAnalyticsGoodsReturn)\n * and optional FBS returns (derived from sdk.ordersFBS status history).\n *\n * Records missing required fields (nmId, orderId, return date) are silently skipped.\n *\n * Pure function — no network calls.\n *\n * @param fboReturns - FBO returns from getAnalyticsGoodsReturn().report\n * @param fbsReturns - Optional FBS return records (consumer-shaped from order status history)\n * @returns Unified array sorted by returnDate descending\n *\n * @example\n * ```typescript\n * const fbo = await sdk.reports.getAnalyticsGoodsReturn({ dateFrom, dateTo });\n * const unified = enrichReturnsWithType(fbo.report ?? [], myFbsReturns);\n * console.log(`Total: ${unified.length}, FBO: ${unified.filter(r => r.orderType === 'fbo').length}`);\n * ```\n *\n * @since v3.9.3\n */\nexport function enrichReturnsWithType(\n  fboReturns: GoodsReturnItem[],\n  fbsReturns: FbsReturnInput[] = []\n): WbReturn[] {\n  const result: WbReturn[] = [];\n\n  for (const item of fboReturns) {\n    const returnDate = item.completedDt ?? item.readyToReturnDt ?? item.orderDt;\n    if (item.nmId === undefined || item.orderId === undefined || !returnDate) continue;\n    const reason = item.reason ?? '';\n    result.push({\n      nmId: item.nmId,\n      orderId: item.orderId,\n      returnDate,\n      reason,\n      reasonCode: classifyReturnReason(reason),\n      warehouseName: item.dstOfficeAddress,\n      orderType: 'fbo',\n      quantity: 1,\n    });\n  }\n\n  for (const item of fbsReturns) {\n    if (item.nmId === undefined || item.orderId === undefined || !item.lastChangeDate) continue;\n    const reason = item.reason ?? '';\n    result.push({\n      nmId: item.nmId,\n      orderId: item.orderId,\n      returnDate: item.lastChangeDate,\n      reason,\n      reasonCode: classifyReturnReason(reason),\n      warehouseName: item.warehouseName,\n      orderType: 'fbs',\n      quantity: item.quantity ?? 1,\n    });\n  }\n\n  result.sort((a, b) => b.returnDate.localeCompare(a.returnDate));\n  return result;\n}\n","import type { ReturnCategory } from '../types/returns.types';\n\n/**\n * Single FBS status event from order status history.\n * Consumer shapes this from their `order_wb_status_history` table or SDK call.\n *\n * @since v3.10.0\n */\nexport interface FbsStatusEvent {\n  /** Status code (e.g., 'new', 'confirmed', 'assembled', 'delivered', 'cancelled', 'defected', 'returned', 'canceled_by_client'/'cancelled_by_client') */\n  status: string;\n  /** ISO 8601 timestamp when status was set */\n  date: string;\n}\n\n/**\n * Classifies an FBS order's return category by analyzing its status history.\n *\n * **Heuristic** — based on observed WB status transition patterns. May misclassify\n * unusual sequences. Verify accuracy on your production data before relying on\n * results. Returns 'unknown' for sequences that don't match any known pattern.\n *\n * Mapping rules (in priority order):\n * 1. **`cancel_before_shipment`** — sequence ends with `cancelled`/`canceled` AND\n *    no `confirmed`/`assembled` status appears earlier (cancelled before warehouse picked up)\n * 2. **`refusal_at_pvz`** — `delivered` status followed by `defected` or `canceled_by_client`\n *    (buyer arrived at pickup point and refused the package)\n * 3. **`return_after_receipt`** — `delivered` status followed later by `returned`\n *    (buyer accepted the package, then initiated a return)\n * 4. **`unknown`** — empty array, no return-indicating status, or ambiguous sequence\n *\n * @param statuses - Chronologically ordered FBS status events. If unordered, function sorts by date.\n * @returns Categorized return type\n *\n * @example\n * ```typescript\n * const category = classifyFbsReturnCategory([\n *   { status: 'new', date: '2026-04-01T10:00:00Z' },\n *   { status: 'confirmed', date: '2026-04-01T11:00:00Z' },\n *   { status: 'assembled', date: '2026-04-02T09:00:00Z' },\n *   { status: 'delivered', date: '2026-04-05T14:00:00Z' },\n *   { status: 'returned', date: '2026-04-09T11:00:00Z' },\n * ]);\n * // → 'return_after_receipt'\n * ```\n *\n * @since v3.10.0\n */\nexport function classifyFbsReturnCategory(statuses: FbsStatusEvent[]): ReturnCategory {\n  if (statuses.length === 0) return 'unknown';\n\n  // Sort defensively by date\n  const sorted = [...statuses].sort((a, b) => a.date.localeCompare(b.date));\n  const codes = sorted.map((s) => s.status.toLowerCase());\n\n  const hasDelivered = codes.includes('delivered');\n  const hasReturned = codes.includes('returned');\n  const hasCancelled = codes.some((c) => c === 'cancelled' || c === 'canceled');\n  const hasDefected = codes.includes('defected');\n  const hasClientCanceled = codes.some(\n    (c) => c === 'canceled_by_client' || c === 'cancelled_by_client'\n  );\n  const hasConfirmed = codes.some((c) => c === 'confirmed' || c === 'assembled');\n\n  // ASSUMPTION: WB FBS orderIds are not reused across shipments — each new\n  // shipment gets a new orderId. Therefore indexOf() finding the FIRST\n  // 'delivered'/'returned' is sufficient. If WB ever changes this contract,\n  // these rules need to track ALL occurrences, not just first.\n\n  // Rule 3: delivered → returned (after_receipt)\n  if (hasDelivered && hasReturned) {\n    const deliveredIdx = codes.indexOf('delivered');\n    const returnedIdx = codes.indexOf('returned');\n    if (returnedIdx > deliveredIdx) return 'return_after_receipt';\n  }\n\n  // Rule 2: delivered → defected/canceled_by_client (refusal_at_pvz)\n  if (hasDelivered && (hasDefected || hasClientCanceled)) {\n    const deliveredIdx = codes.indexOf('delivered');\n    const refusalIdx = Math.min(\n      hasDefected ? codes.indexOf('defected') : Infinity,\n      hasClientCanceled\n        ? (() => {\n            const i1 = codes.indexOf('canceled_by_client');\n            const i2 = codes.indexOf('cancelled_by_client');\n            return Math.min(i1 < 0 ? Infinity : i1, i2 < 0 ? Infinity : i2);\n          })()\n        : Infinity\n    );\n    if (refusalIdx > deliveredIdx) return 'refusal_at_pvz';\n  }\n\n  // Rule 1: cancelled before any confirmed/assembled (cancel_before_shipment)\n  if (hasCancelled && !hasConfirmed) return 'cancel_before_shipment';\n\n  return 'unknown';\n}\n","import type { WbReturn } from './enrichReturnsWithType';\n\n/**\n * Buyout record input — minimal shape derived from sdk.analytics getStocksReportProducts() output.\n * Consumers shape their data into this before calling reconcileBuyoutsAndReturns().\n *\n * @since v3.9.3\n */\nexport interface BuyoutInput {\n  nmId: number;\n  /** Number of buyout transactions */\n  buyoutCount: number;\n  /** Buyout date (used for temporal alignment) — ISO 8601 */\n  buyoutDate?: string;\n  /** Total revenue from buyouts (rubles) */\n  buyoutRevenue?: number;\n}\n\n/**\n * Anomaly detected during reconciliation.\n *\n * @since v3.9.3\n */\nexport interface ReconciliationAnomaly {\n  type: 'return_without_buyout' | 'return_quantity_mismatch' | 'orphan_buyout';\n  nmId: number;\n  orderId?: number;\n  details: string;\n}\n\n/**\n * Per-nmId reconciliation summary.\n *\n * @since v3.9.3\n */\nexport interface ReconciliationResult {\n  nmId: number;\n  buyoutCount: number;\n  /** Total returns across both FBO and FBS */\n  returnCount: number;\n  fboReturnCount: number;\n  fbsReturnCount: number;\n  /** Net revenue = buyoutRevenue - return penalties (negative if returns dominate) */\n  netRevenue?: number;\n  /** Anomalies for this nmId */\n  anomalies: ReconciliationAnomaly[];\n}\n\n/**\n * Optional configuration for reconciliation.\n *\n * @since v3.9.3\n */\nexport interface ReconcileOptions {\n  /**\n   * If true, flag returns whose returnDate is outside the buyout date window\n   * as 'return_without_buyout' anomalies. Default: false (date alignment is approximate).\n   */\n  strictTemporalAlignment?: boolean;\n  /**\n   * Window (in days) to consider a return temporally aligned with a buyout.\n   * Only used when strictTemporalAlignment = true. Default: 60.\n   */\n  alignmentWindowDays?: number;\n}\n\n/**\n * Reconciles buyouts and returns per nmId for unified analytics.\n *\n * Combines:\n * - Buyout data from sdk.analytics.getStocksReportProducts() (consumer-shaped)\n * - Unified returns from enrichReturnsWithType() (FBO + FBS)\n *\n * Detects anomalies:\n * - return_without_buyout: more returns than buyouts for an nmId\n * - orphan_buyout: nmId has buyouts but no record at all in returns array (informational)\n * - return_quantity_mismatch: future-reserved\n *\n * Pure function — no network calls.\n *\n * @example\n * ```typescript\n * const buyouts: BuyoutInput[] = [{ nmId: 12345, buyoutCount: 10, buyoutRevenue: 50000 }];\n * const returns = enrichReturnsWithType(fboData, fbsData);\n * const summary = reconcileBuyoutsAndReturns(buyouts, returns);\n *\n * for (const r of summary) {\n *   if (r.anomalies.length > 0) console.warn(`nmId=${r.nmId}:`, r.anomalies);\n * }\n * ```\n *\n * @since v3.9.3\n */\nexport function reconcileBuyoutsAndReturns(\n  buyouts: BuyoutInput[],\n  returns: WbReturn[],\n  options: ReconcileOptions = {}\n): ReconciliationResult[] {\n  const byNmId = new Map<number, ReconciliationResult>();\n\n  // Initialize from buyouts\n  for (const b of buyouts) {\n    byNmId.set(b.nmId, {\n      nmId: b.nmId,\n      buyoutCount: b.buyoutCount,\n      returnCount: 0,\n      fboReturnCount: 0,\n      fbsReturnCount: 0,\n      netRevenue: b.buyoutRevenue,\n      anomalies: [],\n    });\n  }\n\n  // Add returns\n  for (const r of returns) {\n    let entry = byNmId.get(r.nmId);\n    if (!entry) {\n      entry = {\n        nmId: r.nmId,\n        buyoutCount: 0,\n        returnCount: 0,\n        fboReturnCount: 0,\n        fbsReturnCount: 0,\n        netRevenue: undefined,\n        anomalies: [],\n      };\n      byNmId.set(r.nmId, entry);\n    }\n    entry.returnCount += r.quantity;\n    if (r.orderType === 'fbo') entry.fboReturnCount += r.quantity;\n    else entry.fbsReturnCount += r.quantity;\n  }\n\n  // Detect anomalies\n  for (const entry of byNmId.values()) {\n    if (entry.returnCount > entry.buyoutCount && entry.buyoutCount > 0) {\n      entry.anomalies.push({\n        type: 'return_without_buyout',\n        nmId: entry.nmId,\n        details: `${entry.returnCount} returns vs ${entry.buyoutCount} buyouts`,\n      });\n    }\n    if (entry.buyoutCount > 0 && entry.returnCount === 0 && options.strictTemporalAlignment) {\n      // Informational only when strict mode requested\n      entry.anomalies.push({\n        type: 'orphan_buyout',\n        nmId: entry.nmId,\n        details: `${entry.buyoutCount} buyouts with no returns`,\n      });\n    }\n    if (entry.buyoutCount === 0 && entry.returnCount > 0) {\n      entry.anomalies.push({\n        type: 'return_without_buyout',\n        nmId: entry.nmId,\n        details: `Return without matching buyout record (${entry.returnCount} returns, 0 buyouts)`,\n      });\n    }\n  }\n\n  return Array.from(byNmId.values()).sort((a, b) => a.nmId - b.nmId);\n}\n","import { MetaValidationFailError } from '../errors/meta-validation-fail-error';\nimport type { MetaDetail } from '../types/orders-fbs.types';\n\n/**\n * Parsed payload extracted from a MetaValidationFailError or a compatible plain object.\n */\nexport interface MetaValidationFailPayload {\n  code: string;\n  message: string;\n  metaDetails: MetaDetail[];\n}\n\n/**\n * Extracts marking-code validation failure details from an unknown caught value.\n *\n * Useful in shared error boundaries (e.g. middleware, global catch handlers) that\n * cannot import `MetaValidationFailError` directly but still want typed access to\n * the `metaDetails` array.\n *\n * Returns `null` for any input that is not a 409 meta-validation failure.\n *\n * @param err - The value caught in a `catch` block (typically `unknown`)\n * @returns Parsed payload `{ code, message, metaDetails }` or `null`\n *\n * @since 3.15.0\n *\n * @example Using in a shared error boundary\n * ```typescript\n * import { parseMetaValidationFail } from 'daytona-wildberries-typescript-sdk';\n *\n * async function deliverSupply(supplyId: string) {\n *   try {\n *     await sdk.ordersFBS.updateSuppliesDeliver(supplyId);\n *   } catch (err) {\n *     const parsed = parseMetaValidationFail(err);\n *     if (parsed) {\n *       // Typed access without importing MetaValidationFailError\n *       parsed.metaDetails\n *         .filter(d => d.decision === 'invalid')\n *         .forEach(d => console.error(`Invalid code for ${d.key}: \"${d.value}\"`));\n *       return;\n *     }\n *     throw err;\n *   }\n * }\n * ```\n */\nexport function parseMetaValidationFail(err: unknown): MetaValidationFailPayload | null {\n  if (err == null || typeof err !== 'object') {\n    return null;\n  }\n\n  // Fast path: instanceof check when MetaValidationFailError is available in scope\n  if (err instanceof MetaValidationFailError) {\n    return {\n      code: err.code,\n      message: err.message,\n      metaDetails: err.metaDetails,\n    };\n  }\n\n  // Fallback: duck-type check for plain WBAPIError-shaped objects with statusCode 409\n  // and a response containing a metaDetails array. Handles cross-realm / bundler\n  // scenarios where instanceof checks may fail.\n  // All fields typed unknown — defensive parsing for hostile/malformed inputs from external boundaries.\n  interface ErrorLike {\n    statusCode?: unknown;\n    response?: unknown;\n    message?: unknown;\n  }\n  interface ResponseLike {\n    code?: unknown;\n    message?: unknown;\n    metaDetails?: unknown;\n  }\n\n  const errObj = err as ErrorLike;\n\n  if (errObj.statusCode !== 409) {\n    return null;\n  }\n\n  const response = errObj.response;\n  if (response == null || typeof response !== 'object') {\n    return null;\n  }\n\n  const responseObj = response as ResponseLike;\n  if (!Array.isArray(responseObj.metaDetails)) {\n    return null;\n  }\n\n  const code = typeof responseObj.code === 'string' ? responseObj.code : 'Unknown';\n  const message =\n    typeof responseObj.message === 'string'\n      ? responseObj.message\n      : typeof errObj.message === 'string'\n        ? errObj.message\n        : 'Meta validation failed';\n\n  return {\n    code,\n    message,\n    metaDetails: responseObj.metaDetails as MetaDetail[],\n  };\n}\n","/**\n * Wildberries API TypeScript SDK\n * Main entry point\n *\n * @packageDocumentation\n */\n\nimport { BaseClient } from './client/base-client';\nimport { GeneralModule } from './modules/general';\nimport { ProductsModule } from './modules/products';\nimport { OrdersFbsModule } from './modules/orders-fbs';\nimport { OrdersFbwModule } from './modules/orders-fbw';\nimport { FinancesModule } from './modules/finances';\nimport { AnalyticsModule } from './modules/analytics';\nimport { CommunicationsModule } from './modules/communications';\nimport { ReportsModule } from './modules/reports';\nimport { PromotionModule } from './modules/promotion';\nimport { TariffsModule } from './modules/tariffs';\nimport { InStorePickupModule } from './modules/in-store-pickup';\nimport { OrdersDbsModule } from './modules/orders-dbs';\nimport { UserManagementModule } from './modules/user-management';\nimport { ReturnsModule } from './modules/returns';\nimport { AuthenticationError } from './errors/auth-error';\nimport type { SDKConfig } from './config/sdk-config';\n\n/**\n * Main SDK class providing access to all Wildberries API modules.\n *\n * This class serves as the primary entry point for interacting with the Wildberries API.\n * It manages authentication, configuration, and provides access to all API modules through\n * a single unified interface.\n *\n * @example Basic usage\n * ```typescript\n * import { WildberriesSDK } from 'daytona-wildberries-typescript-sdk';\n *\n * const sdk = new WildberriesSDK({\n *   apiKey: process.env.WB_API_KEY!\n * });\n *\n * // Test connectivity\n * const response = await sdk.general.ping();\n * console.log('Status:', response.Status); // 'OK'\n * ```\n *\n * @example Advanced configuration\n * ```typescript\n * const sdk = new WildberriesSDK({\n *   apiKey: process.env.WB_API_KEY!,\n *   timeout: 60000, // 60 seconds for long operations\n *   retryConfig: {\n *     maxRetries: 5,\n *     retryDelay: 2000,\n *     exponentialBackoff: true\n *   },\n *   logLevel: 'debug'\n * });\n * ```\n *\n * @example Error handling\n * ```typescript\n * import { WildberriesSDK, AuthenticationError, RateLimitError } from 'daytona-wildberries-typescript-sdk';\n *\n * try {\n *   const sdk = new WildberriesSDK({ apiKey: '' });\n * } catch (error) {\n *   if (error instanceof AuthenticationError) {\n *     console.error('Invalid API key:', error.message);\n *   }\n * }\n * ```\n */\nexport class WildberriesSDK {\n  /**\n   * Internal HTTP client shared across all modules\n   * @private\n   */\n  private readonly client: BaseClient;\n\n  /**\n   * General API module\n   *\n   * Provides access to general utility endpoints:\n   * - Ping (connectivity testing)\n   * - Server timestamps\n   *\n   * @see {@link GeneralModule} for available methods\n   *\n   * @example\n   * ```typescript\n   * const response = await sdk.general.ping();\n   * console.log('Server time:', response.TS);\n   * ```\n   */\n  public readonly general: GeneralModule;\n\n  /**\n   * Products API module\n   *\n   * Provides access to product management endpoints:\n   * - Product card creation and editing\n   * - Category and characteristic management\n   * - Media (images, videos) upload\n   * - Pricing and stock management\n   *\n   * @see {@link ProductsModule} for available methods\n   *\n   * @example\n   * ```typescript\n   * // Get parent categories\n   * const parents = await sdk.products.getParentAll();\n   *\n   * // Get categories by parent\n   * const categories = await sdk.products.getObjectAll({ parentID: 479 });\n   *\n   * // Get characteristics for a category\n   * const characteristics = await sdk.products.getObjectCharc(105);\n   * ```\n   */\n  public readonly products: ProductsModule;\n\n  /**\n   * Orders FBS (Fulfillment by Seller) API module\n   *\n   * Provides access to FBS order management endpoints:\n   * - New order retrieval\n   * - Order listing with filters and pagination\n   * - Order status tracking (supplier and WB system status)\n   *\n   * @see {@link OrdersFbsModule} for available methods\n   *\n   * @example\n   * ```typescript\n   * // Get new orders awaiting processing\n   * const newOrders = await sdk.ordersFBS.getNewOrders();\n   *\n   * // Get orders from last 7 days\n   * const sevenDaysAgo = Math.floor(Date.now() / 1000) - (7 * 24 * 60 * 60);\n   * const orders = await sdk.ordersFBS.getOrders({ dateFrom: sevenDaysAgo });\n   *\n   * // Check order statuses\n   * const orderIds = orders.orders.map(o => o.id);\n   * const statuses = await sdk.ordersFBS.getOrderStatuses(orderIds);\n   * ```\n   */\n  public readonly ordersFBS: OrdersFbsModule;\n\n  /**\n   * Orders FBW (Fulfillment by Wildberries) API module\n   *\n   * Provides access to FBW warehouse supply and acceptance endpoints:\n   * - Warehouse selection and availability\n   * - Acceptance coefficient checking\n   * - Supply planning and management\n   * - Transit tariff calculation\n   *\n   * @see {@link OrdersFbwModule} for available methods\n   *\n   * @example\n   * ```typescript\n   * // Get available warehouses\n   * const warehouses = await sdk.ordersFBW.warehouses();\n   *\n   * // Check acceptance coefficients for next 14 days\n   * const coefficients = await sdk.ordersFBW.getAcceptanceCoefficients();\n   *\n   * // Get acceptance options for goods\n   * const goods = [{ barcode: '1234567891234', quantity: 10 }];\n   * const options = await sdk.ordersFBW.createAcceptanceOption(goods);\n   *\n   * // Get supply details\n   * const details = await sdk.ordersFBW.getSupply(12345);\n   * ```\n   */\n  public readonly ordersFBW: OrdersFbwModule;\n\n  /**\n   * Finances API module\n   *\n   * Provides access to financial data endpoints:\n   * - Account balance retrieval\n   * - Sales reports by realization period\n   * - Document management (categories, list, download)\n   *\n   * @see {@link FinancesModule} for available methods\n   *\n   * @example\n   * ```typescript\n   * // Get current balance\n   * const balance = await sdk.finances.getAccountBalance();\n   * console.log(`Available: ${balance.for_withdraw} ${balance.currency}`);\n   *\n   * // Get sales report by period\n   * const report = await sdk.finances.getSupplierReportDetailByPeriod({\n   *   dateFrom: '2024-01-01',\n   *   dateTo: '2024-01-31',\n   *   period: 'weekly'\n   * });\n   *\n   * // List seller documents\n   * const docs = await sdk.finances.getDocumentsList();\n   * ```\n   */\n  public readonly finances: FinancesModule;\n\n  /**\n   * Analytics API module\n   *\n   * Provides access to analytics and reporting endpoints:\n   * - Sales funnel v3: product statistics, daily history, grouped history\n   * - Search query analysis and product search texts\n   * - Stock history (inventory tracking)\n   * - CSV report generation and download\n   *\n   * **v3 Sales Funnel methods (replace deprecated v2):**\n   * - `getSalesFunnelProducts()` — product statistics with conversion metrics\n   * - `getSalesFunnelProductsHistory()` — daily/weekly time-series per product\n   * - `getSalesFunnelGroupedHistory()` — daily/weekly time-series grouped by subject/brand/tag\n   *\n   * @see {@link AnalyticsModule} for available methods\n   *\n   * @example\n   * ```typescript\n   * // Get sales funnel metrics (v3)\n   * const funnel = await sdk.analytics.getSalesFunnelProducts({\n   *   selectedPeriod: { start: '2026-01-01', end: '2026-01-31' },\n   *   orderBy: { field: 'orderCount', mode: 'desc' },\n   *   limit: 10,\n   *   offset: 0,\n   * });\n   * console.log(funnel.products[0].statistic.selected.openCount);\n   *\n   * // Get daily history for specific products (v3)\n   * const history = await sdk.analytics.getSalesFunnelProductsHistory({\n   *   selectedPeriod: { start: '2026-01-01', end: '2026-01-07' },\n   *   nmIds: [12345, 67890],\n   *   aggregationLevel: 'day',\n   * });\n   * ```\n   */\n  public readonly analytics: AnalyticsModule;\n\n  /**\n   * Communications API module\n   *\n   * Provides access to customer communication endpoints:\n   *\n   * **Chat Management:**\n   * - Get all chat conversations\n   * - Poll for new chat events\n   * - Send messages to customers (with file attachments)\n   * - Extract chat metadata (replySign, chatID)\n   *\n   * **Product Q&A Management:**\n   * - Get product questions (answered/unanswered, with filtering)\n   * - Answer or reject customer questions\n   * - Mark questions as viewed\n   *\n   * **Customer Reviews Management:**\n   * - Get customer reviews (answered/unanswered, with filtering)\n   * - View review details (text, photos, videos, ratings)\n   * - Respond to reviews\n   * - Edit review responses\n   *\n   * @see {@link CommunicationsModule} for available methods\n   *\n   * @example\n   * ```typescript\n   * // Chat: Get all chats and send a message\n   * const chats = await sdk.communications.getChats();\n   * const replySign = chats.result[0].replySign;\n   * await sdk.communications.sendMessage(replySign, 'Thank you for your message!');\n   *\n   * // Q&A: Get and answer product questions\n   * const questions = await sdk.communications.getQuestions({\n   *   isAnswered: false,\n   *   take: 10,\n   *   skip: 0,\n   * });\n   * await sdk.communications.answerQuestion(questions.data.questions[0].id, 'This product is made of cotton.');\n   *\n   * // Reviews: Get and respond to customer reviews\n   * const reviews = await sdk.communications.getReviews({\n   *   isAnswered: false,\n   *   take: 10,\n   *   skip: 0,\n   * });\n   * await sdk.communications.respondToReview(reviews.data.feedbacks[0].id, 'Thank you for your feedback!');\n   * ```\n   */\n  public readonly communications: CommunicationsModule;\n\n  /**\n   * Reports API module\n   *\n   * Provides access to reporting and analytics data endpoints:\n   * - Inbound shipments (incomes) with pagination\n   * - Stock levels with quantity breakdown\n   * - Customer orders tracking\n   * - Sales and returns analysis\n   * - Excise/compliance reports\n   * - Async warehouse remains reports\n   *\n   * @see {@link ReportsModule} for available methods\n   *\n   * @example\n   * ```typescript\n   * // Get inbound shipments\n   * const incomes = await sdk.reports.getIncomes('2024-01-01');\n   *\n   * // Get current stock levels\n   * const stocks = await sdk.reports.getStocks('2024-01-01');\n   *\n   * // Generate and download warehouse remains report\n   * const task = await sdk.reports.createWarehouseRemainsReport({ locale: 'ru' });\n   * const status = await sdk.reports.checkReportStatus(task.data.taskId, 'warehouse_remains');\n   * if (status.data.status === 'done') {\n   *   const blob = await sdk.reports.downloadReport(task.data.taskId, 'warehouse_remains');\n   * }\n   * ```\n   */\n  public readonly reports: ReportsModule;\n\n  /**\n   * Promotion API module\n   *\n   * Provides access to promotional campaign endpoints:\n   * - Campaign creation, management, and control\n   * - Campaign count and information retrieval\n   * - Auction (manual bid) campaign management\n   * - Configuration values and minimum bids\n   * - Budget deposits and management\n   * - Product and category selection for campaigns\n   * - Statistics and performance tracking\n   *\n   * @see {@link PromotionModule} for available methods\n   *\n   * @example\n   * ```typescript\n   * // Get campaign count summary\n   * const summary = await sdk.promotion.getPromotionCount();\n   *\n   * // Create a new campaign\n   * const campaignId = await sdk.promotion.createSeacatSaveAd({\n   *   name: 'Winter Sale Campaign',\n   *   nms: [12345, 67890],\n   *   bid_type: 'manual',\n   *   placement_types: ['search', 'recommendations']\n   * });\n   *\n   * // Get minimum bids for products\n   * const minBids = await sdk.promotion.createBidsMin({\n   *   advert_id: campaignId,\n   *   nm_ids: [12345, 67890],\n   *   payment_type: 'cpm',\n   *   placement_types: ['search', 'recommendation']\n   * });\n   * ```\n   */\n  public readonly promotion: PromotionModule;\n\n  /**\n   * Tariffs API module\n   *\n   * Provides access to tariff and commission information:\n   * - Commission rates by category\n   * - Box storage tariffs\n   * - Pallet storage tariffs\n   * - Return handling tariffs\n   *\n   * @see {@link TariffsModule} for available methods\n   *\n   * @example\n   * ```typescript\n   * // Get commission rates for all categories\n   * const commissions = await sdk.tariffs.getTariffsCommission();\n   *\n   * // Get box storage tariffs\n   * const boxTariffs = await sdk.tariffs.getTariffsBox();\n   *\n   * // Get pallet storage tariffs\n   * const palletTariffs = await sdk.tariffs.getTariffsPallet();\n   *\n   * // Get return handling tariffs\n   * const returnTariffs = await sdk.tariffs.getTariffsReturn();\n   * ```\n   */\n  public readonly tariffs: TariffsModule;\n\n  /**\n   * In-Store Pickup API module (Click & Collect)\n   *\n   * Provides comprehensive methods for managing click & collect orders:\n   * - Order assembly lifecycle management (new → confirm → prepare → receive/reject)\n   * - Customer verification at pickup\n   * - Product metadata management (SGTIN, UIN, IMEI, GTIN)\n   * - Order queries and status tracking\n   *\n   * @see {@link InStorePickupModule} for available methods\n   *\n   * @example Order processing workflow\n   * ```typescript\n   * // 1. Get new pickup orders\n   * const newOrders = await sdk.inStorePickup.getNewOrders();\n   * const order = newOrders.orders[0];\n   *\n   * // 2. Confirm and start assembly\n   * await sdk.inStorePickup.confirmOrder(order.id);\n   *\n   * // 3. Complete assembly\n   * await sdk.inStorePickup.prepareOrder(order.id);\n   *\n   * // 4. Customer arrives - verify identity\n   * const verification = await sdk.inStorePickup.verifyCustomerIdentity({\n   *   orderCode: order.orderCode,\n   *   passcode: '1234' // From customer's app\n   * });\n   *\n   * // 5. Complete handover\n   * await sdk.inStorePickup.receiveOrder(order.id);\n   * ```\n   *\n   * @example Metadata management for regulated products\n   * ```typescript\n   * // Set SGTIN codes (Честный знак marking)\n   * await sdk.inStorePickup.setSGTINCode(orderId, ['1234567890123456']);\n   *\n   * // Set IMEI for electronics\n   * await sdk.inStorePickup.setIMEICode(orderId, '123456789012345');\n   *\n   * // Get all metadata\n   * const metadata = await sdk.inStorePickup.getOrderMetadata(orderId);\n   * ```\n   */\n  public readonly inStorePickup: InStorePickupModule;\n\n  /**\n   * Orders DBS (Delivery by Seller) API module\n   *\n   * Provides comprehensive methods for managing DBS orders where sellers handle\n   * both storage AND delivery directly to customers:\n   *\n   * **Core Operations:**\n   * - Get new orders awaiting delivery with full delivery details\n   * - Query completed orders with date range filtering and pagination\n   * - Get customer contact information for delivery coordination\n   *\n   * **Status Management:**\n   * - Bulk status operations: confirm, deliver, receive, reject, cancel\n   * - Legacy single-order status methods (deprecated, disabled 13.04.2026)\n   * - Status information retrieval for multiple orders\n   *\n   * **Metadata Operations:**\n   * - SGTIN (marking codes), IMEI, UIN, GTIN management\n   * - Customs declaration handling\n   * - Metadata retrieval and deletion\n   *\n   * **B2B Support:**\n   * - Get organizational buyer information (company name, INN, KPP)\n   *\n   * @see {@link OrdersDbsModule} for available methods\n   *\n   * @example Order processing workflow\n   * ```typescript\n   * // 1. Get new DBS orders\n   * const newOrders = await sdk.ordersDBS.getNewOrders();\n   * const order = newOrders.orders[0];\n   *\n   * // 2. Get customer contact for delivery coordination\n   * const clientInfo = await sdk.ordersDBS.getClientInfo([order.id]);\n   * console.log('Deliver to:', clientInfo.orders[0].fullName);\n   *\n   * // 3. Confirm order (bulk operation)\n   * await sdk.ordersDBS.confirmOrdersBulk([order.id]);\n   *\n   * // 4. Mark as delivered\n   * await sdk.ordersDBS.deliverOrdersBulk([order.id]);\n   *\n   * // 5. Complete handover with verification code\n   * await sdk.ordersDBS.receiveOrdersBulk([{ orderId: order.id, code: '1234' }]);\n   * ```\n   *\n   * @example Metadata management for regulated products\n   * ```typescript\n   * // Add SGTIN marking codes (Честный знак)\n   * await sdk.ordersDBS.addOrderMeta(orderId, {\n   *   sgtin: { value: ['1234567890123456', '9876543210987654'] }\n   * });\n   *\n   * // Add IMEI for electronics\n   * await sdk.ordersDBS.addOrderMeta(orderId, {\n   *   imei: { value: 123456789012345 }\n   * });\n   *\n   * // Get order metadata\n   * const meta = await sdk.ordersDBS.getOrderMeta(orderId);\n   * ```\n   */\n  public readonly ordersDBS: OrdersDbsModule;\n\n  /**\n   * User Management API module\n   *\n   * Provides access to seller profile user management endpoints:\n   * - Create invitations for new users with access settings\n   * - List active and invited users with pagination\n   * - Update user access rights to seller profile sections\n   * - Delete users from seller profile\n   *\n   * @see {@link UserManagementModule} for available methods\n   *\n   * @example\n   * ```typescript\n   * // Get all users\n   * const result = await sdk.userManagement.getUsers({ limit: 50, offset: 0 });\n   * console.log(result.total);\n   *\n   * // Invite a new user\n   * const invite = await sdk.userManagement.createInvite({\n   *   invite: { phoneNumber: '+79991234567', position: 'Manager' },\n   *   access: [{ code: 'balance', disabled: false }],\n   * });\n   * console.log(invite.inviteUrl);\n   *\n   * // Update user access\n   * await sdk.userManagement.updateUserAccess({\n   *   usersAccesses: [{\n   *     userId: 12345,\n   *     access: [{ code: 'finance', disabled: true }],\n   *   }],\n   * });\n   *\n   * // Delete a user\n   * await sdk.userManagement.deleteUser(12345);\n   * ```\n   */\n  public readonly userManagement: UserManagementModule;\n\n  /**\n   * Returns aggregator module (since v3.10.0)\n   *\n   * Unified return analytics across FBO + FBS + Finance sources:\n   * - Fetches FBO returns via `sdk.reports.getAnalyticsGoodsReturn()`\n   * - Enriches records with financial amounts from `sdk.finances.getSalesReportsDetailed()`\n   * - Partial-failure tolerant: one source failing does not abort the response\n   *\n   * @see {@link ReturnsModule} for available methods\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.returns.getReturns({\n   *   dateFrom: '2026-04-01',\n   *   dateTo: '2026-04-30',\n   * });\n   * console.log(result.data);           // ReturnItem[]\n   * console.log(result.partialFailures); // per-source failures\n   * console.log(result._meta.sources);  // telemetry\n   * ```\n   */\n  public readonly returns: ReturnsModule;\n\n  /**\n   * Initialize the Wildberries SDK with configuration\n   *\n   * Creates a new SDK instance with the provided configuration.\n   * The SDK uses a single shared HTTP client for all API modules to ensure\n   * consistent authentication, rate limiting, and error handling.\n   *\n   * @param config - SDK configuration options\n   * @throws {AuthenticationError} If API key is missing or invalid\n   *\n   * @example\n   * ```typescript\n   * const sdk = new WildberriesSDK({\n   *   apiKey: process.env.WB_API_KEY!,\n   *   timeout: 30000,\n   *   logLevel: 'info'\n   * });\n   * ```\n   */\n  constructor(config: SDKConfig) {\n    // Validate API key\n    if (!config.apiKey || config.apiKey.trim() === '') {\n      throw new AuthenticationError(\n        'API key is required. Please provide a valid Wildberries API key in the configuration.',\n        401\n      );\n    }\n\n    // Create shared BaseClient instance\n    this.client = new BaseClient(config);\n\n    // Warn about reduced rate limits for Basic/Test tokens\n    const tokenType = config.tokenType ?? 'personal';\n    if (tokenType === 'basic' || tokenType === 'test') {\n      // eslint-disable-next-line no-console -- One-time init warning for token type awareness\n      console.warn(\n        `[WildberriesSDK] ${tokenType.charAt(0).toUpperCase() + tokenType.slice(1)} token detected. ` +\n          'Reduced rate limits apply. Consider upgrading to a Personal or Service token. ' +\n          'See https://dev.wildberries.ru/news/281'\n      );\n    }\n\n    // Initialize General module (Story 1.9 - implemented)\n    this.general = new GeneralModule(this.client);\n\n    // Initialize Products module (Stories 2.1-2.4 - implemented)\n    this.products = new ProductsModule(this.client);\n\n    // Initialize Orders FBS module (Stories 2.5-2.6 - implemented)\n    this.ordersFBS = new OrdersFbsModule(this.client);\n\n    // Initialize Orders FBW module (Story 2.7 - implemented)\n    this.ordersFBW = new OrdersFbwModule(this.client);\n\n    // Initialize Finances module (Stories 3.1-3.2 - implemented)\n    this.finances = new FinancesModule(this.client);\n\n    // Initialize Analytics module (Stories 3.3-3.4 - implemented)\n    this.analytics = new AnalyticsModule(this.client);\n\n    // Initialize Communications module (Stories 3.5-3.6 - implemented)\n    this.communications = new CommunicationsModule(this.client);\n\n    // Initialize Reports module (Story 3.7 - implemented)\n    this.reports = new ReportsModule(this.client);\n\n    // Initialize Promotion module (Story 4.5 - implemented)\n    this.promotion = new PromotionModule(this.client);\n\n    // Initialize Tariffs module (Story 4.5 - implemented)\n    this.tariffs = new TariffsModule(this.client);\n\n    // Initialize In-Store Pickup module (Story 4.6 - implemented)\n    this.inStorePickup = new InStorePickupModule(this.client);\n\n    // Initialize Orders DBS module (Epic 12 - implemented)\n    this.ordersDBS = new OrdersDbsModule(this.client);\n\n    // Initialize User Management module (Story 14.4 - implemented)\n    this.userManagement = new UserManagementModule(this.client);\n\n    // Initialize Returns aggregator module (Story 13.2 - implemented)\n    // Must be last — depends on this.reports, this.ordersFBS, this.finances\n    this.returns = new ReturnsModule(this.client, this.reports, this.ordersFBS, this.finances);\n  }\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\n/**\n * SDK version\n */\nexport const version = '3.15.0';\n\n// Main SDK class\nexport { WildberriesSDK as default };\n\n// Configuration types\nexport type { SDKConfig, RequestOptions } from './config/sdk-config';\nexport {\n  ALL_RATE_LIMITS,\n  generalRateLimits,\n  productsRateLimits,\n  ordersFbsRateLimits,\n  ordersFbwRateLimits,\n  ordersDbsRateLimits,\n  userManagementRateLimits,\n  financesRateLimits,\n  promotionRateLimits,\n  tariffsRateLimits,\n  inStorePickupRateLimits,\n  analyticsRateLimits,\n  communicationsRateLimits,\n  reportsRateLimits,\n  // Operation metadata (x-readonly-method, x-category from Swagger)\n  operationMetadata,\n  isOperationReadonly,\n  getOperationCategory,\n  getOperationRateLimitKey,\n  getOperationMetadata,\n  getOperationsByCategory,\n  getReadonlyOperations,\n  getWriteOperations,\n} from './config';\nexport type { RateLimitConfig, EndpointLimits } from './client/rate-limiter';\nexport type { OperationMetadata } from './config';\n\n// Core infrastructure\nexport { BaseClient } from './client/base-client';\n\n// API Modules\nexport { GeneralModule } from './modules/general';\nexport { ProductsModule, WITH_PHOTO_FILTER } from './modules/products';\nexport { OrdersFbsModule } from './modules/orders-fbs';\nexport { OrdersFbwModule } from './modules/orders-fbw';\nexport { FinancesModule } from './modules/finances';\nexport { AnalyticsModule } from './modules/analytics';\nexport { CommunicationsModule, COMMUNICATIONS_LIMITS } from './modules/communications';\nexport { ReportsModule } from './modules/reports';\nexport { PromotionModule } from './modules/promotion';\nexport { TariffsModule } from './modules/tariffs';\nexport { InStorePickupModule } from './modules/in-store-pickup';\nexport { OrdersDbsModule } from './modules/orders-dbs';\nexport { UserManagementModule } from './modules/user-management';\n\n// Type definitions\n// NOTE: Types are NOT re-exported from the main entry to avoid name conflicts (Error, Date, etc.)\n//\n// To import types, use the module subpath import for any module that has one\n// (since v3.6.1 — finances, analytics, communications, reports re-export their types):\n//   import type { DetailReportItem } from 'daytona-wildberries-typescript-sdk/finances';\n//   import type { MainResponse } from 'daytona-wildberries-typescript-sdk/analytics';\n//   import type { PinReviewItem } from 'daytona-wildberries-typescript-sdk/communications';\n//   import type { IncomesItem } from 'daytona-wildberries-typescript-sdk/reports';\n//\n// Modules without subpath exports (products, orders-fbs, orders-fbw, orders-dbs,\n// promotion, tariffs, in-store-pickup, general, user-management) currently have no public\n// type access path — track via WL-4.\n\n// Orders DBS types (no name conflicts with global types)\nexport type { MetaValidationDetail } from './types/orders-dbs.types';\n\n// Orders FBS public types (since v3.15.0 — MetaDetail referenced in migration guide Pattern A)\nexport type {\n  MetaDetail,\n  OrderMetaResponse,\n  OrderMetaItem,\n  OrdersMetaResponse,\n} from './types/orders-fbs.types';\n\n// Orders FBW / DBW bulk types (v3.11.0)\nexport type {\n  DBWDeleteMetaBulkRequest,\n  DBWDeleteMetaBulkResponse,\n  DBWSetSgtinBulkRequest,\n  DBWSetMetaBulkResponse,\n  DBWBulkStatusChangeResponse,\n  DBWStatusSetResponse,\n  DBWMetaValidationDetail,\n  DBWCheckMetaValidationRequest,\n  DBWCheckMetaValidationResponse,\n} from './types/orders-fbw.types';\n// BulkStatusChangeResponse and StatusSetResponse are re-exported from orders-dbs.types via orders-fbw.types\n// Export them here under the DBS canonical path to avoid duplicate export conflicts.\n// (They are already available via orders-dbs.types if consumers need them directly.)\n// DBW-prefixed aliases (DBWBulkStatusChangeResponse, DBWStatusSetResponse, DBWMetaValidationDetail)\n// are exported from orders-fbw.types above for API symmetry.\n\n// Communications types (v3.13.0 — createSellerMessage multipart body)\nexport type { SellerMessageRequest } from './types/communications.types';\n\n// Products stock management types (v3.12.0 — sku → chrtId migration)\nexport type {\n  StockItem,\n  StocksRequest,\n  UpdateStockRequest,\n  GetStocksResponse,\n} from './types/products.types';\n\n// Products card trash management types (v3.13.1 — sandbox-first permanent delete)\nexport type {\n  DeleteCardsFromTrashRequest,\n  DeleteCardsFromTrashResponse,\n} from './types/products.types';\n\n// User Management types (no name conflicts with global types)\nexport type {\n  AccessCode,\n  AccessItem,\n  InviteeInfo,\n  UserInfo,\n  GetUsersResponse,\n  GetUsersParams,\n  CreateInviteRequest,\n  CreateInviteResponse,\n  UserAccess,\n  UpdateUserAccessRequest,\n  UserManagementErrorResponse,\n} from './types/user-management.types';\n\n// Error classes\nexport { WBAPIError } from './errors/base-error';\nexport { AuthenticationError } from './errors/auth-error';\nexport { RateLimitError } from './errors/rate-limit-error';\nexport { ValidationError } from './errors/validation-error';\nexport { NetworkError } from './errors/network-error';\nexport {\n  CampaignNotFoundError,\n  InvalidBidError,\n  BudgetExceededError,\n  InvalidCampaignStateError,\n} from './errors/promotion-errors';\nexport {\n  PickupOrderNotFoundError,\n  InvalidOrderStateError,\n  CustomerVerificationError,\n  MetadataValidationError,\n} from './errors/in-store-pickup-errors';\n\n// FBS marking-code validation error (since 3.15.0)\nexport { MetaValidationFailError } from './errors/meta-validation-fail-error';\n\n// Utility functions\nexport {\n  calculateSupplyCost,\n  compareTariffs,\n  parseMoneyAmount,\n  validateRequiredCharacteristics,\n  validateMergedCardVariants,\n  classifyReturnReason,\n  enrichReturnsWithType,\n  reconcileBuyoutsAndReturns,\n  classifyFbsReturnCategory,\n  warnOnce,\n  resetDeprecationWarnings,\n  parseMetaValidationFail,\n  type MetaValidationFailPayload,\n  type SupplyCostInput,\n  type SupplyCostResult,\n  type CompareTariffsInput,\n  type TariffComparison,\n  type TariffData,\n  type TariffDifference,\n  type TariffRecommendation,\n  type MergedCardVariant,\n  type MergedCardValidationResult,\n  type ReturnReasonCode,\n  type WbReturn,\n  type FbsReturnInput,\n  type BuyoutInput,\n  type ReconciliationAnomaly,\n  type ReconciliationResult,\n  type ReconcileOptions,\n  type FbsStatusEvent,\n} from './utils';\n\n// Returns module types (since v3.10.0 — populated by sdk.returns module in story 13.2)\nexport type { ReturnItem, ReturnStatus, ReturnCategory } from './types/returns.types';\nexport { ReturnsModule } from './modules/returns';\nexport type {\n  ReturnsApiRequest,\n  ReturnsApiResponse,\n  PartialFailure,\n  ReturnsMeta,\n  ReturnByOrderIdParams,\n  ReturnStatsParams,\n  ReturnStatsResult,\n  ReturnStatsBucket,\n} from './types/returns.types';\n"],"names":["bind","fn","thisArg","toString","getPrototypeOf","iterator","toStringTag","kindOf","cache","thing","str","kindOfTest","type","typeOfTest","isArray","isUndefined","isBuffer","val","isFunction","isArrayBuffer","isArrayBufferView","result","isString","isNumber","isObject","isBoolean","isPlainObject","prototype","isEmptyObject","isDate","isFile","isBlob","isFileList","isStream","isFormData","kind","isURLSearchParams","isReadableStream","isRequest","isResponse","isHeaders","trim","forEach","obj","allOwnKeys","i","l","keys","len","key","findKey","_key","_global","isContextDefined","context","merge","caseless","skipUndefined","assignValue","targetKey","extend","a","b","stripBOM","content","inherits","constructor","superConstructor","props","descriptors","toFlatObject","sourceObj","destObj","filter","propFilter","prop","merged","endsWith","searchString","position","lastIndex","toArray","arr","isTypedArray","TypedArray","forEachEntry","_iterator","pair","matchAll","regExp","matches","isHTMLForm","toCamelCase","m","p1","p2","hasOwnProperty","isRegExp","reduceDescriptors","reducer","reducedDescriptors","descriptor","name","ret","freezeMethods","value","toObjectSet","arrayOrString","delimiter","define","noop","toFiniteNumber","defaultValue","isSpecCompliantForm","toJSONObject","stack","visit","source","target","reducedValue","isAsyncFn","isThenable","_setImmediate","setImmediateSupported","postMessageSupported","token","callbacks","data","cb","asap","isIterable","utils$1","AxiosError","message","code","config","request","response","utils","error","customProps","axiosError","msg","errCode","httpAdapter","isVisitable","removeBrackets","renderKey","path","dots","isFlatArray","predicates","toFormData","formData","options","option","metaTokens","visitor","defaultVisitor","indexes","useBlob","convertValue","el","index","exposedHelpers","build","encode","charMap","match","AxiosURLSearchParams","params","encoder","_encode","buildURL","url","serializeFn","serializedParams","hashmarkIndex","InterceptorManager","fulfilled","rejected","id","h","transitionalDefaults","URLSearchParams$1","FormData$1","Blob$1","platform$1","URLSearchParams","FormData","Blob","hasBrowserEnv","_navigator","hasStandardBrowserEnv","hasStandardBrowserWebWorkerEnv","origin","platform","toURLEncodedForm","helpers","parsePropPath","arrayToObject","formDataToJSON","buildPath","isNumericKey","isLast","stringifySafely","rawValue","parser","e","defaults","headers","contentType","hasJSONContentType","isObjectPayload","_FormData","transitional","forcedJSONParsing","JSONRequested","strictJSONParsing","status","method","ignoreDuplicateOf","parseHeaders","rawHeaders","parsed","line","$internals","normalizeHeader","header","normalizeValue","parseTokens","tokens","tokensRE","isValidHeaderName","matchHeaderValue","isHeaderNameFilter","formatHeader","w","char","buildAccessors","accessorName","methodName","arg1","arg2","arg3","AxiosHeaders$1","valueOrRewrite","rewrite","self","setHeader","_value","_header","_rewrite","lHeader","setHeaders","dest","entry","matcher","deleted","deleteHeader","format","normalized","targets","asStrings","first","computed","accessors","defineAccessor","AxiosHeaders","mapped","headerValue","transformData","fns","isCancel","CanceledError","settle","resolve","reject","validateStatus","parseProtocol","speedometer","samplesCount","min","bytes","timestamps","head","tail","firstSampleTS","chunkLength","now","startedAt","bytesCount","passed","throttle","freq","timestamp","threshold","lastArgs","timer","invoke","args","progressEventReducer","listener","isDownloadStream","bytesNotified","_speedometer","loaded","total","progressBytes","rate","inRange","progressEventDecorator","throttled","lengthComputable","asyncDecorator","isURLSameOrigin","isMSIE","cookies","expires","domain","secure","cookie","isAbsoluteURL","combineURLs","baseURL","relativeURL","buildFullPath","requestedURL","allowAbsoluteUrls","isRelativeUrl","headersToObject","mergeConfig","config1","config2","getMergedValue","mergeDeepProperties","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","configValue","resolveConfig","newConfig","withXSRFToken","xsrfHeaderName","xsrfCookieName","auth","formHeaders","allowedHeaders","xsrfValue","isXHRAdapterSupported","xhrAdapter","_config","requestData","requestHeaders","responseType","onUploadProgress","onDownloadProgress","onCanceled","uploadThrottled","downloadThrottled","flushUpload","flushDownload","done","onloadend","responseHeaders","err","event","timeoutErrorMessage","cancel","protocol","composeSignals","signals","timeout","length","controller","aborted","onabort","reason","unsubscribe","signal","streamChunk","chunk","chunkSize","pos","end","readBytes","iterable","readStream","stream","reader","trackStream","onProgress","onFinish","_onFinish","loadedBytes","DEFAULT_CHUNK_SIZE","globalFetchAPI","Request","Response","ReadableStream","TextEncoder","test","factory","env","envFetch","isFetchSupported","isRequestSupported","isResponseSupported","isReadableStreamSupported","encodeText","supportsRequestStream","duplexAccessed","hasContentType","supportsResponseStream","resolvers","res","getBodyLength","body","resolveBodyLength","cancelToken","withCredentials","fetchOptions","_fetch","composedSignal","requestContentLength","_request","contentTypeHeader","flush","isCredentialsSupported","resolvedOptions","isStreamResponse","responseContentLength","responseData","seedCache","getFetch","fetch","seeds","seed","map","knownAdapters","fetchAdapter.getFetch","renderReason","isResolvedHandle","adapter","adapters","nameOrAdapter","rejectedReasons","reasons","state","s","throwIfCancellationRequested","dispatchRequest","VERSION","validators","deprecatedWarnings","validator","version","formatMessage","opt","desc","opts","correctSpelling","assertOptions","schema","allowUnknown","Axios$1","instanceConfig","configOrUrl","dummy","paramsSerializer","contextHeaders","requestInterceptorChain","synchronousRequestInterceptors","interceptor","responseInterceptorChain","promise","chain","onFulfilled","onRejected","fullPath","Axios","generateHTTPMethod","isForm","CancelToken$1","CancelToken","executor","resolvePromise","onfulfilled","_resolve","abort","c","spread","callback","isAxiosError","payload","HttpStatusCode","createInstance","defaultConfig","instance","axios","promises","all","Cancel","formToJSON","getAdapter","WBAPIError","statusCode","requestId","captureStackTrace","AuthenticationError","baseMessage","guidance","RateLimitError","retryAfter","ValidationError","fieldErrors","field","NetworkError","isTimeout","cause","CampaignNotFoundError","campaignId","InvalidBidError","bidInfo","info","BudgetExceededError","budgetInfo","InvalidCampaignStateError","currentState","attemptedAction","validStates","stateGuide","transitionGuide","PickupOrderNotFoundError","orderId","InvalidOrderStateError","stateInfo","CustomerVerificationError","orderCode","MetadataValidationError","codeType","MetaValidationFailError","metaDetails","invalidItems","d","requiredItems","lines","_TokenBucket","tokensToAdd","timeToNextToken","RateLimiter","bucket","operationMetadata","isOperationReadonly","operationKey","metadata","getOperationCategory","getOperationRateLimitKey","getOperationMetadata","getOperationsByCategory","category","meta","getReadonlyOperations","getWriteOperations","RetryHandler","logLevel","operation","operationName","lastError","attempt","delay","isReadonly","jitter","ms","level","levels","generalRateLimits","productsRateLimits","ordersFbsRateLimits","ordersFbwRateLimits","ordersDbsRateLimits","userManagementRateLimits","financesRateLimits","promotionRateLimits","tariffsRateLimits","inStorePickupRateLimits","analyticsRateLimits","reportsRateLimits","communicationsRateLimits","ALL_RATE_LIMITS","BASIC_TOKEN_CATEGORY_MULTIPLIERS","DEFAULT_BASIC_MULTIPLIER","applyBasicTokenMultipliers","limits","multiplier","BaseClient","tokenType","effectiveLimits","_a","timeoutMs","_b","_c","isProblemJson","pf","seconds","empty","hasRfc7807Shape","currentLevel","logData","sanitized","GeneralModule","client","deletedUserID","probeUrl","rateLimitKey","dateStr","buildPayload","limit","probeCallsMade","tier","_warned","warnOnce","methodKey","resetDeprecationWarnings","sanitizeStocksRequest","hasLegacy","hasNew","hasEmptyChrtIds","chrtIds","rest","skus","sanitizeUpdateStockPayload","hasLegacyOnly","hasMixed","skuSet","chrtIdSet","sku","WITH_PHOTO_FILTER","ProductsModule","subjectId","next","MAXIMUM_CARDS_LIMIT","_d","warehouseId","OrdersFbsModule","passId","supplyId","OrdersFbwModule","ID","orderIds","FinancesModule","reportId","AnalyticsModule","downloadId","NEW_FORMAT_REPLYSIGN_REGEX","COMMUNICATIONS_LIMITS","MAX_MESSAGE_LENGTH","MAX_TOTAL_FILE_SIZE","MAX_PER_FILE_SIZE","MAX_REPLYSIGN_LENGTH","MIME_BY_EXTENSION","inferMimeFromFilename","filename","lower","ext","mime","CommunicationsModule","totalSize","f","sz","ReportsModule","task_id","PromotionModule","ids","subjectIds","TariffsModule","date","InStorePickupModule","BASE_URL","MAX_DATE_RANGE_SECONDS","OrdersDbsModule","dateRange","orders","order","UserManagementModule","classifyReturnReason","text","parseMoneyAmount","validateDateRange","dateFrom","dateTo","from","to","diffDays","deriveFboReturnStatus","item","mapFboToReturnItems","items","returnDate","enrichWithFinance","financeLines","sumBySrid","sumByOrderNm","sridFromOrderNm","amount","returnAmount","backfilledSrid","deduplicateBySrid","seen","ReturnsModule","_client","reports","_ordersFBS","finances","warnings","rrdId","page","last","fetchFbo","fboResult","financeResult","partialFailures","fboItems","enriched","deduped","nmIds","filtered","r","offset","buckets","exhaustive","bucketArray","v","BASE_ACCEPTANCE_RATE","DEFAULT_STORAGE_COEF","DEFAULT_DELIVERY_COEF","BOX_TYPE_MAPPINGS","parseNumeric","roundTo2Decimals","calculateStorageCost","volume","days","coefficient","isPallet","storageBaseLiter","storageAdditionalLiter","storageCoef","baseCost","storageCost","calculateLogisticsCost","deliveryBaseLiter","deliveryAdditionalLiter","deliveryCoef","logisticsCost","calculateAcceptanceCost","acceptanceCoefficient","findMatchingCoefficient","coefficients","warehouseID","boxType","warehouseCoefficients","boxTypeNames","matchingByBoxType","calculateSupplyCost","input","getCoefficients","matchingCoefficient","acceptanceCost","totalCost","parseNumericValue","matchesWarehouseName","warehouseName","searchTerm","normalizedWarehouse","normalizedSearch","findBoxTariff","boxTariffs","tariff","findAcceptanceCoefficient","coef","extractInventoryTariff","extractSupplyTariff","calculatePercentageDifference","inventory","supply","calculateDifferences","determineRecommendation","inventoryTotal","supplyTotal","compareTariffs","getBoxTariffs","getAcceptanceCoefficients","acceptanceCoefficients","boxTariff","acceptanceCoef","difference","recommendation","validateRequiredCharacteristics","characteristics","namedFields","inputByCharcId","warnEmitted","validateMergedCardVariants","variants","namedFieldsPerVariant","charcsById","valueByCharcId","legacyWarnEmitted","resolveValue","charc","variantIndex","variant","namedMap","fieldValue","set","divergentFixedChars","identicalVariableChars","charcId","valueSet","variableCharIds","signatures","duplicateVariants","sig","ci","enrichReturnsWithType","fboReturns","fbsReturns","classifyFbsReturnCategory","statuses","codes","hasDelivered","hasReturned","hasCancelled","hasDefected","hasClientCanceled","hasConfirmed","deliveredIdx","i1","i2","reconcileBuyoutsAndReturns","buyouts","returns","byNmId","parseMetaValidationFail","errObj","responseObj","WildberriesSDK"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49]}