Finance OS / API

Introduction

Finance OS API - это REST-интерфейс к финансовой платформе Finance OS для внешних партнёров. Через него мерчант ведёт своих конечных клиентов, выдаёт им крипто-кошельки, принимает и выплачивает средства, проверяет адреса на комплаенс и принимает рублёвые платежи - всё под одним секретным ключом.

С чего начать
Если вы здесь впервые - переходите к Authentication, получайте секретный ключ и пробуйте свой первый GET /api/v1/merchant/balance.

Принципы API

  • REST — стандартная семантика: GET для чтения, POST для создания, PATCH для обновления, DELETE для удаления.
  • JSON — тела запросов и ответов всегда в JSON. Обязательные заголовки: Content-Type: application/json, Accept: application/json.
  • HTTPS-only — обычный HTTP отклоняется на уровне nginx.
  • Bearer-auth - все приватные endpoints требуют Authorization: Bearer {sk_live_…}: секретный API-ключ учётной записи, выданный в кабинете. Ключ sk_test_… адресует песочницу. Детали - в разделе Authentication.
  • UTF-8 — все строки, включая поля адресов и комментариев на кириллице.

Базовый URL

Production:

https://fin-os.io/api/v1

Версия зафиксирована в пути: /api/v1/…. Пути в этой документации указываются целиком, вместе с префиксом. Ломающие изменения выйдут новым major-префиксом, старый продолжит работать до объявленного срока снятия.

Окружение выбирает ключ
Один и тот же путь ведёт и в бой, и в песочницу - разница только в префиксе ключа: sk_live_… двигает реальные деньги, sk_test_… - нет. Проверьте, каким ключом ходит ваш сервис, прежде чем запускать выводы.

Формат данных

Соглашения по типам

string UTF-8 string optional
Кириллица и эмодзи разрешены, RTL не поддерживается.
integer int64 optional
Идентификаторы и счётчики.
decimal string optional
Только строкой с точкой как разделителем: "1234.56789012". Никогда не float — потеря точности.
uuid string optional
UUID v4: 5f8d…. Используется как первичный ключ для большинства публичных ресурсов.
timestamp string (ISO-8601, UTC) optional
2026-05-27T14:23:00Z. Локальная зона клиента — забота клиента.
currency string (ISO-4217 или ticker) optional
RUB, USD, USDT, BTC, KAS, LTC.
network enum optional
TRC20, ERC20, BEP20, BTC, LTC, KAS, SOL, TON.

Форма ответа

Все успешные ответы имеют единую обёртку:

{
  "data": { ... },
  "meta": { ... }
}

Для списков с пагинацией добавляются поля links и meta.current_page / last_page / per_page / total — детально в Pagination.

Ошибки

Ошибки возвращают HTTP-статус из семейства 4xx/5xx и тело вида:

{
  "message": "The given data was invalid.",
  "errors": {
    "email": ["The email field is required."]
  }
}

Полный справочник кодов и форматов — в Errors.

Лимиты

По умолчанию: 60 запросов в минуту на ключ, 10 на IP для неавторизованных публичных endpoints. Превышение → 429 Too Many Requests. Заголовки X-RateLimit-Limit, X-RateLimit-Remaining, Retry-After - в каждом ответе. Подробнее в Rate Limiting.

Поддержка

Технические вопросы: admin@fin-os.io. Об авариях и плановых работах мы оповещаем через статус-страницу (планируется в v1.1).

Примеры кода

# Первый запрос: остаток мастер-счёта
curl -X GET https://fin-os.io/api/v1/merchant/balance \
  -H "Authorization: Bearer ${TOKEN}" \
  -H "Accept: application/json"
// JavaScript fetch
const TOKEN = process.env.FINOS_SECRET_KEY; // sk_live_xxx из .env

const res = await fetch('https://fin-os.io/api/v1/merchant/balance', {
  headers: {
    'Authorization': `Bearer ${TOKEN}`,
    'Accept': 'application/json',
  },
});
const balance = await res.json();
console.log(balance.data);
// PHP (Laravel HTTP)
$response = Http::withToken($token)
    ->acceptJson()
    ->get('https://fin-os.io/api/v1/merchant/balance');

$balance = $response->json('data');
import requests

TOKEN = os.environ['FINOS_SECRET_KEY']  # sk_live_xxx

r = requests.get(
    'https://fin-os.io/api/v1/merchant/balance',
    headers={
        'Authorization': f'Bearer {TOKEN}',
        'Accept': 'application/json',
    },
)
balance = r.json()['data']