LITTLEFOX API · V1
От каталога
до выдачи товара.
Подключите LittleFox к своему сайту, боту или приложению. Актуальные товары, покупка с вашего баланса и данные заказа — через один API.
curl "$BASE_URL/api/v1/me?currency=RUB" \
-H "Authorization: Bearer $API_KEY"Примеры используют условные значения. Реальные цены и ID доступны в каталоге.
Первый запрос за три шага
- Создайте личный ключ
В боте откройте «Профиль → API ключ → Создать мой API ключ».
- Подготовьте окружение
Сохраните ключ на своём сервере в API_KEY. В BASE_URL укажите адрес этого сайта без завершающего слеша.
- Проверьте баланс
Выполните запрос ниже или подключитесь на странице API тест. Просмотр баланса и каталога бесплатный.
curl "$BASE_URL/api/v1/me?currency=RUB" \
-H "Authorization: Bearer $API_KEY"Базовый путь — /api/v1. Используйте HTTPS; ответы приходят в JSON. Успешный ответ содержит ok: true и data, ошибка — ok: false и error.
Личный ключ, общий баланс
Передавайте ключ в заголовке каждого запроса. Он даёт доступ только к балансу и заказам своего владельца.
Authorization: Bearer YOUR_API_KEYТакже поддерживается заголовок X-API-Key. Ключи в адресной строке не принимаются.
/api/v1/meОтвет содержит Telegram ID, логин, баланс и лимит запросов. Баланс общий с ботом; пополнить его можно в профиле.
| Поле / значение | Описание |
|---|---|
balance_kopeks | Доступно для покупок. Резерв уже вычтен — повторно вычитать его не нужно. |
held_kopeks | Средства, зарезервированные под незавершённые заказы. |
limits.requests_per_minute | Текущий лимит запросов вашего ключа за минуту. |
Не включайте его в публичный код, логи или репозиторий. Отключение API приостанавливает доступ. Перевыпуск сразу отзывает старый ключ; баланс и история сохраняются.
Каталог, наличие и цены
/api/v1/products?page=1&limit=50&lang=ru¤cy=RUB| Поле / значение | Описание |
|---|---|
page / limit | Страница и размер списка: limit от 1 до 100, по умолчанию 50. Ответ: items, page, limit, total, pages, has_more. |
available=true | Только товары в наличии. Без фильтра возвращаются и временно отсутствующие товары. |
lang=ru / en | Язык названия и описания. Не влияет на валюту. |
{
"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. Цена и остаток проверяются повторно при создании заказа.
/api/v1/products/{id}Периодически обновляйте каталог с учётом лимита запросов — изменения не отправляются автоматически. Для stock_unlimited=true остаток равен null, товар не заканчивается. Услуги с дополнительными параметрами оформляются в боте.
Валюта отображения и точная оплата
Добавьте 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. |
{
"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 с тем же ключом операции.
Описания для сайта и бота
В ответе приходит выбранная через lang языковая версия в двух форматах — без внутренних команд магазина.
| Поле / значение | Описание |
|---|---|
description | Обычный текст. Ссылки сохраняют подпись и адрес; анимированные эмодзи заменены обычными символами. |
description_html | HTML для сайта: strong, em, u, s, code, pre, blockquote, a, br. Без скриптов, событий и стилей; спойлеры раскрыты. |
{
"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 передаются без преобразований. Сохраняйте их целиком, включая переносы строк.
Покупка с вашего баланса
/api/v1/orders?currency=RUBОдин запрос создаёт заказ на один товар в количестве от 1 до 100. Это платная операция с баланса владельца ключа. Сохраните ключ операции и параметры до отправки.
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_id | ID товара из актуального каталога. 42 в примере — условное значение. |
quantity | Целое число 1–100 в пределах наличия. |
max_total_kopeks | Обязательный лимит суммы всего заказа, от 1 до 100000000. При превышении покупка отклоняется. |
client_order_id | Ваша метка заказа до 128 символов, необязательна. Не заменяет Idempotency-Key. |
Выдавайте данные покупателю только при status=delivered. Поле data.delivery_data содержит полный результат: текст, несколько строк или JSON в виде строки.
Проверьте весь путь покупки
Тестовый товар доступен всем API-клиентам. Найдите is_test=true в каталоге и используйте полученный id. Наличие неограниченно: stock=null, stock_unlimited=true, available=true; api_only=true.
Цена единицы — 100 копеек (1 ₽). В USD ответ показывает эквивалент по курсу магазина. Вы получите уникальные вымышленные email | password на example.com; они не дают доступа к реальным аккаунтам. Заказ попадёт в «Мои покупки», историю API и статистику.
- Отправьте обычный POST /orders с ID тестового товара, quantity=1 и max_total_kopeks=100.
- Дождитесь delivered и сохраните delivery_data. При повторе используйте прежний Idempotency-Key.
На сайте готовый сценарий: подтверждение суммы, проверка результата, копирование и скачивание выдачи. API ключ остаётся в памяти вкладки; для восстановления сохраняется только идентификатор операции.
Открыть API тестОдин заказ — один ключ операции
Если ответ не пришёл, повторите исходный POST с тем же Idempotency-Key и параметрами. Новый ключ создаёт новую покупку; изменение параметров прежнего ключа вернёт 409 idempotency_conflict. Выбор другой валюты ответа не создаёт новый заказ.
/api/v1/orders/{id}Если ID уже известен, проверяйте этот заказ через GET не чаще одного раза в 5 секунд.
| Поле / значение | Описание |
|---|---|
processing | Заказ принят и обрабатывается; средства могут быть в резерве. |
recovering | Система автоматически уточняет результат. Дождитесь завершения, не создавайте новую покупку. |
delivered | Покупка завершена. Сумма списана, delivery_data заполнено. |
failed | Покупка отклонена до списания. Причина в failure_code и failure_message. |
refunded | Покупка не выполнена; резерв полностью возвращён на баланс. |
До подтверждения результата система не повторяет покупку и не возвращает резерв. Проверка продолжается после перезапуска. Уже принятые заказы обрабатываются даже при отключении ключа.
История заказов и движение средств
/api/v1/orders?page=1&limit=20API-заказы владельца ключа. Фильтр client_order_id находит заказ по вашей метке. Список не содержит выдачу — запросите заказ по ID.
/api/v1/transactions?page=1&limit=50Все операции по вашему балансу. amount_kopeks со знаком: плюс — зачисление, минус — списание или резерв. Тип purchase_hold меняется на purchase после выдачи; purchase_refund — возврат.
В обоих списках limit — от 1 до 100. Поле has_more показывает, есть ли следующая страница. Для валюты используйте currency=RUB или currency=USD.
Ошибки и лимиты запросов
{
"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. |
503 | API отключён или курс недоступен. При exchange_rate_unavailable можно повторить в RUB с тем же ключом операции. |
Нужна помощь? Напишите в поддержку через бота. Приложите номер заказа и error.code; полный API ключ передавать не нужно.