ozonapi-async 0.7.4__tar.gz → 0.9.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/PKG-INFO +29 -24
  2. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/pyproject.toml +3 -2
  3. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/readme.md +27 -23
  4. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/__init__.py +1 -1
  5. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/methods/fbs.py +137 -2
  6. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/methods/prices_and_stocks.py +1 -0
  7. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/methods/products.py +98 -2
  8. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/fbs/__init__.py +10 -0
  9. ozonapi_async-0.9.0/src/ozonapi/seller/schemas/fbs/v1__posting_fbs_restrictions.py +53 -0
  10. ozonapi_async-0.9.0/src/ozonapi/seller/schemas/fbs/v2__posting_fbs_product_country_list.py +45 -0
  11. ozonapi_async-0.9.0/src/ozonapi/seller/schemas/fbs/v2__posting_fbs_product_country_set.py +36 -0
  12. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/fbs/v3__posting_fbs_unfulfilled_list.py +2 -0
  13. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/prices_and_stocks/v1__product_import_prices.py +4 -0
  14. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/products/__init__.py +5 -0
  15. ozonapi_async-0.9.0/src/ozonapi/seller/schemas/products/v1__product_pictures_import.py +85 -0
  16. ozonapi_async-0.9.0/src/ozonapi/seller/schemas/products/v4__product_info_limit.py +76 -0
  17. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi_async.egg-info/PKG-INFO +29 -24
  18. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi_async.egg-info/SOURCES.txt +5 -0
  19. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi_async.egg-info/requires.txt +1 -0
  20. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/LICENSE +0 -0
  21. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/setup.cfg +0 -0
  22. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/__init__.py +0 -0
  23. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/common/__init__.py +0 -0
  24. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/common/enumerations/__init__.py +0 -0
  25. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/common/enumerations/delivery.py +0 -0
  26. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/common/enumerations/localization.py +0 -0
  27. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/common/enumerations/postings.py +0 -0
  28. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/common/enumerations/prices.py +0 -0
  29. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/common/enumerations/products.py +0 -0
  30. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/common/enumerations/requests.py +0 -0
  31. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/common/enumerations/warehouses.py +0 -0
  32. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/core/__init__.py +0 -0
  33. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/core/config.py +0 -0
  34. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/core/core.py +0 -0
  35. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/core/exceptions.py +0 -0
  36. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/core/method_rate_limiter.py +0 -0
  37. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/core/rate_limiter.py +0 -0
  38. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/core/sessions.py +0 -0
  39. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/methods/__init__.py +0 -0
  40. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/methods/attributes_and_characteristics.py +0 -0
  41. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/methods/barcodes.py +0 -0
  42. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/methods/beta.py +0 -0
  43. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/methods/warehouses.py +0 -0
  44. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/__init__.py +0 -0
  45. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/attributes_and_characteristics/__init__.py +0 -0
  46. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/attributes_and_characteristics/base.py +0 -0
  47. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/attributes_and_characteristics/v1__description_category_attribute.py +0 -0
  48. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/attributes_and_characteristics/v1__description_category_attribute_values.py +0 -0
  49. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/attributes_and_characteristics/v1__description_category_attribute_values_search.py +0 -0
  50. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/attributes_and_characteristics/v1__description_category_tree.py +0 -0
  51. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/barcodes/__init__.py +0 -0
  52. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/barcodes/v1__barcode_add.py +0 -0
  53. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/barcodes/v1__barcode_generate.py +0 -0
  54. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/base.py +0 -0
  55. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/beta/__init__.py +0 -0
  56. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/beta/v1__analytics_stocks.py +0 -0
  57. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/fbs/entities/__init__.py +0 -0
  58. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/fbs/entities/posting__addressee.py +0 -0
  59. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/fbs/entities/posting__analytics_data.py +0 -0
  60. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/fbs/entities/posting__barcodes.py +0 -0
  61. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/fbs/entities/posting__cancellation.py +0 -0
  62. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/fbs/entities/posting__customer.py +0 -0
  63. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/fbs/entities/posting__customer_address.py +0 -0
  64. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/fbs/entities/posting__delivery_method.py +0 -0
  65. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/fbs/entities/posting__filter_with.py +0 -0
  66. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/fbs/entities/posting__financial_data.py +0 -0
  67. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/fbs/entities/posting__financial_data_products.py +0 -0
  68. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/fbs/entities/posting__legal_info.py +0 -0
  69. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/fbs/entities/posting__optional.py +0 -0
  70. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/fbs/entities/posting__posting.py +0 -0
  71. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/fbs/entities/posting__product.py +0 -0
  72. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/fbs/entities/posting__requirements.py +0 -0
  73. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/fbs/entities/posting__tariffication.py +0 -0
  74. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/fbs/v2__fbs_posting_delivering.py +0 -0
  75. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/fbs/v2__posting_fbs_get_by_barcode.py +0 -0
  76. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/fbs/v2__posting_fbs_product_change.py +0 -0
  77. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/fbs/v3__posting_fbs_get.py +0 -0
  78. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/fbs/v3__posting_fbs_list.py +0 -0
  79. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/fbs/v3__posting_multiboxqty_set.py +0 -0
  80. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/mixins.py +0 -0
  81. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/prices_and_stocks/__init__.py +0 -0
  82. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/prices_and_stocks/base.py +0 -0
  83. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/prices_and_stocks/v1__product_info_stocks_by_warehouse_fbs.py +0 -0
  84. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/prices_and_stocks/v2__products_stocks.py +0 -0
  85. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/prices_and_stocks/v4__product_info_stocks.py +0 -0
  86. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/prices_and_stocks/v5__product_info_prices.py +0 -0
  87. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/products/base.py +0 -0
  88. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/products/v1__product_archive.py +0 -0
  89. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/products/v1__product_attributes_update.py +0 -0
  90. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/products/v1__product_import_by_sku.py +0 -0
  91. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/products/v1__product_import_info.py +0 -0
  92. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/products/v1__product_info_subscription.py +0 -0
  93. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/products/v1__product_rating_by_sku.py +0 -0
  94. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/products/v1__product_related_sku_get.py +0 -0
  95. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/products/v1__product_unarchive.py +0 -0
  96. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/products/v1__product_update_offer_id.py +0 -0
  97. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/products/v2__product_pictures_info.py +0 -0
  98. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/products/v2__products_delete.py +0 -0
  99. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/products/v3__product_import.py +0 -0
  100. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/products/v3__product_info_list.py +0 -0
  101. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/products/v3__product_list.py +0 -0
  102. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/products/v4__product_info_attributes.py +0 -0
  103. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/warehouses/__init__.py +0 -0
  104. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/warehouses/v1__delivery_method_list.py +0 -0
  105. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi/seller/schemas/warehouses/v1__warehouse_list.py +0 -0
  106. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi_async.egg-info/dependency_links.txt +0 -0
  107. {ozonapi_async-0.7.4 → ozonapi_async-0.9.0}/src/ozonapi_async.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ozonapi-async
