Руководство по интеграции Bet-Flow

Merchant API v2 · Base URL: https://api.bet-flow.com/v1

1. Быстрый старт

  1. Войдите в личный кабинет → Интеграция
  2. Сгенерируйте API-ключи (секрет показывается один раз — сохраните)
  3. Укажите Callback URL (HTTPS)
  4. Добавьте IP whitelist — egress IP ваших серверов
  5. Реализуйте подпись запросов и проверку webhook
  6. Нажмите «Тест» для проверки webhook

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

ТребованиеОписание
HTTPSВсе запросы только по TLS
HMAC-SHA256Подпись каждого запроса секретным ключом
ExpiresUnix timestamp, рекомендуется now + 300 сек
X-NonceUUID на каждый запрос, без повторов (5 мин)
Rate limit120 req/min на API-ключ
WebhookПроверка X-Signature = HMAC-SHA256(secret, raw body)
IP whitelistЕсли задан в ЛК — только указанные IP/CIDR
SecretТолько на backend, ротация при утечке

3. Подпись запроса

Заголовки:

X-API-Key: <public_key>
Expires: <unix_seconds>
X-API-Sign: <hmac_hex>
X-Nonce: <uuid>
Content-Type: application/json
message = Expires + json_body   # POST
message = Expires + query_string # GET
X-API-Sign = hex(HMAC-SHA256(secret, message))

4. Webhook (от Bet-Flow к вам)

{
  "order_id": "0199ee07-dffa-754c-ba2e-c28c2b2ea15a",
  "merchant_order_id": "order-42",
  "status": "success",
  "amount": "1000.00",
  "currency": "RUB",
  "timestamp": 1760635122
}

Проверка: X-Signature = hex(HMAC-SHA256(secret, raw_body)). Ответьте HTTP 200.

5. Основные эндпоинты

МетодПутьОписание
POST/v1/payinСоздать PayIn
GET/v1/payin?id=Статус PayIn
POST/v1/payoutСоздать PayOut
GET/v1/payout?id=Статус PayOut
GET/v1/balancesБаланс
GET/v1/dictionaries/banksБанки
GET/v1/dictionaries/currenciesВалюты
GET/v1/dictionaries/commissionsКомиссии

6. Примеры кода

Python examples/sign.py
Node.js examples/sign.js

Python (создание PayIn)

import hashlib, hmac, json, time, uuid, requests

def sign(body):
    exp = str(int(time.time()) + 300)
    payload = json.dumps(body, separators=(",", ":"))
    sig = hmac.new(SECRET.encode(), (exp + payload).encode(), hashlib.sha256).hexdigest()
    return {"X-API-Key": API_KEY, "Expires": exp, "X-API-Sign": sig,
            "X-Nonce": str(uuid.uuid4()), "Content-Type": "application/json"}

body = {"externalID": "order-42", "currency": "RUB", "amount": "1000", "type": "card"}
requests.post("https://api.bet-flow.com/v1/payin", json=body, headers=sign(body))

7. Legacy API

Для старых интеграций: POST /v1/payment, GET /v1/account/*. Новые проекты — только v2.

Полная спецификация: OpenAPI / Redoc · Markdown: INTEGRATION.md