API · v1

Документация API

REST API для приёма платежей. Один POST-запрос — и клиент уходит на страницу оплаты. Вебхуки с подписью HMAC-SHA256.

Быстрый старт

Подключение занимает пять минут:

  1. Зарегистрируйтесь в @MefosPayBot и дождитесь активации.
  2. Откройте «Профиль» — там ваш api_key и api_secret.
  3. Создайте первый платёж через POST-запрос.
  4. Перенаправьте клиента на полученный payment_link.
Совет: для первых тестов включите тестовый режим — платежи создаются мгновенно, без реальных денег.

Авторизация

Все API-запросы требуют заголовок X-API-Key:

HTTPX-API-Key: your_api_key_here
Content-Type: application/json

api_secret в запросах не используется — он нужен только для проверки подписи вебхуков.

Никогда не публикуйте api_secret в клиентском коде (JS, мобильные приложения). Храните его только на сервере.

Base URL

Все запросы идут на:

https://pay.mefos.mom/api/v1

POST/api/v1/payments

Создаёт новый платёж. Возвращает ссылку на страницу оплаты.

Тело запроса

ПолеТипОписание
amountfloatСумма к получению (UAH). Минимум 100, максимум — max_payment
order_idstringВаш ID заказа. Только A-Z a-z 0-9 _ -, до 64 символов
currencystringВалюта. По умолчанию UAH
descriptionstringОпционально. Описание для клиента
testboolОпционально. Тестовый платёж

Пример запроса

cURLcurl -X POST https://pay.mefos.mom/api/v1/payments \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 500,
    "order_id": "order_123",
    "description": "Подписка на месяц"
  }'

Ответ · 201

JSON{
  "payment_id": 42,
  "order_id": "order_123",
  "status": "waiting",
  "amount": 500.0,
  "client_amount": 561.80,
  "currency": "UAH",
  "payment_link": "https://pay.snova.me/...",
  "test": false
}

Пример на Python

Pythonimport requests

r = requests.post(
    "https://pay.mefos.mom/api/v1/payments",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={"amount": 500, "order_id": "order_123"},
)
print(r.json()["payment_link"])

GET/api/v1/payments/{order_id}

Возвращает статус платежа по order_id.

cURLcurl https://pay.mefos.mom/api/v1/payments/order_123 \
  -H "X-API-Key: YOUR_API_KEY"

Ответ · 200

{
  "id": 42,
  "order_id": "order_123",
  "status": "success",
  "amount": 500.0,
  "client_amount": 561.80,
  "paid_at": "2026-10-08T14:22:00+00:00",
  "test": false
}

Статусы платежа

СтатусЗначение
pendingПлатёж создаётся
waitingЖдём оплату от клиента
successОплачен, деньги зачислены
failedПлатёж не прошёл
canceledОтменён клиентом
expiredИстёк срок оплаты

Вебхуки

Когда клиент оплачивает, мы отправляем POST-запрос на ваш webhook_url. Указать URL можно в настройках бота.

Событие payment.success

JSON{
  "event": "payment.success",
  "payment_id": 42,
  "order_id": "order_123",
  "amount": 561.80,
  "commission": 61.80,
  "commission_percent": 11.0,
  "credited": 11.66,
  "currency": "UAH",
  "status": "success",
  "paid_at": "2026-10-08T14:22:00+00:00"
}

Заголовки

X-Signature: hmac_sha256_hex_signature
Content-Type: application/json

Проверка подписи

Никогда не доверяйте вебхуку без проверки подписи. Без неё злоумышленник сможет подделать платёж.

Подпись = HMAC_SHA256(api_secret, raw_body), где raw_body — сырое тело запроса.

Python · FastAPI

Pythonimport hmac, hashlib
from fastapi import Request, HTTPException

@app.post("/webhook")
async def hook(request: Request):
    sig = request.headers.get("X-Signature", "")
    body = await request.body()
    expected = hmac.new(
        API_SECRET.encode(), body, hashlib.sha256
    ).hexdigest()
    if not hmac.compare_digest(sig, expected):
        raise HTTPException(401, "invalid signature")

    data = await request.json()
    return {"ok": True}

PHP

PHP$body = file_get_contents("php://input");
$sig = $_SERVER["HTTP_X_SIGNATURE"] ?? "";
$expected = hash_hmac("sha256", $body, API_SECRET);

if (!hash_equals($expected, $sig)) {
    http_response_code(401);
    exit("invalid signature");
}
echo "ok";

Node.js · Express

Nodeconst crypto = require("crypto");

app.post("/webhook", express.raw({ type: "*/*" }), (req, res) => {
  const sig = req.headers["x-signature"] || "";
  const expected = crypto
    .createHmac("sha256", process.env.API_SECRET)
    .update(req.body)
    .digest("hex");
  if (sig !== expected) return res.status(401).send("bad sig");
  const data = JSON.parse(req.body.toString());
  res.send("ok");
});

Коды ошибок

КодЗначениеЧто делать
400Некорректный запросПроверить amount, order_id
401Неверный ключПроверить X-API-Key
403Не активированНаписать в поддержку
404Не найденПроверить order_id
429Rate limit60 запросов в минуту
502Провайдер упалПовторить через 30 сек

Лимиты