Fiatside

Developers

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

API, возвращающая ту же детализацию комиссий, что и сайт, построчно, без скрытой маржи. Эта страница описывает соглашения, общие для всех конечных точек, и точно указывает, что открыто сегодня.

Что открыто сегодня

Конечная точка 1 фактически доступна и вызываема: котирование. Остальные 5 опубликованы как контракт, чтобы вы могли создавать интеграцию до их открытия, и каждая имеет явный значок.

Мы документируем заранее, потому что это помогает интеграции. Заставлять вас думать, что что-то подключено, было бы нечестно: каждая конечная точка указывает свой статус, а примеры ответов для открытых конечных точек — это реально полученные ответы, а не макеты.

01

Базовый URL и версионирование

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

Сегодня
/api Live
Версионированный API
/api/v1 Published contract, not open

Версия находится в пути, а не в заголовке: URL должен пережить вставку в тикет. Критическое изменение — удалённое поле, изменённый тип, другая семантика — открывает новую версию; предыдущая продолжает обслуживаться как минимум шесть месяцев, с датой её окончания, объявленной в журнале изменений. Добавление поля не является критическим: ваш клиент должен игнорировать неизвестные ему поля.

02

Соглашения

Они действуют для каждой конечной точки, открытой или предстоящей. Большинство из них существуют по одной причине: никогда не потерять ни цента при передаче.

Суммы — это строки или целые числа в младших единицах

Никогда не число с плавающей запятой. В JSON 0.1 + 0.2 — это не 0.3, а большая сумма теряет младшие единицы при сериализации. Поэтому суммы в основных единицах отправляются как строки, а внутренние суммы — как целые числа в младших единицах с указанием количества десятичных знаков.

{
  "net": "912.28",
  "currency": "EUR",
  "currencyDecimals": 2
}

Количество десятичных знаков зависит от валюты

У евро два десятичных знака, у франка КФА и вьетнамского донга их нет. Не зашивайте «× 100»: читайте currencyDecimals или поле decimals из справочных данных.

{ "amount": "125000", "currency": "XOF", "currencyDecimals": 0 }

Суммы в криптовалюте указываются в базовых единицах

Депозит возвращается с указанием количества десятичных знаков: 8 для биткоина, 6 для USDT, 18 для эфира. Один и тот же тикер может существовать с разным количеством десятичных знаков в зависимости от сети: доверяйте полю, а не своей памяти.

{ "deposit": { "amount": "1000.000000", "ticker": "USDT", "decimals": 6 } }

Метки времени

Даты указаны в формате ISO 8601 UTC. Одно намеренное исключение: rateAsOf — это метка времени Unix в миллисекундах, поскольку она используется для вычисления возраста, а не для отображения. Она содержит дату рыночных ДАННЫХ, а не вашего запроса: это различие позволяет обнаружить устаревшую цену.

{ "rateAsOf": 1788356981608, "rateSource": "coingecko" }

Идентификаторы стабильны

Идентификатор актива, платёжного канала или страны никогда не меняется и не переназначается. Закрытый канал сохраняет свой идентификатор с указанием фазы и причины: ваша интеграция может увидеть, почему он исчез из ваших опций, а не обнаружить пустоту.

Сообщения для пользователей двуязычны

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

{ "reason": { "fr": "…", "en": "…" } }
03

Первый вызов

Для котирования ключ не нужен. Этот вызов работает как есть.

Запрос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
}

Поле rateSource указывает, откуда взялась цена. Значение «mock» — это детерминированный источник для разработки, который не может запуститься в производстве: процесс отказывается запускаться, а не котирует замороженные цены.

04

Разделы

05

Чего API не будет делать

Ограничения API так же полезно знать, как и его возможности.

  • Никаких сторонних выплат. Имя получателя должно совпадать с проверенной личностью владельца заказа, а платёжные каналы теперь проверяют имя по счёту.
  • Никакого создания аккаунта или проверки личности через API. Эти шаги выполняются в процессе, где пользователь видит, на что соглашается.
  • Никаких ключей в параметрах URL. URL-адреса попадают в журналы, заголовки referrer и историю: ключ, переданный таким образом, — это ключ, который нужно отозвать.
  • Никакого кэширования котировки на нашей стороне. Ответ содержит Cache-Control: no-store, и ваша интеграция не должна обходить это: кэшированная котировка — это устаревшая цена, представленная как твёрдая.
  • Никакой конечной точки покупки криптовалюты. Сервис работает в одном направлении: цифровой актив в фиатную валюту.