Публичное API

Программный доступ к каталогу и заказам. Ключ выдаётся в клиентском боте; все запросы идут по HTTPS.

Быстрый старт

  1. Получите ключ в боте @nordiinsta_bot — вместе с ним выдаётся секрет для подписи.
  2. Проверьте ключ: GET /health должен вернуть {"status":"ok"}.
  3. Найдите позицию: GET /products?min_qty=10&max_price=1 — в ответе нужен sku и min_quantity.
  4. Пополните баланс ключа: POST /balance/topup, переведите точную сумму на выданный адрес.
  5. Закажите: POST /orders с payment_method "balance" и, если нужно, webhook_url. Затем опрашивайте GET /orders/{id}, пока статус не станет completed.

База

https://nordi.site/api/v1

Отдельного api-поддомена нет: любой адрес вида api.* — не наш, ключ туда не отправляйте.

Авторизация

Каждый запрос несёт заголовок с ключом:

X-Api-Key: <ваш ключ>

Для ключей с включённой подписью дополнительно нужны отметка времени и подпись тела:

X-Timestamp: <unix epoch, секунды>
X-Signature: hmac_sha256(secret, f"{ts}\n{body}").hex()
  • Расхождение времени с сервером — не более 300 секунд.
  • Подписывается строка «отметка времени, перевод строки, тело запроса»; у GET тело пустое.
  • Повтор той же подписи отклоняется — защита от переигрывания.
  • Подпись ОБЯЗАТЕЛЬНА для POST /orders и POST /balance/topup: ключ без секрета такие запросы не делает — ответ 401. Чтение (GET) подписи не требует.

Методы

GET/healthПроверка доступности
GET/productsКаталог товаров с фильтрами и пагинацией
GET/products/{id}Товар по публичному номеру (sku)
GET/instantТолько позиции с мгновенной выдачей
GET/categoriesКатегории со счётчиками
GET/balanceБаланс ключа
POST/balance/topupПополнение баланса ключа
POST/ordersСоздать заказ
GET/ordersСписок заказов ключа
GET/orders/{id}Заказ по номеру
GET/usageРасход лимитов ключа
GET/health

Проверка доступности

curl -s "https://nordi.site/api/v1/health" -H "X-Api-Key: $KEY"

Ответ

{"status": "ok", "timestamp": 1786000000}
GET/products

Каталог товаров с фильтрами и пагинацией

Параметры

categoryслаг категории, как в /categories
skuточный публичный номер позиции
min_priceцена за штуку в USDT, не ниже
max_priceцена за штуку в USDT, не выше
min_qtyостаток не меньше указанного, по умолчанию 1
pageстраница, с 1
page_sizeпозиций на странице, 1…200, по умолчанию 50
curl -s "https://nordi.site/api/v1/products?category=autoreg_aged&min_qty=10&page_size=50" \
  -H "X-Api-Key: $KEY"

Ответ

{"total": 72, "page": 1, "page_size": 50, "items": [
  {"id": 388448, "sku": 732110,
   "title": "Instagram | Авторег API | Отлежка 7+ мес.",
   "category": "autoreg_aged", "price_usdt": 0.3991,
   "quantity": 493, "min_quantity": 10, "is_available": true,
   "has_real_device": false, "followers_count": null, "account_age_days": 255,
   "tags": ["autoreg_aged", "account_2fa"],
   "instant_delivery": true, "instant_stock": 410}
]}
GET/products/{sku}

Товар по публичному номеру (sku)

curl -s "https://nordi.site/api/v1/products/732110" -H "X-Api-Key: $KEY"

Ответ

{"id": 388448, "sku": 732110, "quantity": 493, "min_quantity": 10,
 "price_usdt": 0.3991, "is_available": true, "instant_stock": 410}
GET/instant

Только позиции с мгновенной выдачей

Параметры

categoryслаг категории, как в /categories
min_priceцена за штуку в USDT, не ниже
max_priceцена за штуку в USDT, не выше
pageстраница, с 1
page_sizeпозиций на странице, 1…200, по умолчанию 50
curl -s "https://nordi.site/api/v1/instant?max_price=1" -H "X-Api-Key: $KEY"

Ответ

{"total": 18, "page": 1, "page_size": 50, "items": [
  {"sku": 732110, "instant_delivery": true, "instant_stock": 410, "price_usdt": 0.3991}
]}
GET/categories

Категории со счётчиками

curl -s "https://nordi.site/api/v1/categories" -H "X-Api-Key: $KEY"

Ответ

[{"category": "autoreg_aged", "count": 38, "min_price_usdt": 0.2183},
 {"category": "account_2fa", "count": 20, "min_price_usdt": 0.2903}]
GET/balance

Баланс ключа

curl -s "https://nordi.site/api/v1/balance" -H "X-Api-Key: $KEY"

Ответ

{"balance_usdt": 50.0, "total_spent_usdt": 12.5,
 "total_topup_usdt": 62.5, "total_refunded_usdt": 0.0, "currency": "USDT"}
POST/balance/topupHMAC

Пополнение баланса ключа

Параметры

amount_usdtсумма пополнения в USDT, 1…100000
networkсеть перевода из списка ниже
TS=$(date +%s)
BODY='{"amount_usdt":100,"network":"usdt_trc_20"}'
SIG=$(printf "$TS\n$BODY" | openssl dgst -sha256 -hmac "$SECRET" -r | cut -d" " -f1)
curl -s -X POST "https://nordi.site/api/v1/balance/topup" \
  -H "X-Api-Key: $KEY" -H "X-Timestamp: $TS" -H "X-Signature: $SIG" \
  -H "Content-Type: application/json" -d "$BODY"

Ответ