3
- Version: 0.7.4
3
+ Version: 0.9.0
4
4
  Summary: Асинхронный клиент для работы с API маркетплейса Ozon
5
5
  Author: Alexander Ulianov
6
6
  License: MIT
@@ -30,6 +30,7 @@ Requires-Dist: tenacity<10.0.0,>=9.1.2
30
30
  Requires-Dist: aiolimiter<2.0.0,>=1.2.1
31
31
  Requires-Dist: pydantic<3.0.0,>=2.12.3
32
32
  Requires-Dist: pydantic-settings<3.0.0,>=2.11.0
33
+ Requires-Dist: async-lru<3.0.0,>=2.0.5
33
34
  Provides-Extra: test
34
35
  Requires-Dist: pytest<9.0.0,>=8.4.2; extra == "test"
35
36
  Requires-Dist: pytest-cov<8.0.0,>=7.0.0; extra == "test"
@@ -62,12 +63,13 @@ Dynamic: license-file
62
63
  - **👍 Простое использование** - быстрое развертывание и интеграция с вашим проектом
63
64
  - **📝 Отличная документация** - все методы содержат подробное описание и примеры
64
65
  - **👥 Мульти-аккаунт** - одновременная работа с несколькими кабинетами продавца Ozon
65
- - **🎯 Умное ограничение запросов** - автоматическое соблюдение лимитов API Ozon
66
+ - **⏱️ Умное ограничение запросов** - автоматическое соблюдение лимитов API Ozon
66
67
  - **➿ Гибкая настройка лимитов** - кастомные лимиты запросов для методов
67
- - **🛡️ Валидация данных** - строгая типизация с Pydantic v2
68
+ - **⏳ Кеширование ответов** - для методов, возвращающих статичные данные
68
69
  - **🔄 Автоповторы** - интеллектуальные повторные попытки запросов при сбоях
70
+ - **🛡️ Валидация данных** - строгая типизация с Pydantic v2
69
71
  - **📊 Детальное логирование** - асинхронная трассировка операций
70
- - **🎪 Гибкая конфигурация** - настройка через классы, переменные окружения или .env файлы
72
+ - **🎪 Гибкая конфигурация** - настройка через классы, переменные окружения или .env файл
71
73
  - **🧹 Очистка ресурсов** - автоматический контроль посредством контекстных менеджеров
72
74
  - **🧪 Полное покрытие тестами** - вся основная функциональность
73
75
  - **✔️ Проверено в production** - тестируется на боевых кабинетах продавцов Ozon
@@ -260,7 +262,7 @@ pytest --cov=ozonapi --cov-report=html
260
262
  | ✓ | `/v1/description-category/attribute/values/search` | Поиск по справочным значениям характеристики | `description_category_attribute_values_search()` |
261
263
  </details>
262
264
  <details>
263
- <summary>Загрузка и обновление товаров (16)</summary>
265
+ <summary>Загрузка и обновление товаров (18)</summary>
264
266
 
265
267
  | ✓ | Адрес метода Ozon | Описание метода | Python-метод |
266
268
  |---|---|---|---|
@@ -268,13 +270,13 @@ pytest --cov=ozonapi --cov-report=html
268
270
  | ✓ | `/v1/product/import/info` | Узнать статус добавления или обновления товара | `product_import_info()` |
269
271
  | ✓ | `/v1/product/import-by-sku` | Создать товар по SKU | `product_import_by_sku()` |
270
272
  | ✓ | `/v1/product/attributes/update` | Обновить характеристики товара | `product_attributes_update()` |
271
- | | `/v1/product/pictures/import` | Загрузить или обновить изображения товара | `product_pictures_import()` |
273
+ | | `/v1/product/pictures/import` | Загрузить или обновить изображения товара | `product_pictures_import()` |
272
274
  | ✓ | `/v3/product/list` | Список товаров | `product_list()` |
273
275
  | ✓ | `/v1/product/rating-by-sku` | Получить контент-рейтинг товаров по SKU | `product_rating_by_sku()` |
274
276
  | ✓ | `/v3/product/info/list` | Получить информацию о товарах по идентификаторам | `product_info_list()` |
275
277
  | ✓ | `/v4/product/info/attributes` | Получить описание характеристик товара | `product_info_attributes()` |
276
278
  | ✓ | `/v1/product/info/description` | Получить описание товара | `product_info_description()` |
277
- | | `/v4/product/info/limit` | Лимиты на ассортимент, создание и обновление товаров | `product_info_limit()` |
279
+ | | `/v4/product/info/limit` | Лимиты на ассортимент, создание и обновление товаров | `product_info_limit()` |
278
280
  | ✓ | `/v1/product/update/offer-id` | Изменить артикулы товаров из системы продавца | `product_update_offer_id()` |
279
281
  | ✓ | `/v1/product/archive` | Перенести товар в архив | `product_archive()` |
280
282
  | ✓ | `/v1/product/unarchive` | Вернуть товар из архива | `product_unarchive()` |
