API для автоматизации
Подключите наш магазин к своему боту или сайту: товар покупается автоматически с вашего баланса, ключ сразу приходит в ответе.
Как начать
- Напишите в поддержку магазина — вам выдадут ключ доступа (строка, начинается с
nk_). - Пополните баланс в нашем Telegram-боте — покупки через API списываются с него.
- Когда у вас покупают товар, который вы берёте у нас, ваш бот или сайт отправляет запрос на покупку и получает ключ в ответе.
Свои товары вы продаёте как обычно — к нам нужно обращаться только за теми позициями, что берёте у нас. API не привязан к Telegram: это обычные HTTPS-запросы с JSON, их можно отправлять из бота, с сайта, из CRM — откуда угодно.
Адрес API: https://api.neuroopy.store/v1
Все суммы — в долларах США (USD), цены уже с вашей персональной скидкой.
Авторизация
Ключ передаётся в каждом запросе в заголовке Authorization:
Authorization: Bearer nk_ваш_ключ
Методы
GET/v1/products
Список товаров: ваша цена за штуку и сколько сейчас в наличии.
{
"products": [
{ "id": 3, "name": "Gemini Pro 18мес", "price": 1.8, "stock": 46 },
{ "id": 5, "name": "Super Grok 1мес", "price": 9.0, "stock": 0 }
]
}
Если stock равен 0, товар закончился — не продавайте его у себя, пока не появится.
GET/v1/balance
Ваш баланс.
{ "balance": 120.5, "currency": "USD" }
POST/v1/orders
Купить товар. Деньги списываются с баланса, ключи приходят в ответе.
| Поле | Тип | Описание |
|---|---|---|
product_id | число | ID товара из /v1/products |
quantity | число | Количество, по умолчанию 1 |
idempotency_key | строка | Ваш уникальный номер этой покупки, 8–64 символа (буквы, цифры, _, -). Обязательно — зачем |
{ "product_id": 3, "quantity": 2, "idempotency_key": "order-58213" }
Ответ 201 Created:
{
"order_id": 7213,
"product_id": 3,
"product_name": "Gemini Pro 18мес",
"quantity": 2,
"total": 3.6,
"keys": ["KEY-AAAA-1111", "KEY-BBBB-2222"],
"created_at": "2026-11-02 14:40:12",
"balance": 116.9
}
Заказ выполняется целиком или не выполняется вовсе: если товара меньше, чем вы просите, ничего не списывается.
GET/v1/orders/{order_id}
Получить уже сделанный заказ вместе с ключами — например, если вы потеряли ответ. Видны только ваши заказы.
Как не списать деньги дважды
Бывает, что запрос дошёл и деньги списались, а ответ потерялся по дороге из-за сбоя сети. Если просто повторить запрос, получится вторая покупка.
Поэтому в каждой покупке передавайте idempotency_key — например, номер заказа в вашем магазине. Если при ошибке сети вы повторите запрос с тем же ключом, новой покупки не будет: вернётся уже сделанный заказ с теми же ключами и кодом 200 вместо 201.
idempotency_key. Повторяете тот же запрос — тот же ключ. Новая покупка — новый ключ.Ошибки
При ошибке приходит такой ответ:
{ "error": { "code": "insufficient_balance", "message": "Недостаточно средств на балансе", "balance": 1.2, "required": 3.6 } }
| HTTP | code | Что делать |
|---|---|---|
| 400 | invalid_request | Проверьте поля запроса, подробности в details |
| 400 | quantity_limit | Слишком много штук в одном заказе, максимум — в max_quantity |
| 401 | unauthorized | Нет ключа или он неверный |
| 402 | insufficient_balance | Пополните баланс в боте |
| 403 | forbidden | Доступ отключён, напишите в поддержку |
| 404 | product_not_found, order_not_found | Неверный ID |
| 409 | out_of_stock | Товара не хватает, сколько есть — в available |
| 409 | idempotency_key_reused | Этот ключ уже использован для другой покупки — нужен новый |
| 429 | rate_limited | Слишком много запросов, подождите минуту |
| 500 | internal | Повторите запрос с тем же idempotency_key |
Если ответ не пришёл совсем (таймаут, обрыв связи), повторите запрос с тем же idempotency_key — это безопасно.
Ограничения
- До 120 запросов в минуту на ключ.
- Максимум штук в одном заказе задаётся для каждого партнёра — при превышении придёт
quantity_limit. - Только предоплата: баланс не уходит в минус.
Безопасность
- Отправляйте запросы только со своего сервера. Если у вас сайт, не вызывайте API из JavaScript в браузере — ключ увидит любой посетитель. Запросы из браузера API отклоняет.
- Храните ключ в переменной окружения или файле настроек, а не в коде и не в репозитории.
- Адрес API тоже держите в настройках — если он когда-нибудь сменится, достаточно будет поменять одну строку.
- Если ключ мог утечь — напишите в поддержку, вам выпустят новый, а старый сразу перестанет работать.
Примеры кода
curl
curl https://api.neuroopy.store/v1/products \
-H "Authorization: Bearer $API_KEY"
curl -X POST https://api.neuroopy.store/v1/orders \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"product_id": 3, "quantity": 1, "idempotency_key": "order-58213"}'
Node.js (Telegram-бот, сервер)
const API_URL = process.env.SHOP_API_URL; // https://api.neuroopy.store/v1
const API_KEY = process.env.SHOP_API_KEY;
async function buyKeys(productId, quantity, myOrderId) {
const res = await fetch(`${API_URL}/orders`, {
method: "POST",
headers: {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
product_id: productId,
quantity,
idempotency_key: `order-${myOrderId}`, // номер заказа в вашем магазине
}),
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`);
return data.keys; // отдайте их своему покупателю
}
Python
import os, requests
API_URL = os.environ["SHOP_API_URL"] # https://api.neuroopy.store/v1
API_KEY = os.environ["SHOP_API_KEY"]
def buy_keys(product_id, quantity, my_order_id):
r = requests.post(
f"{API_URL}/orders",
headers={"Authorization": f"Bearer {API_KEY}"},
json={
"product_id": product_id,
"quantity": quantity,
"idempotency_key": f"order-{my_order_id}",
},
timeout=30,
)
data = r.json()
if not r.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}")
return data["keys"]
PHP (сайт, на сервере)
<?php
$apiUrl = getenv('SHOP_API_URL'); // https://api.neuroopy.store/v1
$apiKey = getenv('SHOP_API_KEY');
function buyKeys($productId, $quantity, $myOrderId) {
global $apiUrl, $apiKey;
$ch = curl_init("$apiUrl/orders");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer $apiKey",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
'product_id' => $productId,
'quantity' => $quantity,
'idempotency_key' => "order-$myOrderId",
]),
]);
$data = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new Exception($data['error']['code'] . ': ' . $data['error']['message']);
}
return $data['keys'];
}
Как встроить в свой магазин
- Свяжите свои позиции с нашими: «моя позиция X = товар с
product_id3». - Периодически (например, раз в минуту) запрашивайте
/v1/products, чтобы показывать актуальное наличие и не продавать то, чего нет. - Когда ваш покупатель оплатил — вызывайте
POST /v1/ordersи отдавайте ему ключи из ответа. - При ошибке сети повторяйте с тем же
idempotency_key. Приout_of_stockилиinsufficient_balance— верните деньги своему покупателю или пополните баланс.