apihub

Площадка полного цикла для API

Вы приносите работающий сервис.
Всё остальное берём на себя.

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

0 ppm

расхождение в сверке

На прогоне в миллион вызовов. Сверка считает период заново, независимым запросом, и сравнивает с книгой.

4 мс

накладные расходы шлюза, p99

Всё, что платформа добавляет к вашему времени ответа: ключ, квота, метрика.

739 мс

от «нашёл API» до рабочего кода

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

12 с

до сигнала об утечке ключа

От первого чужого вызова до придержания ключа и уведомления владельцу.

1

Потребитель зовёт по одному адресу

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

2

Шлюз проверяет, считает и записывает

Ключ, тариф, квота, частота — и запись о вызове с его собственным идентификатором. Всё вместе стоит 4 мс на девяносто девятом перцентиле; это и есть цена того, что между вами кто-то стоит.

3

Из записей вырастает остальное

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

Публичный каталог — только один из каналов. API можно держать закрытым и выдавать доступ поимённо, можно открыть партнёрам, можно опубликовать для всех: видимость выбирает провайдер, и от неё зависит модель денег.

Деньги считаются один раз и проверяются другим способом

Целые копейки, двойная запись, неизменяемые проводки. Раз в сутки независимая сверка пересчитывает период заново — и если сойтись не удалось, счёт не выставляется, пока не разберёмся. Округление всегда в пользу того, кто платит.

0 ppm на миллионе вызовов

Показатели считаем мы, и провайдер на них не влияет

Аптайм, задержка, доля ошибок — из наших собственных проб и нашего же журнала. Скрыть их нельзя, накрутить нечем. Рядом честно написано, из скольких точек мы смотрим: пока из одной.

наблюдение из одной точки, и это написано

Отладка вместо переписки

Спор «ваш API не работает» — «вы шлёте неверный запрос» кончается за полминуты: в трассе видно тело запроса, тело ответа и время по стадиям — ключ, квота, апстрим и наша собственная работа отдельной цифрой.

тело запроса, тело ответа, время по стадиям

Обновление, которое не ломает чужой код

Новая версия спецификации сравнивается со старой по смыслу. Пропало поле из ответа или появился обязательный параметр — выпуск под минорной версией не пройдёт, а подписчики получат отдельное предупреждение.

сравнение спецификаций по смыслу, а не по тексту

Как устроены деньги

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

  • Каждый вызов через шлюз порождает событие с идентификатором запроса. Начисление идёт от этих событий, повтор события безвреден: ключ идемпотентности не даст провести операцию дважды.
  • Учёт двойной записью: у каждой операции сумма проводок равна нулю, и это проверяет база, а не приложение. Записи неизменяемы — исправление это обратная операция, а не правка.
  • Раз в сутки идёт сверка: она пересчитывает период заново, независимым запросом, и сравнивает с книгой. Расхождение больше нуля — повод не выставлять счёт, а разбираться.
  • Не тарифицируется то, за что провайдер не работал: отказ на нашей стороне, пятисотка апстрима, ответ из мока. Ошибка в запросе потребителя (4xx) считается — апстрим её обработал.

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

Что мы измеряем и показываем

Показатели в карточке API считаем мы, и провайдер на них не влияет — иначе они не значили бы ничего. Раздел «наши замеры» стоит отдельно от общей статистики: это то, что площадка проверила сама, своими пробами.

  • Перцентили задержки берутся границей корзины гистограммы, а не интерполяцией внутри неё: интерполяция выглядит точнее, но точность была бы выдуманной.
  • Наблюдение из одной точки, и подписано это честно. Карта из нескольких регионов требует нескольких машин, которых у нас пока нет.
  • «Данных мало» — отдельный статус, а не пустое место: молчание читалось бы как «плохо».
  • Сброс наблюдения возможен только при выпуске новой версии API. Факт выпуска мы видим сами, верить на слово не нужно.

Что мы храним, а что нет

Заголовки и тела запросов записываются, только если провайдер включил захват. По умолчанию он выключен — это единственное место, где «выключено» и есть правильное значение по умолчанию: включённый захват означал бы, что площадка начала хранить данные клиентов провайдера, никого не спросив.

  • Заголовки авторизации вырезаются всегда и никогда не попадают в запись. Провайдер может добавить свои поля к вырезаемым — вырезание идёт до записи, а не при показе.
  • Тела сжимаются и шифруются, именно в таком порядке: шифротекст неотличим от случайных байтов, а те не сжимаются.
  • Срок хранения задаёт провайдер в тарифе — от часа до года, — и проставляется он в момент записи. По умолчанию час: молча увеличить его значило бы решить за провайдера, сколько хранить чужие данные. Смена тарифа задним числом уже записанное не трогает.
  • Ключ API мы не храним — только его отпечаток. Показать ключ второй раз невозможно, и в экспорте команды curl он не подставляется: сказать об этом честнее, чем вставить заглушку.

Чего мы не делаем

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

  • Собственные сервисы площадки помечены в каталоге как наши. Мы ведём каталог, в котором конкурируем с теми, кого в него пускаем; цена для потребителя у них такая же, но знать, чей это сервис, он должен до выбора, а не после.
  • Не сравниваем свои цены с прямыми ценами провайдеров. Назвать такую цену может только сам провайдер, а он не введёт число, которое покажет нас дороже. Калькулятор сравнивает тарифы внутри площадки, и на странице это сказано.
  • Не наблюдаем из нескольких регионов — пока одна точка.
  • Не публикуем сгенерированные SDK в npm и PyPI: клиент можно скачать архивом.
  • Не проксируем gRPC. SSE и WebSocket — в работе.
  • Не храним ключи в отдельном хранилище секретов: они лежат зашифрованными рядом с базой. Это закрывает утечку дампа и реплики, но не того, кто уже внутри.

Попробовать можно прямо сейчас

Публичный API в каталоге отвечает на моке — без ключа и без регистрации. Понравится формат ответа — заведёте ключ и повторите тот же вызов на настоящем сервисе.