@@ -374,7 +376,7 @@ pytest --cov=ozonapi --cov-report=html
374
376
  | ✓ | `/v1/delivery-method/list` | Список методов доставки склада | `delivery_method_list()` |
375
377
  </details>
376
378
  <details>
377
- <summary>Обработка заказов FBS и rFBS (6)</summary>
379
+ <summary>Обработка заказов FBS и rFBS (9)</summary>
378
380
 
379
381
  | ✓ | Адрес метода Ozon | Описание метода | Python-метод |
380
382
  |---|---|---|---|
@@ -384,9 +386,9 @@ pytest --cov=ozonapi --cov-report=html
384
386
  | ✓ | `/v2/posting/fbs/get-by-barcode` | Получить информацию об отправлении по штрихкоду | `posting_fbs_get_by_barcode()` |
385
387
  | ✓ | `/v3/posting/multiboxqty/set` | Указать количество коробок для многокоробочных отправлений | `posting_multiboxqty_set()` |
386
388
  | ✓ | `/v2/posting/fbs/product/change` | Добавить вес для весовых товаров в отправлении | `posting_fbs_product_change()` |
387
- | | `/v2/posting/fbs/product/country/list` | Список доступных стран-изготовителей | `posting_fbs_product_country_list()` |
388
- | | `/v2/posting/fbs/product/country/set` | Добавить информацию о стране-изготовителе товара | `posting_fbs_product_country_set()` |
389
- | | `/v1/posting/fbs/restrictions` | Получить ограничения пункта приёма | `posting_fbs_restrictions()` |
389
+ | | `/v2/posting/fbs/product/country/list` | Список доступных стран-изготовителей | `posting_fbs_product_country_list()` |
390
+ | | `/v2/posting/fbs/product/country/set` | Добавить информацию о стране-изготовителе товара | `posting_fbs_product_country_set()` |
391
+ | | `/v1/posting/fbs/restrictions` | Получить ограничения пункта приёма | `posting_fbs_restrictions()` |
390
392
  | ☐ | `/v2/posting/fbs/package-label` | Напечатать этикетку | `posting_fbs_package_label()` |
391
393
  | ☐ | `/v2/posting/fbs/package-label/create` | Создать задание на формирование этикеток | `posting_fbs_package_label_create()` |
392
394
  | ☐ | `/v1/posting/fbs/package-label/get` | Получить файл с этикетками | `posting_fbs_package_label_get()` |
@@ -628,20 +630,21 @@ pytest --cov=ozonapi --cov-report=html
628
630
  <details>
629
631
  <summary>Прочие методы (1)</summary>
630
632
 
631
- | ✓ | Адрес метода Ozon | Описание метода | Python-метод |
632
- |---|---|---|---|
633
- | ☐ | `/v1/analytics/manage/stocks` | Управление остатками | `analytics_manage_stocks()` |
634
- | ✓ | `/v1/analytics/stocks` | Получить аналитику по остаткам | `analytics_stocks()` |
635
- | ☐ | `/v1/analytics/average-delivery-time` | Получить аналитику по среднему времени доставки | `analytics_average_delivery_time()` |
633
+ | ✓ | Адрес метода Ozon | Описание метода | Python-метод |
634
+ |---|---|-----------------------------------------------------------|---------------------------------------------|
635
+ | ☐ | `/v1/analytics/manage/stocks` | Управление остатками | `analytics_manage_stocks()` |
636
+ | ✓ | `/v1/analytics/stocks` | Получить аналитику по остаткам | `analytics_stocks()` |
637
+ | ☐ | `/v1/analytics/average-delivery-time` | Получить аналитику по среднему времени доставки | `analytics_average_delivery_time()` |
636
638
  | ☐ | `/v1/analytics/average-delivery-time/details` | Получить детальную аналитику по среднему времени доставки | `analytics_average_delivery_time_details()` |
637
- | ☐ | `/v1/analytics/average-delivery-time/summary` | Получить общую аналитику по среднему времени доставки | `analytics_average_delivery_time_summary()` |
638
- | ☐ | `/v1/product/info/wrong-volume` | Список товаров с некорректными ОВХ | `product_info_wrong_volume()` |
639
- | ☐ | `/v1/removal/from-supply/list` | Отчёт по вывозу и утилизации с поставки FBO | `removal_from_supply_list()` |
640
- | ☐ | `/v1/removal/from-stock/list` | Отчёт по вывозу и утилизации со стока FBO | `removal_from_stock_list()` |
641
- | ☐ | `/v3/supply-order/list` | Список заявок на поставку на склад Ozon | `supply_order_list()` |
642
- | ☐ | `/v3/supply-order/get` | Информация о заявке на поставку | `supply_order_get()` |
643
- | ☐ | `/v1/supply-order/content/update/validation` | Проверить новый товарный состав | `supply_order_content_update_validation()` |
644
- | ☐ | `/v1/product/info/warehouse/stocks` | Получить информацию по остаткам на складе FBS и rFBS | `product_info_warehouse_stocks()` |
639
+ | ☐ | `/v1/analytics/average-delivery-time/summary` | Получить общую аналитику по среднему времени доставки | `analytics_average_delivery_time_summary()` |
640
+ | ☐ | `/v1/product/info/wrong-volume` | Список товаров с некорректными ОВХ | `product_info_wrong_volume()` |
641
+ | ☐ | `/v1/removal/from-supply/list` | Отчёт по вывозу и утилизации с поставки FBO | `removal_from_supply_list()` |
642
+ | ☐ | `/v1/removal/from-stock/list` | Отчёт по вывозу и утилизации со стока FBO | `removal_from_stock_list()` |
643
+ | ☐ | `/v1/report/marked-products-sales/create` | Отчёт по продажам товаров с маркировкой | `report_marked_products_sales_create()` |
644
+ | ☐ | `/v3/supply-order/list` | Список заявок на поставку на склад Ozon | `supply_order_list()` |
645
+ | ☐ | `/v3/supply-order/get` | Информация о заявке на поставку | `supply_order_get()` |
646
+ | ☐ | `/v1/supply-order/content/update/validation` | Проверить новый товарный состав | `supply_order_content_update_validation()` |
647
+ | ☐ | `/v1/product/info/warehouse/stocks` | Получить информацию по остаткам на складе FBS и rFBS | `product_info_warehouse_stocks()` |
645
648
  </details>
