Перейти к содержимому
Публичный API · тариф Ultra

Каталог dropX в вашем сайте, боте и CRM

Ваш сервер забирает товары с вашими ценами и остатками по размерам, а потом раз в несколько минут получает только то, что изменилось.

GET /v1/products/changes?markup_percent=30200
{
  "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
минут между обновлениями
01

Что отдаёт API

Названий, контактов и цен отдельных поставщиков в API нет: всё сведено в одну карточку товара.

Только изменения

После первой выгрузки API присылает только товары, у которых поменялась цена, остатки или размеры, и те, что сняли с продажи.

Ваши цены

Закупочная цена приходит всегда. Передайте свою наценку, и API посчитает розничную и зачёркнутую цену, в том числе для каждого размера.

Остатки по размерам

По каждому размеру видно, сколько штук осталось у всех поставщиков вместе. Наличие 200 товаров проверяется одним запросом.

Полные карточки

Описания на русском и украинском, текст для маркетплейсов, вся галерея фото (главное первым), бренд, характеристики, вес и габариты для доставки.

02

Как начать

  1. Шаг 1

    Создайте ключ

    В профиле на вкладке «Публичный API». Скопируйте его сразу: второй раз ключ не покажем.

  2. Шаг 2

    Передайте его в заголовке

    X-API-Key в каждом запросе с вашего сервера.

  3. Шаг 3

    Проверьте ключ

    Запрос GET /me вернёт ваш тариф и лимиты.

03

Синхронизация магазина

Один запрос по кругу: /products/changes с закладкой.

  1. 1Первый запуск отдаёт весь каталог, по 200 товаров за раз.
  2. 2В каждом ответе есть закладка meta.next_cursor. Сохраняйте её после каждого ответа, даже пустого.
  3. 3Раз в 5–15 минут передавайте её в cursor, и придут только изменения. Поставщики обновляются примерно раз в час.
  4. 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())
04

Цены

Считаются только по параметрам запроса. Настройки профиля на них не влияют. Всё в гривнах.

cost_price
Закупочная цена. Приходит всегда, считается по поставщикам, у которых товар в наличии.
price
Розничная цена. Есть, только если передан markup_percent, поэтому опт не попадёт на витрину случайно.
old_price
Зачёркнутая цена. Её задают discount_percent или old_price_markup_percent.
sizes[].price
Цена размера. Считается только по поставщикам, у которых есть этот размер: 40-й может стоить 2300 ₴, а 46-й 2400 ₴.

Передавайте одну и ту же наценку в каждом запросе синхронизации. Если её поменять, API ответит pricing_changed: начните выгрузку заново, чтобы на сайте не остались старые цены.

05

Лимиты и ошибки

Сколько запросов осталось, видно в заголовках X-RateLimit-* каждого ответа.

Лимиты
Запросов в минуту на ключ60
Запросов одновременно3
Запросов в сутки на аккаунт10 000
Товаров в одном ответе200
Товаров в одном запросе /stock200
401invalid_api_key
Ключа нет, он неверный или отозван
403plan_required
В тарифе нет API или подписка закончилась
404not_found
Такого товара нет или его сняли с продажи
422validation_error
Неверный параметр, какой именно, написано в details
422invalid_cursor
Закладка испорчена, начните синхронизацию сначала
422pricing_changed
Наценка не та, с которой начали синхронизацию: начните заново
429rate_limited
Слишком много запросов, подождите столько секунд, сколько в Retry-After

Ошибка всегда приходит в виде {"error": {"code", "message", "request_id"}}. В поддержку присылайте request_id.

06

Правила

  • Вызывайте API только со своего сервера. Браузеру он не ответит: ключ в коде страницы увидел бы любой посетитель.

  • Храните товары у себя в базе и не обращайтесь к API на каждое открытие страницы покупателем.

  • У аккаунта один ключ. Если он утёк, перевыпустите его в профиле, и старый сразу перестанет работать.

Подключите каталог к своему магазину

В справочнике все запросы и поля с примерами. Файл OpenAPI открывается в Postman и Insomnia, по нему можно собрать клиент на своём языке.

v1.0 · октябрь 2026. Новые поля добавляем в эту же версию, незнакомые поля просто пропускайте. Удалить или переименовать что-то можем только в новой версии и предупредим заранее.