{"version":3,"file":"index-BJPymceu.cjs","sources":["../src/errors/base-error.ts","../src/errors/validation-error.ts","../src/utils/deprecation.ts","../src/modules/communications/index.ts"],"sourcesContent":["/**\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 * 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","/**\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. 'products.getCardsList:legacy-withphoto-zero')\n * @param message - The warning message to display\n *\n * @example\n * ```typescript\n * warnOnce(\n *   'products.getCardsList:legacy-withphoto-zero',\n *   '[DEPRECATED] withPhoto: 0 semantics changed. Use WITH_PHOTO_FILTER.NO_PHOTO for \"no photo only\".'\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/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(\n            'file',\n            new Blob([Uint8Array.from(f.content)], { type: mime }),\n            f.filename\n          );\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   * @param data - Request body. `action` must be one of the values from the `actions` array returned by `claims()`. When `action` is `\"rejectcustom\"` the `comment` is required (10–1000 chars); it is optional for `\"approvecc1\"`.\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    id: 'fe3e9337-e9f9-423c-8930-946a8ebef80',\n    action: 'rejectcustom',\n    comment: 'The photo is not related to the item in the application',\n  });\n  console.log(result);\n   */\n  async updateClaim(data: {\n    /** Application ID (UUID). */\n    id: string;\n    /** Application action. Use one of the `actions` array values from `claims()`. */\n    action: string;\n    /** Comment (10–1000 chars). Required when `action` is `\"rejectcustom\"`, optional for `\"approvecc1\"`. */\n    comment?: string;\n  }): Promise<unknown> {\n    return this.client.patch<unknown>('https://returns-api.wildberries.ru/api/v1/claim', data, {\n      rateLimitKey: 'communications.patchClaim',\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"],"names":["WBAPIError","message","statusCode","response","requestId","origin","timestamp","captureStackTrace","ValidationError","fieldErrors","baseMessage","guidance","field","error","_warned","warnOnce","methodKey","resetDeprecationWarnings","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","client","options","data","totalSize","f","sz","formData","id","params"],"mappings":"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"}