646
649
  <details>
647
650
  <summary>Работа с цифровыми товарами</summary>
@@ -740,6 +743,8 @@ pytest --cov=ozonapi --cov-report=html
740
743
  | ☐ | `/v1/posting/cancel/status` | Статус отмены постинга из заказа | `posting_cancel_status()` |
741
744
  </details>
742
745
 
746
+ ---
747
+
743
748
  [MIT License](LICENSE)
744
749
 
745
750
  ---
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ozonapi-async"
7
- version = "0.7.4"
7
+ version = "0.9.0"
8
8
  description = "Асинхронный клиент для работы с API маркетплейса Ozon"
9
9
  readme = "readme.md"
10
10
  keywords = ["ozon", "api", "async", "ecommerce", "seller", "client"]
@@ -28,7 +28,8 @@ dependencies = [
28
28
  "tenacity>=9.1.2,<10.0.0",
29
29
  "aiolimiter>=1.2.1,<2.0.0",
30
30
  "pydantic>=2.12.3,<3.0.0",
31
- "pydantic-settings>=2.11.0,<3.0.0"
31
+ "pydantic-settings>=2.11.0,<3.0.0",
32
+ "async-lru (>=2.0.5,<3.0.0)"
32
33
  ]
33
34
 
34
35
  [[project.authors]]
@@ -20,12 +20,13 @@
20
20
  - **👍 Простое использование** - быстрое развертывание и интеграция с вашим проектом
21
21
  - **📝 Отличная документация** - все методы содержат подробное описание и примеры
22
22
  - **👥 Мульти-аккаунт** - одновременная работа с несколькими кабинетами продавца Ozon
23
- - **🎯 Умное ограничение запросов** - автоматическое соблюдение лимитов API Ozon
23
+ - **⏱️ Умное ограничение запросов** - автоматическое соблюдение лимитов API Ozon
24
24
  - **➿ Гибкая настройка лимитов** - кастомные лимиты запросов для методов
25
- - **🛡️ Валидация данных** - строгая типизация с Pydantic v2
25
+ - **⏳ Кеширование ответов** - для методов, возвращающих статичные данные
26
26
  - **🔄 Автоповторы** - интеллектуальные повторные попытки запросов при сбоях
27
+ - **🛡️ Валидация данных** - строгая типизация с Pydantic v2
27
28
  - **📊 Детальное логирование** - асинхронная трассировка операций
28
- - **🎪 Гибкая конфигурация** - настройка через классы, переменные окружения или .env файлы
29
+ - **🎪 Гибкая конфигурация** - настройка через классы, переменные окружения или .env файл
29
30
  - **🧹 Очистка ресурсов** - автоматический контроль посредством контекстных менеджеров
30
31
  - **🧪 Полное покрытие тестами** - вся основная функциональность
31
32
  - **✔️ Проверено в production** - тестируется на боевых кабинетах продавцов Ozon
@@ -218,7 +219,7 @@ pytest --cov=ozonapi --cov-report=html
218
219
  | ✓ | `/v1/description-category/attribute/values/search` | Поиск по справочным значениям характеристики | `description_category_attribute_values_search()` |
219
220
  </details>
220
221
  <details>
221
- <summary>Загрузка и обновление товаров (16)</summary>
222
+ <summary>Загрузка и обновление товаров (18)</summary>
222
223
 
223
224
  | ✓ | Адрес метода Ozon | Описание метода | Python-метод |
224
225
  |---|---|---|---|
@@ -226,13 +227,13 @@ pytest --cov=ozonapi --cov-report=html
226
227
  | ✓ | `/v1/product/import/info` | Узнать статус добавления или обновления товара | `product_import_info()` |
227
228
  | ✓ | `/v1/product/import-by-sku` | Создать товар по SKU | `product_import_by_sku()` |
228
229
  | ✓ | `/v1/product/attributes/update` | Обновить характеристики товара | `product_attributes_update()` |
229
- | | `/v1/product/pictures/import` | Загрузить или обновить изображения товара | `product_pictures_import()` |
230
+ | | `/v1/product/pictures/import` | Загрузить или обновить изображения товара | `product_pictures_import()` |
230
231
  | ✓ | `/v3/product/list` | Список товаров | `product_list()` |
231
232
  | ✓ | `/v1/product/rating-by-sku` | Получить контент-рейтинг товаров по SKU | `product_rating_by_sku()` |
232
233
  | ✓ | `/v3/product/info/list` | Получить информацию о товарах по идентификаторам | `product_info_list()` |
233
234
  | ✓ | `/v4/product/info/attributes` | Получить описание характеристик товара | `product_info_attributes()` |
234
235
  | ✓ | `/v1/product/info/description` | Получить описание товара | `product_info_description()` |
235
- | | `/v4/product/info/limit` | Лимиты на ассортимент, создание и обновление товаров | `product_info_limit()` |
236
+ | | `/v4/product/info/limit` | Лимиты на ассортимент, создание и обновление товаров | `product_info_limit()` |
236
237
  | ✓ | `/v1/product/update/offer-id` | Изменить артикулы товаров из системы продавца | `product_update_offer_id()` |
237
238
  | ✓ | `/v1/product/archive` | Перенести товар в архив | `product_archive()` |
238
239
  | ✓ | `/v1/product/unarchive` | Вернуть товар из архива | `product_unarchive()` |
@@ -332,7 +333,7 @@ pytest --cov=ozonapi --cov-report=html
332
333
  | ✓ | `/v1/delivery-method/list` | Список методов доставки склада | `delivery_method_list()` |
333
334
  </details>
334
335
  <details>
335
- <summary>Обработка заказов FBS и rFBS (6)</summary>
336
+ <summary>Обработка заказов FBS и rFBS (9)</summary>
336
337
 
