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

API SimCapital

Пополнение номеров телефона и оплата СБП QR-кодов через баланс аккаунта

Базовый URL: https://simcapital.su
🔑
Аутентификация
Передавайте api_key в теле каждого запроса. Ключ — в личном кабинете бота.
Rate limit
4 запроса / сек с одного IP. При превышении — 429 Too many requests.
Статус ордера: 0 — в обработке 1 — успешно 2 — ошибка (баланс возвращён)
Пополнение SIM
POST /sim_top_up

Пополнение номера телефона. Баланс списывается атомарно, платёж идёт в фоне — ответ с order_id приходит сразу. Итоговый статус проверяйте через /get_order.

Тело запроса
// POST https://simcapital.su/sim_top_up { "api_key": "ваш-api-ключ", "phone": "79991234567", // 11 цифр, начинается с 7 "amount_rub": 100 // целое, 50–15 000 }
Параметры
ПолеТипОписание
api_keystringКлюч API
phonestringНомер, 11 цифр, начинается с 7
amount_rubintСумма в рублях (50–15 000)
Успешный ответ
{ "status": 0, "order_id": 123, "phone": "79991234567", "amount_rub": 100, "balance": 9900 // остаток после списания }
Ошибки
400"Invalid API key"
400"phone must be 11 digits starting with 7"
400"Min amount_rub is 50"
400"Max amount_rub is 15000"
400"Insufficient balance"
429"Too many requests"
Оплата QR-кода
POST /pay_qr

Оплата СБП QR-кода. Перед вызовом самостоятельно декодируйте изображение QR любой библиотекой и получите строку вида https://qr.nspk.ru/… — её и передавайте в qr_url. Если сумма уже зашита в QR — amount_rub не нужен.

Тело запроса
// POST https://simcapital.su/pay_qr { "api_key": "ваш-api-ключ", "qr_url": "https://qr.nspk.ru/AS1...", "amount_rub": 500 // опционально — если в QR нет суммы }
Параметры
ПолеТипОписание
api_keystringКлюч API
qr_urlstringДекодированный URL из QR-кода
amount_rubintОпционально. Сумма в рублях, если в QR нет фиксированной (50–15 000)
Успешный ответ
{ "status": 0, "order_id": 456, "amount_rub": 500, // null — если QR содержит сумму (определится при оплате) "balance": 9400 }
Ошибки
400"Invalid API key"
400"qr_url is required"
400"Min amount_rub is 50"
400"Insufficient balance"
429"Too many requests"
Перевод по СБП
Ручная обработка. Платёж выполняется администратором вручную — статус ордера обновится после подтверждения. Среднее время обработки: от нескольких минут до нескольких часов. При отмене — баланс возвращается автоматически.
POST /spb_transfer

Перевод на банковский счёт получателя через СБП. Баланс списывается сразу, ордер передаётся администратору на исполнение. Итог проверяйте через /get_order.

Тело запроса
// POST https://simcapital.su/spb_transfer { "api_key": "ваш-api-ключ", "phone": "79991234567", // номер получателя, 11 цифр, начинается с 7 "bank_name": "Сбербанк", // название банка получателя "full_name": "Иван Иванов", // ФИО получателя "amount_rub": 5000 // целое, 1 500–99 999 }
Параметры
ПолеТипОписание
api_keystringКлюч API
phonestringНомер получателя, 11 цифр, начинается с 7
bank_namestringНазвание банка получателя (например: "Сбербанк", "Т-Банк")
full_namestringФИО получателя
amount_rubintСумма в рублях (1 500–99 999)
Успешный ответ
{ "status": 0, "order_id": 789, "phone": "79991234567", "bank_name": "Сбербанк", "full_name": "Иван Иванов", "amount_rub": 5000, "balance": 4900 }
Статус при опросе /get_order
{ "order_id": 789, "type": "spb", "order_status": 0, // 0 — ожидает исполнения, 1 — выполнен, 2 — отменён "phone": "79991234567", "amount_rub": 5000, "date": "2025-08-01 15:00:00" }
Ошибки
400"Invalid API key"
400"phone must be 11 digits starting with 7"
400"bank_name is required"
400"full_name is required"
400"Min amount_rub is 1500"
400"Max amount_rub is 99999"
400"Insufficient balance"
429"Too many requests"
Декодирование QR-изображений
Для /pay_qr нужна текстовая строка из QR, а не само изображение. Декодируйте его на своей стороне перед вызовом.
Вариант 1 — Node.js
@zxing/library — большинство QR-кодов, кроме сложных Сберовских
npm install @zxing/library jpeg-js
import { BinaryBitmap, HybridBinarizer, QRCodeReader, RGBLuminanceSource } from '@zxing/library'; import * as jpeg from 'jpeg-js'; function decodeQr(jpgData: Buffer): string | null { const raw = jpeg.decode(jpgData, { useTArray: true, formatAsRGBA: false }); const len = raw.width * raw.height; const lum = new Uint8ClampedArray(len); for (let i = 0; i < len; i++) lum[i] = (raw.data[i*3] + raw.data[i*3+1]*2 + raw.data[i*3+2]) / 4 & 0xff; const src = new RGBLuminanceSource(lum, raw.width, raw.height); try { return new QRCodeReader() .decode(new BinaryBitmap(new HybridBinarizer(src))).getText(); } catch { return null; } }
Вариант 2 — Python микросервис
qreader — Сберовские QR и сложные условия съёмки
pip install qreader flask waitress pillow
# Запустите как отдельный сервис на порту 5531 from flask import Flask, request, jsonify from qreader import QReader from PIL import Image import numpy as np app = Flask(__name__) qreader = QReader() @app.route('/scanqr', methods=['POST']) def scan_qr(): image_file = request.files.get('image') if not image_file: return jsonify({'error': 'No image'}), 400 img = Image.open(image_file).convert('RGB') results = qreader.detect_and_decode(image=np.array(img)) return jsonify({'qr_codes': results}) if results else (jsonify({}), 404) if __name__ == '__main__': from waitress import serve serve(app, host='127.0.0.1', port=5531)
Вызов из Node.js
async function decodeQrRemote(photo: Buffer): Promise<string | null> { const form = new FormData(); form.append('image', photo, 'image.jpg'); try { const res = await axios.post('http://127.0.0.1:5531/scanqr', form); return res.data?.qr_codes?.[0] ?? null; } catch { return null; } }
Статус ордера
GET /get_order

Статус ордера — для sim_top_up и pay_qr. Опрашивайте раз в 5–10 сек, пока order_status не станет 1 или 2. Обычно платёж обрабатывается до 30 сек, в редких случаях — до 10 минут.

Тело запроса
// GET https://simcapital.su/get_order { "api_key": "ваш-api-ключ", "order_id": 123 }
Ответ — sim_top_up
{ "status": 0, "order_id": 123, "type": "sim", "order_status": 1, // 0 — в обработке, 1 — ок, 2 — ошибка "phone": "79991234567", "amount_rub": 100, "date": "2025-08-01 14:30:00" }
Ответ — pay_qr
{ "status": 0, "order_id": 456, "type": "qr", "order_status": 1, "amount_rub": 500, "date": "2025-08-01 14:32:00" }
При ошибке (order_status: 2)
{ "order_status": 2, "error": "причина ошибки", ... } // При order_status = 2 баланс автоматически возвращается
Ошибки
400"Invalid API key"
400"Order not found"
400"Not your order"
429"Too many requests"
Формат всех ответов

Каждый ответ содержит status: 0 — запрос принят, 1 — ошибка. Не путайте с order_status — это статус HTTP-запроса, не платежа.

// Ошибка (HTTP 400 / 429) { "status": 1, "error": "текст ошибки" } // Успех (HTTP 200) { "status": 0, /* ... поля ответа */ }
🔒 Надёжно Быстро 24/7