/v1/accountБаланс, статус доступа и лимиты аккаунта.
Получайте каталог, проверяйте баланс и создавайте заказы из своего магазина или серверной интеграции. Оплата списывается с баланса в Ahlis Shop только после успешного резервирования товара.
https://api.ahlis.shop
X-API-Keyv1От ключа до первого заказа за три шага.
Администратор выдаёт доступ. Ключ создаётся в боте: Профиль → API для реселлеров.
Используйте GET /v1/products и сохраните стабильный sku.
Передайте уникальные external_order_id и Idempotency-Key.
curl "https://api.ahlis.shop/v1/account" \
-H "X-API-Key: YOUR_API_KEY"
import httpx
response = httpx.get(
"https://api.ahlis.shop/v1/account",
headers={"X-API-Key": "YOUR_API_KEY"},
timeout=10,
)
response.raise_for_status()
print(response.json())
const response = await fetch(
"https://api.ahlis.shop/v1/account",
{ headers: { "X-API-Key": "YOUR_API_KEY" } },
);
if (!response.ok) throw new Error(await response.text());
console.log(await response.json());
Важно: API-ключ хранится только на вашем сервере. Не вставляйте его в браузерный JavaScript, публичный репозиторий или логи.
Все защищённые запросы требуют заголовок X-API-Key.
/v1/accountБаланс, статус доступа и лимиты аккаунта.
/v1/productsДоступные товары, цены, остатки и ограничения.
/v1/products/{sku}Актуальная карточка одного товара.
/v1/ordersАтомарная покупка и автоматическая выдача.
/v1/orders/{order_id}Восстановление результата заказа по ID.
/v1/orders?external_order_id=...Поиск по номеру заказа вашей площадки.
/v1/orders/recentПоследние заказы с постраничной загрузкой.
/v1/webhookСостояние, адрес и очередь webhook.
/v1/webhookПодключение подписанных уведомлений.
/v1/webhook/testТестовая доставка в текущий приёмник.
/v1/webhookОтключение webhook и очистка секрета.
Полный контракт данных, который нужен для серверной интеграции.
| Поле | Тип и ограничения | Назначение |
|---|---|---|
external_order_id | строка, 1–128 символов | Постоянный номер заказа в вашей системе. По нему можно восстановить результат. |
sku | строка, до 64 символов | Значение из каталога. Разрешены латинские буквы, цифры, -_. |
quantity | целое, 1–500 | Дополнительно ограничивается лимитом аккаунта и карточкой товара. |
max_unit_price_minor | целое, необязательно | Максимальная допустимая цена одной штуки в копейках. |
Idempotency-Key | уникальный заголовок | Создаётся до запроса и не меняется при повторной отправке того же заказа. |
unit_price_minor, charged_minor и balance_minor передаются в копейках. 8000 = 80 ₽.
itemsКаждый элемент содержит position и content. Сохраните ответ до выдачи клиенту.
GET /v1/orders/recent?limit=50&before_id=.... Для следующей страницы используйте next_before_id.
Если ограничение включено, администратору нужен публичный IP вашего сервера. Без списка доступ не ограничивается по IP.
Текущее значение возвращается как rate_limit_per_minute в GET /v1/account. При 429 учитывайте Retry-After.
Перед покупкой проверяйте цену, available_quantity, min_quantity и max_quantity.
Одна операция резервирует товар, списывает баланс и возвращает данные.
POST /v1/orderscurl "https://api.ahlis.shop/v1/orders" \
-X POST \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Idempotency-Key: client-order-84521" \
-d '{
"external_order_id": "84521",
"sku": "gemini-pro-18m",
"quantity": 2,
"max_unit_price_minor": 8000
}'
201 Created{
"order_id": 4585,
"external_order_id": "84521",
"status": "completed",
"sku": "gemini-pro-18m",
"quantity": 2,
"charged_minor": 16000,
"balance_minor": 74200,
"items": [
{"position": 1, "content": "..."},
{"position": 2, "content": "..."}
],
"idempotency_replayed": false
}
8000 означает 80 ₽. Так исключаются ошибки округления.Правила, которые защищают деньги и товар при повторах и сбоях сети.
Повторяйте запрос с тем же Idempotency-Key. API вернёт исходный заказ и не спишет деньги повторно.
При OUT_OF_STOCK баланс и склад остаются без изменений.
max_unit_price_minor отменяет покупку, если цена стала выше ожидаемой.
После timeout проверьте заказ по внутреннему или внешнему ID перед новым запросом.
Получайте подтверждения заказов и изменения склада без постоянного опроса.
order.completedтовар выдан и баланс списанproduct.stock_changedизменился доступный остатокwebhook.testпроверка приёмникаcurl "https://api.ahlis.shop/v1/webhook" \
-X PUT \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-d '{"url":"https://your-shop.example/webhooks/ahlis"}'
Сохраните signing_secret из первого ответа: повторно он не показывается.
X-Ahlis-Event: order.completed
X-Ahlis-Delivery: evt_...
X-Ahlis-Timestamp: 1789500000
X-Ahlis-Signature: sha256=...
Секрет подписи показывается только при подключении webhook. Проверяйте timestamp, HMAC и идентификатор доставки.
Ориентируйтесь на машинный error.code, а не на текст сообщения.
| HTTP | Код | Что делать |
|---|---|---|
| 401 | INVALID_API_KEY | Проверьте ключ или создайте новый в профиле. |
| 402 | INSUFFICIENT_BALANCE | Пополните баланс; деньги за заказ не списаны. |
| 403 | API_ACCESS_INACTIVE | Обратитесь к администратору магазина. |
| 404 | PRODUCT_UNAVAILABLE | Обновите каталог и не повторяйте покупку вслепую. |
| 409 | OUT_OF_STOCK | Баланс не списан; покажите отсутствие товара. |
| 409 | IDEMPOTENCY_CONFLICT | Используйте новый ключ для другого состава заказа. |
| 409 | PRICE_CHANGED | Получите новую цену и подтвердите её. |
| 429 | RATE_LIMITED | Подождите время из Retry-After. |
| 500 | INTERNAL_ERROR | Повторите тот же запрос с тем же idempotency key. |
{
"error": {
"code": "OUT_OF_STOCK",
"message": "Not enough stock.",
"request_id": "...",
"retryable": false,
"details": {}
}
}
Публичным остаётся только HTTPS-вход; база и внутренний API недоступны из интернета.