Перейти к содержимому
Public API · Ultra plan

The dropX catalog in your site, bot and CRM

Your server pulls products with your prices and stock per size, then every few minutes gets only what changed.

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
}
products per request
200
products per request
requests a minute
60
requests a minute
names and descriptions
RU · UK
names and descriptions
minutes between updates
5–15
minutes between updates
01

What you get

No supplier names, contacts or per-supplier prices: everything is merged into one product.

Only what changed

After the first sync the API sends only products whose price, stock or sizes changed, and the ones taken off sale.

Your prices

The cost price always comes back. Pass your markup and the API computes the retail and crossed-out prices, per size too.

Stock per size

Each size shows how many items are left across all suppliers. 200 products can be checked in one request.

Full product details

Russian and Ukrainian descriptions, marketplace text, the full photo gallery (main first), brand, attributes, weight and dimensions for shipping.

02

Getting started

  1. Step 1

    Create a key

    In your profile on the “Public API” tab. Copy it right away: it is shown only once.

  2. Step 2

    Send it in a header

    X-API-Key on every request from your server.

  3. Step 3

    Check the key

    GET /me returns your plan and limits.

03

Syncing your shop

One request in a loop: /products/changes with a bookmark.

  1. 1The first run returns the whole catalog, 200 products at a time.
  2. 2Every answer has a bookmark, meta.next_cursor. Save it after every answer, even an empty one.
  3. 3Every 5–15 minutes pass it as cursor and only changes come back. Suppliers update about once an hour.
  4. 4A product with status: removed is off sale; take it off your site.
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

Prices

Computed only from the request; profile settings do not affect them. Everything is in UAH.

cost_price
Wholesale cost. Always present, taken from suppliers that have the product in stock.
price
Retail price. Present only with markup_percent, so the wholesale cost never reaches a storefront by accident.
old_price
Crossed-out price, set by discount_percent or old_price_markup_percent.
sizes[].price
Price of a size, from the suppliers that have it: size 40 may cost 2300 ₴ and size 46 2400 ₴.

Send the same markup on every sync request. If you change it, the API answers pricing_changed: start the sync over so no old prices stay on your site.

05

Limits and errors

The X-RateLimit-* headers of every answer show how many requests are left.

Limits
Requests per minute per key60
Requests at a time3
Requests per day per account10 000
Products per answer200
Products per /stock request200
401invalid_api_key
No key, or the key is wrong or revoked
403plan_required
The plan has no API access or the subscription ended
404not_found
No such product, or it is off sale
422validation_error
A parameter is wrong; details says which one
422invalid_cursor
The bookmark is broken; start the sync over
422pricing_changed
The markup differs from the one the sync started with; start over
429rate_limited
Too many requests; wait the seconds given in Retry-After

An error always looks like {"error": {"code", "message", "request_id"}}. Send the request_id to support.

06

Rules

  • Call the API only from your server. It will not answer a browser: any visitor could read a key in page code.

  • Keep the products in your own database instead of calling the API on every page a shopper opens.

  • An account has one key. If it leaks, rotate it in your profile and the old one stops working at once.

Connect the catalog to your shop

The reference lists every request and field with examples. The OpenAPI file opens in Postman and Insomnia and can generate a client in your language.

v1.0 · October 2026. New fields go into this version, so skip fields you do not know. Removing or renaming anything needs a new version, announced in advance.