К содержимому

LITTLEFOX API · V1

От каталога
до выдачи товара.

Подключите LittleFox к своему сайту, боту или приложению. Актуальные товары, покупка с вашего баланса и данные заказа — через один API.

REST / JSONRUB & USDБезопасные повторы
ВАШ ПЕРВЫЙ ЗАПРОС200 OK
cURL
curl "$BASE_URL/api/v1/me?currency=RUB" \
  -H "Authorization: Bearer $API_KEY"
Ваш ключВаш балансВаш заказ

Примеры используют условные значения. Реальные цены и ID доступны в каталоге.

01

Первый запрос за три шага

  1. Создайте личный ключ

    В боте откройте «Профиль → API ключ → Создать мой API ключ».

  2. Подготовьте окружение

    Сохраните ключ на своём сервере в API_KEY. В BASE_URL укажите адрес этого сайта без завершающего слеша.

  3. Проверьте баланс

    Выполните запрос ниже или подключитесь на странице API тест. Просмотр баланса и каталога бесплатный.

cURL
curl "$BASE_URL/api/v1/me?currency=RUB" \
  -H "Authorization: Bearer $API_KEY"
Общие правила

Базовый путь — /api/v1. Используйте HTTPS; ответы приходят в JSON. Успешный ответ содержит ok: true и data, ошибка — ok: false и error.

02

Личный ключ, общий баланс

Передавайте ключ в заголовке каждого запроса. Он даёт доступ только к балансу и заказам своего владельца.

HTTP
Authorization: Bearer YOUR_API_KEY

Также поддерживается заголовок X-API-Key. Ключи в адресной строке не принимаются.

GET/api/v1/me

Ответ содержит Telegram ID, логин, баланс и лимит запросов. Баланс общий с ботом; пополнить его можно в профиле.

Поле / значениеОписание
balance_kopeksДоступно для покупок. Резерв уже вычтен — повторно вычитать его не нужно.
held_kopeksСредства, зарезервированные под незавершённые заказы.
limits.requests_per_minuteТекущий лимит запросов вашего ключа за минуту.
Храните ключ на сервере

Не включайте его в публичный код, логи или репозиторий. Отключение API приостанавливает доступ. Перевыпуск сразу отзывает старый ключ; баланс и история сохраняются.

03

Каталог, наличие и цены

GET/api/v1/products?page=1&limit=50&lang=ru&currency=RUB
Поле / значениеОписание
page / limitСтраница и размер списка: limit от 1 до 100, по умолчанию 50. Ответ: items, page, limit, total, pages, has_more.
available=trueТолько товары в наличии. Без фильтра возвращаются и временно отсутствующие товары.
lang=ru / enЯзык названия и описания. Не влияет на валюту.
JSON · пример товара
{
  "id": 42,
  "name": "Example product",
  "price_kopeks": 19900,
  "price": "199.00",
  "currency": "RUB",
  "stock": 12,
  "stock_unlimited": false,
  "available": true,
  "category": {
    "id": 3,
    "name": "Subscriptions"
  },
  "wholesale_tiers": [
    {
      "min_quantity": 5,
      "unit_price_kopeks": 17900,
      "unit_price": "179.00",
      "currency": "RUB"
    }
  ]
}

Если товара нет

При stock=0 и available=false отключите покупку. Название, цена, описание и ID сохраняются. После пополнения тот же товар снова доступен.

Если покупаете оптом

Используется последняя подходящая ступень wholesale_tiers. Цена и остаток проверяются повторно при создании заказа.

GET/api/v1/products/{id}

Периодически обновляйте каталог с учётом лимита запросов — изменения не отправляются автоматически. Для stock_unlimited=true остаток равен null, товар не заканчивается. Услуги с дополнительными параметрами оформляются в боте.

04

Валюта отображения и точная оплата

Добавьте currency=RUB или currency=USD к запросам баланса, каталога, заказов и операций. По умолчанию — RUB. Язык и валюта выбираются независимо; отдельный долларовый счёт не создаётся.

Поле / значениеОписание
price / total / balanceСтроки для отображения в выбранной валюте, округлённые до двух знаков. То же правило для held, unit_price, charged, refunded и amount.
…_kopeksТочные суммы в копейках: 100 = 1 ₽. Используйте их для расчёта общей стоимости и лимита покупки.
exchange_rateКурс магазина: RUB за 1 USD, точная строка rate и время updated_at. Один курс на весь ответ. В RUB значение null.
JSON · пример USD при курсе 80
{
  "currency": "USD",
  "settlement_currency": "RUB",
  "exchange_rate": {
    "base": "USD",
    "quote": "RUB",
    "rate": "80",
    "updated_at": "2026-09-20T12:00:00.000Z"
  },
  "items": [
    {
      "id": 42,
      "price_kopeks": 19900,
      "price": "2.49",
      "currency": "USD"
    }
  ]
}
Оплата рассчитывается в рублях с точностью до копейки

Не переводите округлённую цену USD обратно в копейки и не умножайте её для оплаты. Считайте max_total_kopeks по точной цене, количеству и оптовой ступени. Очень малая сумма в USD может округлиться до 0.00 — это не означает, что товар бесплатный.

Цену определяет сервер. max_total_kopeks ограничивает расходы, но не задаёт стоимость. Поля price, currency и exchange_rate в теле заказа не принимаются. Валюта ответа не меняет списание.

История в USD использует курс текущего ответа. Для снимка на момент запроса сохраните ответ вместе с курсом. Если курс недоступен, USD-запрос вернёт 503 exchange_rate_unavailable до создания заказа; повторите его в RUB с тем же ключом операции.

05

Описания для сайта и бота