{"topup_id": "9f1c…", "payment_address": "T…", "payment_network": "usdt_trc_20",
 "amount_usdt": 100.07, "expires_at": 1786003600}
POST/ordersHMAC

Создать заказ

Параметры

product_idпубличный номер позиции (sku)
quantityсколько штук, 1…10000 и не меньше min_quantity
payment_method«balance» — с баланса ключа, либо сеть перевода из списка ниже
webhook_urlпубличный HTTPS-адрес для уведомления о конечном статусе
TS=$(date +%s)
BODY='{"product_id":732110,"quantity":10,"payment_method":"balance"}'
SIG=$(printf "$TS\n$BODY" | openssl dgst -sha256 -hmac "$SECRET" -r | cut -d" " -f1)
curl -s -X POST "https://nordi.site/api/v1/orders" \
  -H "X-Api-Key: $KEY" -H "X-Timestamp: $TS" -H "X-Signature: $SIG" \
  -H "Content-Type: application/json" -d "$BODY"

Ответ

{"order_id": "ND-104512", "status": "processing", "price_usdt": 3.99,
 "quantity": 10, "items": null, "refunded": false,
 "created_at": 1786000000, "updated_at": 1786000000}
GET/orders

Список заказов ключа

Параметры

statusprocessing, completed, failed, expired, cancelled, refunded
pageстраница, с 1
page_sizeпозиций на странице, 1…200, по умолчанию 50
curl -s "https://nordi.site/api/v1/orders?status=completed&page_size=20" -H "X-Api-Key: $KEY"

Ответ

{"total": 4, "page": 1, "page_size": 20, "items": [
  {"order_id": "ND-104512", "status": "completed", "sku": 732110,
   "quantity": 10, "price_usdt": 3.99, "refunded": false}
]}
GET/orders/{order_id}

Заказ по номеру

curl -s "https://nordi.site/api/v1/orders/ND-104512" -H "X-Api-Key: $KEY"

Ответ

{"order_id": "ND-104512", "status": "completed", "quantity": 10,
 "items": [{"login": "…", "password": "…", "cookies": "…"}],
 "error_message": null, "refunded": false}
GET/usage

Расход лимитов ключа

curl -s "https://nordi.site/api/v1/usage" -H "X-Api-Key: $KEY"

Ответ

{"request_count": 1284, "last_used_at": 1786000000,
 "first_used_at": 1785000000, "last_endpoint": "/v1/products",
 "total_spent_usdt": 12.5}

Поля позиции

sku — публичный номер, по нему же открывается карточка и создаётся заказ; quantity — остаток; min_quantity — минимальная партия, меньше бэкенд не принимает; instant_delivery и instant_stock — сколько единиц уходит из готового склада сразу после оплаты; is_available — продаётся ли позиция сейчас; tags — категории, к которым она отнесена; title_en и title_zh — название на других локалях, может быть пустым.

Статусы заказа

processingпринят и оплачивается или собирается
completedвыдан целиком, аккаунты в items
failedне собрался; автоматического возврата нет — напишите в поддержку, вернём вручную
expiredоплата не пришла в срок, заказ закрыт
cancelledотменён; автоматического возврата нет — если деньги списаны, напишите в поддержку, вернём вручную
refundedвозврат проведён

Сети пополнения

usdt_trc_20, usdt_bep_20, usdt_polygon, usdt_arbitrum, usdt_ton, usdt_solana. Сумма к переводу резервируется уникальной — переводите её до копейки, иначе платёж придётся искать руками.

Лимиты

60 запросов в минуту на ключ; каталог и категории дополнительно ограничены 120 запросами в минуту на адрес. Превышение отдаёт 429 с временем ожидания в тексте ошибки — повторяйте с задержкой.

Вебхуки

Передайте webhook_url в POST /orders — на него уйдёт POST с JSON, когда заказ дойдёт до конечного состояния: completed, partial, failed, expired, cancelled или refunded.

POST https://nordi.site/api/v1/orders
{"product_id": 732110, "quantity": 10, "payment_method": "balance",
 "webhook_url": "https://your.site/nordi-hook"}

Тело: order_id, status, price_usdt, quantity, product_id, items (выдача), error_message, refunded, fired_at.

{"order_id": "ND-104512", "status": "completed", "price_usdt": 3.99,
 "quantity": 10, "product_id": 732110,
 "items": [{"login": "…", "password": "…"}],
 "error_message": null, "refunded": false, "fired_at": 1786000000}
  • Если у ключа включена подпись, запрос несёт заголовки X-Webhook-Timestamp, X-Webhook-Signature (hmac_sha256(secret, "отметка времени \n тело")) и X-Webhook-Algorithm: HMAC-SHA256.
  • Повторы: до 5 попыток с нарастающей задержкой на 5xx и таймауты; успешная доставка фиксируется и не повторяется. Адрес должен быть публичным — локальные и внутренние хосты отклоняются.
  • Автоматического возврата нет нигде, в том числе у заказов через API: если за неуспешный заказ (failed, expired, cancelled) деньги были списаны, сами на баланс они не возвращаются — поле refunded остаётся false. Напишите в поддержку с номером заказа — проверим и вернём вручную. Вебхук о конечном статусе приходит как обычно.

Коды ответа

401ключ не передан или отозван
403подпись неверна либо просрочена
404позиции или заказа с таким номером нет
409на балансе ключа не хватает средств
422параметры не прошли проверку
429превышен лимит запросов — повторите с задержкой

Postman-коллекция

Готовая коллекция со всеми методами: подставьте базу и ключ в переменные окружения.

Скачать · postman.json

Как получить ключ

Ключ выдаёт клиентский бот магазина — @nordiinsta_bot. Секрет показывается один раз, повторно его не восстановить.