Fiatside

Developers

Котирование операции

Котирование — единственная конечная точка, открытая сегодня, и самая важная: она возвращает построчную разбивку, которую отображает сайт. Ей не нужен ключ.

POST/api/quoteLive

Цитировать операцию

Возвращает полную разбивку продажи: использованный межбанковский курс, каждую комиссию отдельной строкой, чистую сумму и фактический курс, реально полученный. Строки в сумме дают ровно разницу между брутто и нетто — инвариант проверяется до отправки ответа, и несбалансированный ответ никогда не возвращается.

Аутентификация: сегодня нет. Эндпоинт котировок открыт: котировка не раскрывает личных данных.

Параметры

Параметры
ПолеТипОписание
assetIdобязательныйstringИдентификатор депонируемого актива, например «btc», «usdt», «sol».
railIdобязательныйstringИдентификатор способа выплаты, например «sepa_instant», «br_pix», «ke_mpesa».
networkIdstringСеть депозита. Необязательно: по умолчанию используется первая сеть актива. Стоимость сети сильно различается между сетями, поэтому это поле меняет чистую сумму.
directionобязательный"sell" | "receive"Направление ввода. «sell»: сумма — это то, что вы депонируете. «receive»: сумма — это то, что вы хотите получить, и требуемый депозит определяется бинарным поиском.
amountобязательныйstringСумма в основных единицах, отправляется как СТРОКА. JSON float потерял бы младшие единицы на больших суммах: строка — единственный формат, в котором клиент и сервер сходятся до цента.
Запросbash
curl -sS -X POST https://fiatside.com/api/quote \
  -H 'Content-Type: application/json' \
  -d '{
    "assetId": "usdt",
    "railId": "sepa_instant",
    "networkId": "tron",
    "direction": "sell",
    "amount": "1000"
  }'
Ответ — реальный примерjson
{
  "deposit": { "amount": "1000.000000", "ticker": "USDT", "decimals": 6 },
  "gross": "921.68",
  "net": "912.28",
  "currency": "EUR",
  "currencyDecimals": 2,
  "midRate": "0.92168430",
  "effectiveRate": "0.91228000",
  "totalCostBps": 102,
  "lines": [
    { "code": "network", "amount": "1.11", "basis": "Cout reseau tron, preleve en USDT" },
    { "code": "spread",  "amount": "8.29", "basis": "0.90 % du montant converti" }
  ],
  "settlement": { "p50Minutes": 1, "p95Minutes": 12 },
  "lockSeconds": 1800,
  "rateAsOf": 1788356981608,
  "rateSource": "mock",
  "limitError": null
}
  • Ответ содержит Cache-Control: no-store. Кэшированная котировка — это устаревшая цена, поданная как твердая.
  • Нарушение лимита канала — не ошибка HTTP: котировка возвращается с объектом limitError, содержащим код below_min или above_max и точный лимит, чтобы ваш интерфейс мог показать правильное сообщение без второго вызова.
  • rateSource указывает, откуда взялась цена. Значение «mock» — это детерминированный источник для разработки: он не может запуститься в продакшене, где процесс отказывается запускаться, а не котирует замороженные цены.

Возможные ошибки: invalid_request, unknown_asset_or_rail, rail_not_open, asset_not_offered, invalid_amount, rate_stale, rate_unavailable, quote_failed. Полный каталог

01

Чтение разбивки

Массив lines содержит одну запись на каждый реальный сбор. Нулевая строка не возвращается: показ «комиссия канала: 0.00» ничего не добавляет и загромождает интерфейс.

Чтение разбивки
codeКто её получаетЧто это
networkСеть блокчейнаСтоимость перемещения актива, взимаемая в натуральной форме с депозита до конвертации. Она варьируется в зависимости от выбранной сети, иногда в широких пределах: именно поэтому networkId меняет чистую сумму.
spreadМыНаша маржа, выраженная в процентах от конвертированной суммы. Это единственная строка, которая является нашим доходом.
railПлатёжный институтКомиссия метода выплаты, фиксированная, пропорциональная или обе. Отсутствует, когда канал не взимает ничего, что характерно для большинства открытых каналов.
fxОбмен валютСтрока, зарезервированная для явного спреда обмена, когда происходит дополнительная конвертация. Она не появляется на коридорах, где валюта канала является валютой котировки.

Инвариант, делающий таблицу проверяемой

gross минус сумма строк равна net точно, до младшей единицы. Это равенство проверяется для каждой котировки перед отправкой ответа; если оно не сходится, где-то существует незадекларированная маржа, и движок вызывает ошибку, а не возвращает её. Вы можете пересчитать арифметику: в этом суть.

02

Пример с комиссией за перевод

Та же сумма через канал, который взимает плату за отправку, выводит третью строку. Реальный ответ, полученный на детерминированном источнике разработки.

Запросbash
curl -sS -X POST https://fiatside.com/api/quote \
  -H 'Content-Type: application/json' \
  -d '{
    "assetId": "usdt",
    "railId": "ke_mpesa",
    "networkId": "tron",
    "direction": "sell",
    "amount": "1000"
  }'
Ответ — реальный примерjson
{
  "gross": "129525.90",
  "net": "128141.44",
  "currency": "KES",
  "totalCostBps": 107,
  "lines": [
    { "code": "network", "amount": "155.44", "basis": "Cout reseau tron, preleve en USDT" },
    { "code": "spread",  "amount": "582.17", "basis": "0.45 % du montant converti" },
    { "code": "rail",    "amount": "646.85", "basis": "0.50 % du montant converti" }
  ],
  "settlement": { "p50Minutes": 2, "p95Minutes": 45 },
  "limitError": null
}

Три строки, три разных получателя: сеть, мы, платежная организация. Поле totalCostBps дает общую разницу от среднерыночного курса в базисных пунктах — единственное число, которое стоит сравнивать между сервисами, потому что оно покрывает все, включая то, что иначе скрывалось бы внутри курса.

03

Лимиты каналов

Сумма вне границ канала не вызывает ошибку HTTP: котировка возвращается с объектом limitError. Ваш интерфейс может показать сумму И точную причину без второго вызова.

Фрагмент ответа — реальный примерjson
{
  "net": "3.47",
  "currency": "EUR",
  "limitError": { "code": "below_min", "limit": "20.00" }
}

Возможные значения: below_min и above_max, а limit содержит границу в основных единицах валюты канала. Примечание: граница применяется к ЧИСТОЙ сумме, а не к депозиту — то, что получает бенефициар, должно укладываться в лимиты канала.

04

Окно действия

Поле lockSeconds указывает, как долго курс будет зафиксирован после создания ордера. Это зависит от актива: дольше для стейблкоина, короче для волатильного.

  • Сама котировка не является твердой: она ориентировочна до создания ордера. Курс фиксируется при создании ордера, а не при запросе котировки.
  • Окно покрывает ваше решение, а не время подтверждения сетью. Депозит в биткоинах может требовать часа подтверждений: фиксация защищает от движения рынка, пока вы решаете и вносите депозит.
  • Если депозит поступает после истечения срока, ордер перекотируется, и новая сумма должна быть принята. Молчаливое изменение цены против клиента невозможно по построению.
  • Не кэшируйте котировку, чтобы скрыть ошибку устаревшего курса. Кэшированная котировка — это устаревшая цена, представленная как твердая, что является именно той проблемой, которую предотвращает код отказа.