Каталог dropX в вашем сайте, боте и CRM
Ваш сервер забирает товары с вашими ценами и остатками по размерам, а потом раз в несколько минут получает только то, что изменилось.
{
"sku": "SKU-1024",
"name": "Adidas Samba OG",
"cost_price": "2300.00",
"price": "2990.00",
"in_stock": true,
"sizes": [
{ "size": "40", "stock": 8, "price": "2990.00" },
{ "size": "46", "stock": 1, "price": "3120.00" }
],
"images": [{ "url": "…/00_main.jpg", "is_main": true }, …],
"sync_version": 48211
}- товаров за запрос
- 200
- товаров за запрос
- запросов в минуту
- 60
- запросов в минуту
- названия и описания
- RU · UK
- названия и описания
- минут между обновлениями
- 5–15
- минут между обновлениями
Что отдаёт API
Названий, контактов и цен отдельных поставщиков в API нет: всё сведено в одну карточку товара.
Только изменения
После первой выгрузки API присылает только товары, у которых поменялась цена, остатки или размеры, и те, что сняли с продажи.
Ваши цены
Закупочная цена приходит всегда. Передайте свою наценку, и API посчитает розничную и зачёркнутую цену, в том числе для каждого размера.
Остатки по размерам
По каждому размеру видно, сколько штук осталось у всех поставщиков вместе. Наличие 200 товаров проверяется одним запросом.
Полные карточки
Описания на русском и украинском, текст для маркетплейсов, вся галерея фото (главное первым), бренд, характеристики, вес и габариты для доставки.
Как начать
- Шаг 1
Создайте ключ
В профиле на вкладке «Публичный API». Скопируйте его сразу: второй раз ключ не покажем.
- Шаг 2
Передайте его в заголовке
X-API-Key в каждом запросе с вашего сервера.
- Шаг 3
Проверьте ключ
Запрос GET /me вернёт ваш тариф и лимиты.
Синхронизация магазина
Один запрос по кругу: /products/changes с закладкой.
- 1Первый запуск отдаёт весь каталог, по 200 товаров за раз.
- 2В каждом ответе есть закладка meta.next_cursor. Сохраняйте её после каждого ответа, даже пустого.
- 3Раз в 5–15 минут передавайте её в cursor, и придут только изменения. Поставщики обновляются примерно раз в час.
- 4Товар со status: removed сняли с продажи, уберите его со своего сайта.
import os
import time
import requests
API = "https://api.dropx.site/v1"
HEADERS = {"X-API-Key": os.environ["DROPX_API_KEY"]}
MARKUP = 30 # price = cost_price + 30%; send the same value on every call
def sync(cursor=None):
"""Apply every change since `cursor`; returns the cursor to store for the next run."""
while True:
params = {"limit": 200, "markup_percent": MARKUP}
if cursor:
params["cursor"] = cursor
response = requests.get(f"{API}/products/changes", headers=HEADERS, params=params, timeout=30)
if response.status_code == 429:
time.sleep(int(response.headers.get("Retry-After", "5")))
continue
response.raise_for_status()
body = response.json()
for change in body["data"]:
if change["status"] == "removed":
remove_product(change["id"]) # take it off your shop
else:
upsert_product(change["product"]) # create or update it
cursor = body["meta"]["next_cursor"]
save_cursor(cursor) # store it even when nothing changed
if not body["meta"]["has_more"]:
return cursor
# Run every 5-15 minutes (cron, Celery, systemd timer):
# sync(load_cursor())Цены
Считаются только по параметрам запроса. Настройки профиля на них не влияют. Всё в гривнах.
cost_price- Закупочная цена. Приходит всегда, считается по поставщикам, у которых товар в наличии.
price- Розничная цена. Есть, только если передан markup_percent, поэтому опт не попадёт на витрину случайно.
old_price- Зачёркнутая цена. Её задают discount_percent или old_price_markup_percent.
sizes[].price- Цена размера. Считается только по поставщикам, у которых есть этот размер: 40-й может стоить 2300 ₴, а 46-й 2400 ₴.
Передавайте одну и ту же наценку в каждом запросе синхронизации. Если её поменять, API ответит pricing_changed: начните выгрузку заново, чтобы на сайте не остались старые цены.
Лимиты и ошибки
Сколько запросов осталось, видно в заголовках X-RateLimit-* каждого ответа.
| Запросов в минуту на ключ | 60 |
|---|---|
| Запросов одновременно | 3 |
| Запросов в сутки на аккаунт | 10 000 |
| Товаров в одном ответе | 200 |
| Товаров в одном запросе /stock | 200 |
- 401
invalid_api_key - Ключа нет, он неверный или отозван
- 403
plan_required - В тарифе нет API или подписка закончилась
- 404
not_found - Такого товара нет или его сняли с продажи
- 422
validation_error - Неверный параметр, какой именно, написано в details
- 422
invalid_cursor - Закладка испорчена, начните синхронизацию сначала
- 422
pricing_changed - Наценка не та, с которой начали синхронизацию: начните заново
- 429
rate_limited - Слишком много запросов, подождите столько секунд, сколько в Retry-After
Ошибка всегда приходит в виде {"error": {"code", "message", "request_id"}}. В поддержку присылайте request_id.
Правила
Вызывайте API только со своего сервера. Браузеру он не ответит: ключ в коде страницы увидел бы любой посетитель.
Храните товары у себя в базе и не обращайтесь к API на каждое открытие страницы покупателем.
У аккаунта один ключ. Если он утёк, перевыпустите его в профиле, и старый сразу перестанет работать.
Подключите каталог к своему магазину
В справочнике все запросы и поля с примерами. Файл OpenAPI открывается в Postman и Insomnia, по нему можно собрать клиент на своём языке.
v1.0 · октябрь 2026. Новые поля добавляем в эту же версию, незнакомые поля просто пропускайте. Удалить или переименовать что-то можем только в новой версии и предупредим заранее.