В ответе приходит выбранная через lang языковая версия в двух форматах — без внутренних команд магазина.

Поле / значениеОписание
descriptionОбычный текст. Ссылки сохраняют подпись и адрес; анимированные эмодзи заменены обычными символами.
description_htmlHTML для сайта: strong, em, u, s, code, pre, blockquote, a, br. Без скриптов, событий и стилей; спойлеры раскрыты.
JSON
{
  "description": "Product description\nGuide (https://example.com/guide)",
  "description_html": "<strong>Product description</strong><br><a href=\"https://example.com/guide\" rel=\"noopener noreferrer\">Guide</a>"
}

Данные выдачи delivery_data передаются без преобразований. Сохраняйте их целиком, включая переносы строк.

06

Покупка с вашего баланса

POST/api/v1/orders?currency=RUB

Один запрос создаёт заказ на один товар в количестве от 1 до 100. Это платная операция с баланса владельца ключа. Сохраните ключ операции и параметры до отправки.

cURL
curl -X POST "$BASE_URL/api/v1/orders?currency=RUB" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: store-order-1042" \
  -d '{
    "product_id": 42,
    "quantity": 1,
    "max_total_kopeks": 19900,
    "client_order_id": "1042"
  }'
Поле / значениеОписание
Idempotency-KeyОбязательный заголовок: 8–128 латинских букв, цифр и символов : _ -. Новый для каждого заказа, неизменный при повторе.
product_idID товара из актуального каталога. 42 в примере — условное значение.
quantityЦелое число 1–100 в пределах наличия.
max_total_kopeksОбязательный лимит суммы всего заказа, от 1 до 100000000. При превышении покупка отклоняется.
client_order_idВаша метка заказа до 128 символов, необязательна. Не заменяет Idempotency-Key.
201Выдан200Повтор заказа202В обработке

Выдавайте данные покупателю только при status=delivered. Поле data.delivery_data содержит полный результат: текст, несколько строк или JSON в виде строки.

07

Проверьте весь путь покупки

Тестовый товар доступен всем API-клиентам. Найдите is_test=true в каталоге и используйте полученный id. Наличие неограниченно: stock=null, stock_unlimited=true, available=true; api_only=true.

Небольшая реальная оплата, вымышленные данные

Цена единицы — 100 копеек (1 ₽). В USD ответ показывает эквивалент по курсу магазина. Вы получите уникальные вымышленные email | password на example.com; они не дают доступа к реальным аккаунтам. Заказ попадёт в «Мои покупки», историю API и статистику.

  1. Отправьте обычный POST /orders с ID тестового товара, quantity=1 и max_total_kopeks=100.
  2. Дождитесь delivered и сохраните delivery_data. При повторе используйте прежний Idempotency-Key.

На сайте готовый сценарий: подтверждение суммы, проверка результата, копирование и скачивание выдачи. API ключ остаётся в памяти вкладки; для восстановления сохраняется только идентификатор операции.

Открыть API тест
08

Один заказ — один ключ операции

Если ответ не пришёл, повторите исходный POST с тем же Idempotency-Key и параметрами. Новый ключ создаёт новую покупку; изменение параметров прежнего ключа вернёт 409 idempotency_conflict. Выбор другой валюты ответа не создаёт новый заказ.

GET/api/v1/orders/{id}

Если ID уже известен, проверяйте этот заказ через GET не чаще одного раза в 5 секунд.

Поле / значениеОписание
processingЗаказ принят и обрабатывается; средства могут быть в резерве.
recoveringСистема автоматически уточняет результат. Дождитесь завершения, не создавайте новую покупку.
deliveredПокупка завершена. Сумма списана, delivery_data заполнено.
failedПокупка отклонена до списания. Причина в failure_code и failure_message.
refundedПокупка не выполнена; резерв полностью возвращён на баланс.
Нет ответа — ещё не отказ

До подтверждения результата система не повторяет покупку и не возвращает резерв. Проверка продолжается после перезапуска. Уже принятые заказы обрабатываются даже при отключении ключа.

09

История заказов и движение средств

GET/api/v1/orders?page=1&limit=20

API-заказы владельца ключа. Фильтр client_order_id находит заказ по вашей метке. Список не содержит выдачу — запросите заказ по ID.

GET/api/v1/transactions?page=1&limit=50

Все операции по вашему балансу. amount_kopeks со знаком: плюс — зачисление, минус — списание или резерв. Тип purchase_hold меняется на purchase после выдачи; purchase_refund — возврат.

В обоих списках limit — от 1 до 100. Поле has_more показывает, есть ли следующая страница. Для валюты используйте currency=RUB или currency=USD.

10

Ошибки и лимиты запросов

JSON
{
  "ok": false,
  "error": {
    "code": "insufficient_balance",
    "message": "Your available balance is too low."
  }
}

Обрабатывайте error.code, а не текст message. Ответ с ошибкой покупки может содержать data с заказом. При сетевой ошибке или 5xx сохраняйте прежний ключ операции.

Поле / значениеОписание
400 / 415Проверьте JSON, поля, Content-Type и Idempotency-Key.
401 / 403Ключ неверен, отключён, перевыпущен или доступ ограничен.
402Недостаточно средств. Пополните баланс в боте.
404Товар или ваш заказ не найден.
409Изменилась цена, недостаточно остатка, конфликт параметров или другой заказ обрабатывается. Уточните error.code.
429Достигнут лимит. Подождите Retry-After секунд; ваш лимит указан в /me.
503API отключён или курс недоступен. При exchange_rate_unavailable можно повторить в RUB с тем же ключом операции.

Нужна помощь? Напишите в поддержку через бота. Приложите номер заказа и error.code; полный API ключ передавать не нужно.