337
338
  | ✓ | Адрес метода Ozon | Описание метода | Python-метод |
338
339
  |---|---|---|---|
@@ -342,9 +343,9 @@ pytest --cov=ozonapi --cov-report=html
342
343
  | ✓ | `/v2/posting/fbs/get-by-barcode` | Получить информацию об отправлении по штрихкоду | `posting_fbs_get_by_barcode()` |
343
344
  | ✓ | `/v3/posting/multiboxqty/set` | Указать количество коробок для многокоробочных отправлений | `posting_multiboxqty_set()` |
344
345
  | ✓ | `/v2/posting/fbs/product/change` | Добавить вес для весовых товаров в отправлении | `posting_fbs_product_change()` |
345
- | | `/v2/posting/fbs/product/country/list` | Список доступных стран-изготовителей | `posting_fbs_product_country_list()` |
346
- | | `/v2/posting/fbs/product/country/set` | Добавить информацию о стране-изготовителе товара | `posting_fbs_product_country_set()` |
347
- | | `/v1/posting/fbs/restrictions` | Получить ограничения пункта приёма | `posting_fbs_restrictions()` |
346
+ | | `/v2/posting/fbs/product/country/list` | Список доступных стран-изготовителей | `posting_fbs_product_country_list()` |
347
+ | | `/v2/posting/fbs/product/country/set` | Добавить информацию о стране-изготовителе товара | `posting_fbs_product_country_set()` |
348
+ | | `/v1/posting/fbs/restrictions` | Получить ограничения пункта приёма | `posting_fbs_restrictions()` |
348
349
  | ☐ | `/v2/posting/fbs/package-label` | Напечатать этикетку | `posting_fbs_package_label()` |
349
350
  | ☐ | `/v2/posting/fbs/package-label/create` | Создать задание на формирование этикеток | `posting_fbs_package_label_create()` |
350
351
  | ☐ | `/v1/posting/fbs/package-label/get` | Получить файл с этикетками | `posting_fbs_package_label_get()` |
@@ -586,20 +587,21 @@ pytest --cov=ozonapi --cov-report=html
586
587
  <details>
587
588
  <summary>Прочие методы (1)</summary>
588
589
 
589
- | ✓ | Адрес метода Ozon | Описание метода | Python-метод |
590
- |---|---|---|---|
591
- | ☐ | `/v1/analytics/manage/stocks` | Управление остатками | `analytics_manage_stocks()` |
592
- | ✓ | `/v1/analytics/stocks` | Получить аналитику по остаткам | `analytics_stocks()` |
593
- | ☐ | `/v1/analytics/average-delivery-time` | Получить аналитику по среднему времени доставки | `analytics_average_delivery_time()` |
590
+ | ✓ | Адрес метода Ozon | Описание метода | Python-метод |
591
+ |---|---|-----------------------------------------------------------|---------------------------------------------|
592
+ | ☐ | `/v1/analytics/manage/stocks` | Управление остатками | `analytics_manage_stocks()` |
593
+ | ✓ | `/v1/analytics/stocks` | Получить аналитику по остаткам | `analytics_stocks()` |
594
+ | ☐ | `/v1/analytics/average-delivery-time` | Получить аналитику по среднему времени доставки | `analytics_average_delivery_time()` |
594
595
  | ☐ | `/v1/analytics/average-delivery-time/details` | Получить детальную аналитику по среднему времени доставки | `analytics_average_delivery_time_details()` |
595
- | ☐ | `/v1/analytics/average-delivery-time/summary` | Получить общую аналитику по среднему времени доставки | `analytics_average_delivery_time_summary()` |
596
- | ☐ | `/v1/product/info/wrong-volume` | Список товаров с некорректными ОВХ | `product_info_wrong_volume()` |
597
- | ☐ | `/v1/removal/from-supply/list` | Отчёт по вывозу и утилизации с поставки FBO | `removal_from_supply_list()` |
598
- | ☐ | `/v1/removal/from-stock/list` | Отчёт по вывозу и утилизации со стока FBO | `removal_from_stock_list()` |
599
- | ☐ | `/v3/supply-order/list` | Список заявок на поставку на склад Ozon | `supply_order_list()` |
600
- | ☐ | `/v3/supply-order/get` | Информация о заявке на поставку | `supply_order_get()` |
601
- | ☐ | `/v1/supply-order/content/update/validation` | Проверить новый товарный состав | `supply_order_content_update_validation()` |
602
- | ☐ | `/v1/product/info/warehouse/stocks` | Получить информацию по остаткам на складе FBS и rFBS | `product_info_warehouse_stocks()` |
596
+ | ☐ | `/v1/analytics/average-delivery-time/summary` | Получить общую аналитику по среднему времени доставки | `analytics_average_delivery_time_summary()` |
597
+ | ☐ | `/v1/product/info/wrong-volume` | Список товаров с некорректными ОВХ | `product_info_wrong_volume()` |
598
+ | ☐ | `/v1/removal/from-supply/list` | Отчёт по вывозу и утилизации с поставки FBO | `removal_from_supply_list()` |
599
+ | ☐ | `/v1/removal/from-stock/list` | Отчёт по вывозу и утилизации со стока FBO | `removal_from_stock_list()` |
600
+ | ☐ | `/v1/report/marked-products-sales/create` | Отчёт по продажам товаров с маркировкой | `report_marked_products_sales_create()` |
601
+ | ☐ | `/v3/supply-order/list` | Список заявок на поставку на склад Ozon | `supply_order_list()` |
602
+ | ☐ | `/v3/supply-order/get` | Информация о заявке на поставку | `supply_order_get()` |
603
+ | ☐ | `/v1/supply-order/content/update/validation` | Проверить новый товарный состав | `supply_order_content_update_validation()` |
604
+ | ☐ | `/v1/product/info/warehouse/stocks` | Получить информацию по остаткам на складе FBS и rFBS | `product_info_warehouse_stocks()` |
603
605
  </details>
604
606
  <details>
