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.
{
"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
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.
Getting started
- Step 1
Create a key
In your profile on the “Public API” tab. Copy it right away: it is shown only once.
- Step 2
Send it in a header
X-API-Key on every request from your server.
- Step 3
Check the key
GET /me returns your plan and limits.
Syncing your shop
One request in a loop: /products/changes with a bookmark.
- 1The first run returns the whole catalog, 200 products at a time.
- 2Every answer has a bookmark, meta.next_cursor. Save it after every answer, even an empty one.
- 3Every 5–15 minutes pass it as cursor and only changes come back. Suppliers update about once an hour.
- 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())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.
Limits and errors
The X-RateLimit-* headers of every answer show how many requests are left.
| Requests per minute per key | 60 |
|---|---|
| Requests at a time | 3 |
| Requests per day per account | 10 000 |
| Products per answer | 200 |
| Products per /stock request | 200 |
- 401
invalid_api_key - No key, or the key is wrong or revoked
- 403
plan_required - The plan has no API access or the subscription ended
- 404
not_found - No such product, or it is off sale
- 422
validation_error - A parameter is wrong; details says which one
- 422
invalid_cursor - The bookmark is broken; start the sync over
- 422
pricing_changed - The markup differs from the one the sync started with; start over
- 429
rate_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.
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.