API для автоматизации

Подключите наш магазин к своему боту или сайту: товар покупается автоматически с вашего баланса, ключ сразу приходит в ответе.

Как начать

  1. Напишите в поддержку магазина — вам выдадут ключ доступа (строка, начинается с nk_).
  2. Пополните баланс в нашем Telegram-боте — покупки через API списываются с него.
  3. Когда у вас покупают товар, который вы берёте у нас, ваш бот или сайт отправляет запрос на покупку и получает ключ в ответе.

Свои товары вы продаёте как обычно — к нам нужно обращаться только за теми позициями, что берёте у нас. 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 } }
HTTPcodeЧто делать
400invalid_requestПроверьте поля запроса, подробности в details
400quantity_limitСлишком много штук в одном заказе, максимум — в max_quantity
401unauthorizedНет ключа или он неверный
402insufficient_balanceПополните баланс в боте
403forbiddenДоступ отключён, напишите в поддержку
404product_not_found, order_not_foundНеверный ID
409out_of_stockТовара не хватает, сколько есть — в available
409idempotency_key_reusedЭтот ключ уже использован для другой покупки — нужен новый
429rate_limitedСлишком много запросов, подождите минуту
500internalПовторите запрос с тем же idempotency_key

Если ответ не пришёл совсем (таймаут, обрыв связи), повторите запрос с тем же idempotency_key — это безопасно.

Ограничения

Безопасность

Ключ доступа — это доступ к вашему балансу. Храните его как пароль.

Примеры кода

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'];
}

Как встроить в свой магазин

  1. Свяжите свои позиции с нашими: «моя позиция X = товар с product_id 3».
  2. Периодически (например, раз в минуту) запрашивайте /v1/products, чтобы показывать актуальное наличие и не продавать то, чего нет.
  3. Когда ваш покупатель оплатил — вызывайте POST /v1/orders и отдавайте ему ключи из ответа.
  4. При ошибке сети повторяйте с тем же idempotency_key. При out_of_stock или insufficient_balance — верните деньги своему покупателю или пополните баланс.