605
607
  <summary>Работа с цифровыми товарами</summary>
@@ -698,6 +700,8 @@ pytest --cov=ozonapi --cov-report=html
698
700
  | ☐ | `/v1/posting/cancel/status` | Статус отмены постинга из заказа | `posting_cancel_status()` |
699
701
  </details>
700
702
 
703
+ ---
704
+
701
705
  [MIT License](LICENSE)
702
706
 
703
707
  ---
@@ -2,7 +2,7 @@
2
2
  Асинхронный интерфейс для взаимодействия с API маркетплейса Ozon.
3
3
  """
4
4
 
5
- __version__ = "0.7.4"
5
+ __version__ = "0.9.0"
6
6
  __author__ = "Alexander Ulianov"
7
7
  __repository__ = "https://github.com/a-ulianov/OzonAPI"
8
8
  __docs__ = "https://github.com/a-ulianov/OzonAPI#readme"
@@ -1,8 +1,13 @@
1
+ from async_lru import alru_cache
2
+
1
3
  from ..core import APIManager, method_rate_limit
4
+ from ..core.exceptions import APINotFoundError
2
5
  from ..schemas.fbs import PostingFBSUnfulfilledListRequest, PostingFBSUnfulfilledListResponse, PostingFBSListResponse, \
3
6
  PostingFBSListRequest, PostingFBSGetRequest, PostingFBSGetResponse, PostingFBSGetByBarcodeResponse, \
4
7
  PostingFBSGetByBarcodeRequest, PostingFBSMultiBoxQtySetResponse, PostingFBSMultiBoxQtySetRequest, \
5
- PostingFBSProductChangeRequest, PostingFBSProductChangeResponse
8
+ PostingFBSProductChangeRequest, PostingFBSProductChangeResponse, PostingFBSProductCountryListResponse, \
9
+ PostingFBSProductCountryListRequest, PostingFBSProductCountrySetRequest, PostingFBSProductCountrySetResponse, \
10
+ PostingFBSRestrictionsResponse, PostingFBSRestrictionsRequest
6
11
 
7
12
 
8
13
  class SellerFBSAPI(APIManager):
@@ -339,4 +344,134 @@ class SellerFBSAPI(APIManager):
339
344
  endpoint="posting/fbs/product/change",
340
345
  json=request.model_dump(by_alias=True)
341
346
  )
342
- return PostingFBSProductChangeResponse(**response)
347
+ return PostingFBSProductChangeResponse(**response)
348
+
349
+ @alru_cache(ttl=86400)
350
+ async def posting_fbs_product_country_list(
351
+ self: "SellerFBSAPI",
352
+ request: PostingFBSProductCountryListRequest = PostingFBSProductCountryListRequest.model_construct()
353
+ ) -> PostingFBSProductCountryListResponse:
354
+ """Метод для получения списка доступных стран-изготовителей и их ISO кодов.
355
+
356
+ Notes:
357
+ • Метод возвращает полный список стран-изготовителей, доступных для указания в карточках товаров.
358
+ • Для фильтрации результатов можно использовать параметр `name_search` - поисковая строка по названию страны.
359
+ • Если параметр `name_search` не указан или пустой, возвращается полный список всех доступных стран.
360
+ • Поиск осуществляется по частичному совпадению с названием страны на русском языке.
361
+ • Регистр букв в поисковой строке не имеет значения.
362
+ • ISO код страны возвращается в формате двухбуквенного кода (Alpha-2) согласно стандарту ISO 3166-1.
363
+
364
+ References:
365
+ https://docs.ozon.ru/api/seller/?__rr=1#operation/PostingAPI_ListCountryProductFbsPostingV2
366
+
367
+ Args:
368
+ request: Запрос на получение списка стран-изготовителей по схеме `PostingFBSProductCountryListRequest`
369
+
370
+ Returns:
371
+ Список доступных стран-изготовителей с их ISO кодами по схеме `PostingFBSProductCountryListResponse`
372
+
373
+ Examples:
374
+ Базовое применение (получение полного списка стран):
375
+ async with SellerAPI(client_id, api_key) as api:
376
+ result = await api.posting_fbs_product_country_list(
377
+ PostingFBSProductCountryListRequest()
378
+ )
379
+
380
+ Пример с фильтрацией по названию страны (частичное совпадение):
381
+ async with SellerAPI(client_id, api_key) as api:
382
+ result = await api.posting_fbs_product_country_list(
383
+ PostingFBSProductCountryListRequest(
384
+ name_search="тУрЦ"
385
+ )
386
+ )
387
+ """
388
+ try:
389
+ response = await self._request(
390
+ method="post",
391
+ api_version="v2",
392
+ endpoint="posting/fbs/product/country/list",
393
+ json=request.model_dump()
394
+ )
395
+ except APINotFoundError:
396
+ return PostingFBSProductCountryListResponse.model_construct()
397
+ return PostingFBSProductCountryListResponse(**response)
398
+
399
+ async def posting_fbs_product_country_set(
400
+ self: "SellerFBSAPI",
401
+ request: PostingFBSProductCountrySetRequest
402
+ ) -> PostingFBSProductCountrySetResponse:
403
+ """Метод для добавления информации о стране-изготовителе товара в отправлении FBS.
404
+
405
+ Notes:
406
+ • Метод используется для добавления атрибута «Страна-изготовитель» к товару в отправлении, если он не был указан ранее.
407
+ • Страна-изготовитель указывается в формате двухбуквенного кода стандарта ISO 3166-1 (Alpha-2).
408
+ • Список доступных стран-изготовителей и их ISO кодов можно получить с помощью метода posting_fbs_product_country_list().
409
+ • После успешного выполнения метода система возвращает признак необходимости передачи номера ГТД (грузовой таможенной декларации).
410
+ • Если is_gtd_needed = true, необходимо передать номер ГТД для указанного продукта и отправления.
411
+ • Метод может быть применен только к отправлениям, где страна-изготовитель еще не указана.
412
+
413
+ References:
414
+ https://docs.ozon.ru/api/seller/?#operation/PostingAPI_SetCountryProductFbsPostingV2
415
+
416
+ Args:
417
+ request: Запрос на добавление информации о стране-изготовителе товара по схеме `PostingFBSProductCountrySetRequest`
418
+
419
+ Returns:
420
+ Результат выполнения операции с информацией о необходимости ГТД по схеме `PostingFBSProductCountrySetResponse`
421
+
422
+ Examples:
423
+ async with SellerAPI(client_id, api_key) as api:
424
+ result = await api.posting_fbs_product_country_set(
425
+ PostingFBSProductCountrySetRequest(
426
+ posting_number="57195475-0050-3",
427
+ product_id=180550365,
428
+ country_iso_code="NO"
429
+ )
430
+ )
431
+ """
432
+ response = await self._request(
433
+ method="post",
434
+ api_version="v2",
435
+ endpoint="posting/fbs/product/country/set",
436
+ json=request.model_dump()
437
+ )
438
+ return PostingFBSProductCountrySetResponse(**response)
439
+
440
+ async def posting_fbs_restrictions(
441
+ self: "SellerFBSAPI",
442
+ request: PostingFBSRestrictionsRequest
443
+ ) -> PostingFBSRestrictionsResponse:
444
+ """Метод для получения габаритных, весовых и прочих ограничений пункта приёма по номеру отправления.
445
+
446
+ Notes:
447
+ • Метод применим только для работы по схеме FBS.
448
+ • Возвращает ограничения пункта приёма, связанные с указанным отправлением.
449
+ • Ограничения включают габаритные (ширина, высота, длина), весовые (мин./макс. вес) и стоимостные (мин./макс. цена) параметры.
450
+ • Вес указывается в граммах, габариты — в сантиметрах, стоимость — в рублях.
451
+ • Если для какого-то параметра ограничение не установлено, значение будет None.
452
+ • Метод помогает определить, соответствует ли отправление требованиям пункта приёма перед передачей.
453
+
454
+ References:
455
+ https://docs.ozon.ru/api/seller/?#operation/PostingAPI_GetRestrictions
456
+
457
+ Args:
458
+ request: Запрос на получение ограничений пункта приёма по номеру отправления по схеме `PostingFBSRestrictionsRequest`
459
+
460
+ Returns:
461
+ Ограничения пункта приёма для указанного отправления по схеме `PostingFBSRestrictionsResponse`
462
+
463
+ Examples:
464
+ async with SellerAPI(client_id, api_key) as api:
465
+ result = await api.posting_fbs_restrictions(
466
+ PostingFBSRestrictionsRequest(
467
+ posting_number="76673629-0020-1"
468
+ )
469
+ )
470
+ """
471
+ response = await self._request(
472
+ method="post",
473
+ api_version="v1",
474
+ endpoint="posting/fbs/restrictions",
475
+ json=request.model_dump()
476
+ )
477
+ return PostingFBSRestrictionsResponse(**response["result"])
@@ -181,6 +181,7 @@ class SellerPricesAndStocksAPI(APIManager):
181
181
  auto_action_enabled=PricingStrategy.UNKNOWN,
182
182
  auto_add_to_ozon_actions_list_enabled=PricingStrategy.UNKNOWN,
183
183
  currency_code=CurrencyCode.RUB,
184
+ manage_elastic_boosting_through_price=True,
184
185
  min_price="800",
185
186
  min_price_for_auto_actions_enabled=True,
186
187
  net_price="650",
@@ -6,7 +6,8 @@ from ..schemas.products import ProductArchiveResponse, ProductArchiveRequest, Pr
6
6
  ProductInfoAttributesResponse, ProductInfoListRequest, ProductInfoListResponse, ProductInfoSubscriptionRequest, \
7
7
  ProductInfoSubscriptionResponse, ProductListRequest, ProductListResponse, ProductPicturesInfoRequest, \
8
8
  ProductPicturesInfoResponse, ProductRatingBySkuRequest, ProductRatingBySkuResponse, ProductRelatedSkuGetRequest, \
9
- ProductRelatedSkuGetResponse, ProductUpdateOfferIdRequest, ProductUpdateOfferIdResponse
9
+ ProductRelatedSkuGetResponse, ProductUpdateOfferIdRequest, ProductUpdateOfferIdResponse, \
10
+ ProductPicturesImportResponse, ProductPicturesImportRequest, ProductInfoLimitResponse
10
11
 
11
12
 
12
13
  class SellerProductAPI(APIManager):
@@ -670,4 +671,99 @@ class SellerProductAPI(APIManager):
670
671
  endpoint="product/update/offer-id",
671
672
  json=request.model_dump(),
672
673
  )
673
- return ProductUpdateOfferIdResponse(**response)
674
+ return ProductUpdateOfferIdResponse(**response)
675
+
676
+ async def product_pictures_import(
677
+ self: "SellerProductAPI", request: ProductPicturesImportRequest
678
+ ) -> ProductPicturesImportResponse:
679
+ """Загружает или обновляет изображения товара.
680
+
681
+ Notes:
682
+ • При каждом вызове метода передавайте все изображения, которые должны быть на карточке товара.
683
+ Например, если вы вызвали метод и загрузили 10 изображений, а затем вызвали метод второй раз
684
+ и загрузили ещё одно, то все 10 предыдущих сотрутся.
685
+ • Для загрузки передайте адрес ссылки на изображение в общедоступном облачном хранилище.
686
+ Формат изображения по ссылке — JPG или PNG.
687
+ • Изображения в массиве `images` располагайте в соответствии с желаемым порядком на сайте.
688
+ Главным будет первое изображение в массиве.
689
+ • Для каждого товара вы можете загрузить до `30` изображений.
690
+ • Для загрузки изображений 360 используйте поле `images360`, для загрузки маркетингового цвета — `color_image`.
691
+ • Если вы хотите изменить состав или порядок изображений, получите информацию с помощью метода
692
+ `product_info_list()` — в нём отображается текущий порядок и состав изображений. Скопируйте
693
+ данные полей `images`, `images360`, `color_image`, измените и дополните состав или порядок
694
+ в соответствии с необходимостью.
695
+ • В ответе метода всегда будет статус `imported` — картинка не обработана. Чтобы посмотреть
696
+ финальный статус, примерно через 10 секунд вызовите метод `product_pictures_info()`.
697
+ `* Примечание: Видимо, артефакт в документации, т.к. по факту метод product_pictures_info() не возвращает статусы.`
698
+ • Финальные статусы загрузки изображений:
699
+ - `uploaded` — изображение загружено;
700
+ - `pending` — при загрузке изображения возникла ошибка. Повторите попытку позже.
701
+
702
+ References:
703
+ https://docs.ozon.ru/api/seller/?__rr=1#operation/ProductAPI_ProductImportPictures
704
+
705
+ Args:
706
+ request: Данные для загрузки изображений товара по схеме `ProductPicturesImportRequest`.
707
+
708
+ Returns:
709
+ Результат загрузки изображений с временными статусами по схеме `ProductPicturesImportResponse`.
710
+
711
+ Example:
712
+ async with SellerAPI(client_id, api_key) as api:
713
+ result = await api.product_pictures_import(
714
+ ProductPicturesImportRequest(
715
+ product_id=123456789,
716
+ color_image="https://example.com/color.jpg",
717
+ images=[
718
+ "https://example.com/image1.jpg",
719
+ "https://example.com/image2.jpg",
720
+ "https://example.com/image3.jpg",
721
+ ],
722
+ images360=[
723
+ "https://example.com/360_1.jpg",
724
+ "https://example.com/360_2.jpg",
725
+ ]
726
+ )
727
+ )
728
+ """
729
+ response = await self._request(
730
+ method="post",
731
+ api_version="v1",
732
+ endpoint="product/pictures/import",
733
+ json=request.model_dump(),
734
+ )
735
+ return ProductPicturesImportResponse(**response)
736
+
737
+ async def product_info_limit(
738
+ self: "SellerProductAPI"
739
+ ) -> ProductInfoLimitResponse:
740
+ """Получает информацию о лимитах на ассортимент, создание и обновление товаров.
741
+
742
+ Notes:
743
+ • Метод возвращает информацию о трёх типах лимитов:
744
+ - Лимит на ассортимент (total) — сколько всего товаров можно создать в личном кабинете.
745
+ - Суточный лимит на создание товаров (daily_create) — сколько товаров можно создать в сутки.
746
+ - Суточный лимит на обновление товаров (daily_update) — сколько товаров можно обновить в сутки.
747
+ • Если значение лимита равно `-1`, это означает, что лимит не ограничен.
748
+ • При достижении лимита на ассортимент вы не сможете создавать новые товары.
749
+ • Суточные лимиты сбрасываются в указанное в `reset_at` время по UTC.
750
+ • Лимиты зависят от типа аккаунта продавца и могут изменяться.
751
+ • Рекомендуется проверять лимиты перед массовыми операциями с товарами.
752
+
753
+ References:
754
+ https://docs.ozon.ru/api/seller/?__rr=1#operation/ProductAPI_GetUploadQuota
755
+
756
+ Returns:
757
+ Информация о лимитах на ассортимент, создание и обновление товаров по схеме `ProductInfoLimitResponse`.
758
+
759
+ Example:
760
+ async with SellerAPI(client_id, api_key) as api:
761
+ result = await api.product_info_limit()
762
+ """
763
+ response = await self._request(
764
+ method="post",
765
+ api_version="v4",
766
+ endpoint="product/info/limit",
767
+ json={},
768
+ )
769
+ return ProductInfoLimitResponse(**response)
@@ -23,8 +23,14 @@ __all__ = [
23
23
  "PostingFBSProductChangeRequest",
24
24
  "PostingFBSProductChangeRequestItem",
25
25
  "PostingFBSProductChangeResponse",
26
+ "PostingFBSProductCountrySetRequest",
27
+ "PostingFBSProductCountrySetResponse",
26
28
  "PostingFBSProductDetailed",
29
+ "PostingFBSProductCountryListRequest",
30
+ "PostingFBSProductCountryListResponse",
27
31
  "PostingFBSRequirements",
32
+ "PostingFBSRestrictionsRequest",
33
+ "PostingFBSRestrictionsResponse",
28
34
  "PostingFBSTariffication",
29
35
  "PostingFBSListRequestFilterLastChangedStatusDate",
30
36
  "PostingFBSListFilter",
@@ -45,9 +51,13 @@ from .entities import PostingFBSAddressee, PostingFBSAnalyticsData, PostingFBSBa
45
51
  PostingFBSFinancialDataProducts, PostingFBSLegalInfo, PostingFBSOptional, PostingFBSPosting, \
46
52
  PostingFBSProductDetailed, \
47
53
  PostingFBSRequirements, PostingFBSTariffication, PostingFBSFilterWith, PostingFBSProduct
54
+ from .v1__posting_fbs_restrictions import PostingFBSRestrictionsResponse, PostingFBSRestrictionsRequest
48
55
  from .v2__posting_fbs_get_by_barcode import PostingFBSGetByBarcodeRequest, PostingFBSGetByBarcodeResponse
49
56
  from .v2__posting_fbs_product_change import PostingFBSProductChangeRequestItem, PostingFBSProductChangeRequest, \
50
57
  PostingFBSProductChangeResponse
58
+ from .v2__posting_fbs_product_country_list import PostingFBSProductCountryListResponse, \
59
+ PostingFBSProductCountryListRequest
60
+ from .v2__posting_fbs_product_country_set import PostingFBSProductCountrySetResponse, PostingFBSProductCountrySetRequest
51
61
  from .v3__posting_fbs_get import PostingFBSGetRequest, PostingFBSGetResponse
52
62
  from .v3__posting_fbs_list import PostingFBSListRequestFilterLastChangedStatusDate, \
53
63
  PostingFBSListFilter, PostingFBSListRequest, PostingFBSListResult, PostingFBSListResponse