Atlorium

Подписка, пакет или поштучно: что дешевле, когда спрос скачет

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

12 минут чтения финансовый директор · технический директор · закупки · продакт-менеджер

В марте компания переезжала на новую CRM. За две недели через проверку адресов прошла вся накопленная база — двенадцать с лишним тысяч строк. В апреле пришло сто восемьдесят новых клиентов, в мае — двести десять. Столько же примерно будет и дальше.

Подписку на год покупали в марте. Глядя на март.

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

Ниже — арифметика, которая отвечает на оба вопроса до покупки. Мы продаём оплату по факту, и было бы удобно закончить статью на «подписка — зло». Так не получится: есть объёмы и ситуации, где подписка выигрывает честно, и мы их назовём. Чужих тарифов в тексте нет намеренно — они меняются, а формулы нет. Подставьте цифры своего поставщика.

Что на самом деле продаёт каждая модель

Спор «подписка против поштучной оплаты» обычно ведут о цене. Он не о цене. Три модели по-разному распределяют один и тот же риск — риск, что вы ошиблись в прогнозе объёма.

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

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

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

Подписка куплена под пик, а работает на среднем

Что происходит
Тариф выбирали в месяц миграции или сезонного всплеска: тогда объём был в десятки раз выше обычного. Дальше идут ровные месяцы, в которых лимит выбирается на несколько процентов.
Во что обходится
Переплата равна разнице между пиком и средним, помноженной на одиннадцать месяцев. Заметить её нельзя: в отчётах видно потраченный бюджет, а не цену одного полученного ответа.
Чем закрывается
Считать не по пику, а по годовому объёму: сколько запросов будет всего за двенадцать месяцев. Разовый всплеск при оплате по факту оплачивается один раз и в том месяце, когда он случился.

Пакет сгорел вместе с половиной бюджета

Что происходит
Купили десять тысяч запросов со сроком в год, использовали три тысячи. Остаток обнулился, и на следующий год покупается такой же пакет — «в прошлый раз же не хватило под конец».
Во что обходится
Номинальная цена запроса умножается на три с лишним. При этом на ценнике поставщика по-прежнему написана красивая цифра, и сравнивать по ней с кем угодно бесполезно.
Чем закрывается
Спрашивать перед покупкой два числа: когда остаток сгорает и переносится ли он. Если сгорает — считать цену по прогнозируемой утилизации, а не по объёму пакета.

Лимит тарифа кончился двадцатого числа

Что происходит
Дневной или месячный лимит исчерпан, до конца периода запросы либо не проходят, либо тарифицируются по повышенной цене сверх пакета.
Во что обходится
В худшем случае это остановка бизнес-процесса: форма перестаёт подсказывать адрес, проверка контрагента не срабатывает на этапе согласования. В лучшем — срочный переход на тариф выше, то есть плата за весь оставшийся год.
Чем закрывается
У оплаты по факту потолок — только ваш баланс. Ограничения частоты остаются в любой модели, но они про скорость, а не про месячный объём.

Арифметика: цена, которую вы платите на самом деле

Формула одна, и она помещается в строку:

Фактическая цена запроса = сумма договора ÷ количество запросов, которые вы реально сделали.

Пакет на десять тысяч запросов, номинал — условная единица за запрос. Смотрим, что получается при разной утилизации:

Использовано из пакетаФактическая цена запросаВо сколько раз дороже номинала
10 000 (100 %)1,00
7 000 (70 %)1,431,4
5 000 (50 %)2,002,0
3 000 (30 %)3,333,3

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

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

Теперь тот же пример с адресами в цифрах. Поиск по реестру ГАР/ФИАС стоит 0,6 ₽ за запрос через API — это цена на день публикации, актуальная всегда на странице тарифов.

ПериодЗапросовОплата по факту
Март: миграция базы12 4007 440 ₽
Апрель — февраль: новые клиенты, около 200 в месяц2 2001 320 ₽
Год целиком14 6008 760 ₽

Дальше решение принимается за минуту: годовой договор с фиксированной суммой выгоднее, если он стоит меньше 8 760 ₽ и его лимитов хватает на март. Если дороже — вы покупаете предсказуемость, и стоит честно сказать себе, что покупаете именно её.

Обратная задача — «нам предлагают договор на N рублей в год, при каком объёме он окупится» — считается делением. Вот та же арифметика для нескольких сервисов при условном договоре в 30 000 ₽ в год (цены API на день публикации):

СервисЦена запросаОкупается отВ месяц
Справочник БИК ЦБ РФ0,2 ₽150 000 запросов в годоколо 12 500
Валидация телефона0,2 ₽150 000около 12 500
Стандартизация адреса0,5 ₽60 000около 5 000
Адресный реестр ГАР/ФИАС0,6 ₽50 000около 4 200
Сведения из ЕГРЮЛ/ЕГРИП20 ₽1 500около 125

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

Где подписка выигрывает честно

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

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

Регламент закупки дороже самой закупки. В компании, где любой платёж проходит три согласования и две недели, годовой договор экономит не деньги, а календарь: одна процедура вместо ежемесячных пополнений. Это законный аргумент, и его редко произносят вслух.

Нужны гарантии, а не средняя цена. Договор с гарантированной пропускной способностью, приоритетом обработки и ответственностью за простой — отдельная услуга. Если она вам нужна, она стоит денег в любой модели, и покупается она обязательством.

Как посчитать свою границу за пятнадцать минут

Порядок действий, который даёт ответ без переговоров с продавцом.

  1. Выгрузите фактическое потребление помесячно за последние двенадцать месяцев. Не оценку «примерно тысяча в месяц», а числа из логов.
  2. Сложите — получится годовой объём. Найдите максимум и среднее, поделите: это ваш коэффициент неравномерности.
  3. Умножьте годовой объём на цену запроса. Это стоимость оплаты по факту.
  4. Возьмите цену годового договора и разделите на цену запроса. Это порог, выше которого договор дешевле.
  5. Сравните годовой объём с порогом. Если объём ниже — разница и есть плата за предсказуемость; решайте, нужна ли она вам за эти деньги.

И шесть вопросов поставщику, ответы на которые меняют арифметику сильнее, чем цена на витрине:

  • Сгорает ли неиспользованный остаток и в какой день?
  • Переносится ли остаток на следующий период — весь или частично?
  • Что считается одним запросом: вызов, найденная запись, строка в пакете?
  • Сколько стоит запрос сверх лимита и включается ли доплата автоматически?
  • Что происходит, когда внешний источник недоступен: списывается ли такой запрос?
  • Какие закрывающие документы вы получите и подойдут ли они вашей бухгалтерии?

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

Код: увидеть цену до того, как её спишут

У нас единица тарификации — не «вызов», а единица работы. Обычный запрос стоит одну единицу. Пакет стоит столько единиц, сколько строк в нём нашлось. Обогащение ответа стоит по единице за каждое, и обогащение, не вернувшее данных, не оплачивается. Всё это видно в ответе, а не в счёте через месяц.

Один запрос, пакет и счётчик списанных единиц

KEY="ak_sandbox_demo_mockdata_v1"

# Один запрос к реестру — одна единица работы
curl -G -H "Authorization: Bearer $KEY" \
     --data-urlencode "query=Москва ул Тверская д 7" \
     --data-urlencode "limit=5" \
     "https://atlorium.com/api/gar/search"

# Пакет адресов: платите за столько строк, сколько НАШЛОСЬ
curl -X POST -H "Authorization: Bearer $KEY" \
     -H "Content-Type: application/json" \
     -d '{"queries":["Казань, улица Баумана, 13","Москва, Тверская 1","мусор"],"sizePerQuery":1}' \
     "https://atlorium.com/api/geocodeforward/batch"
        

import requests

KEY = "ak_sandbox_demo_mockdata_v1"
BASE = "https://atlorium.com"
PRICE_PER_UNIT = 0.6  # ₽ за единицу работы, цена на день публикации

# Пакет — до 1000 строк за вызов. Больше отклоняется целиком с кодом 400.
resp = requests.post(
    f"{BASE}/api/geocodeforward/batch",
    json={"queries": ["Казань, улица Баумана, 13", "Москва, Тверская 1", "мусор"]},
    headers={"Authorization": f"Bearer {KEY}"},
    timeout=60,
)

if resp.status_code == 503:
    # Внешний источник недоступен. За такой запрос деньги не списываются вовсе.
    raise SystemExit("Сервис временно недоступен, повторим позже")

data = resp.json()

# Три числа, по которым сходится бюджет прогона:
#   requested   — сколько строк отправили
#   found       — сколько нашлось
#   billedUnits — за сколько единиц списали
print(data["requested"], data["found"], data["billedUnits"])
print("Списано:", data["billedUnits"] * PRICE_PER_UNIT, "₽")
        

using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "ak_sandbox_demo_mockdata_v1");

var body = new { queries = new[] { "Казань, улица Баумана, 13", "Москва, Тверская 1" } };
var resp = await http.PostAsJsonAsync("https://atlorium.com/api/geocodeforward/batch", body);

if (resp.StatusCode == HttpStatusCode.ServiceUnavailable)
    throw new InvalidOperationException("Источник недоступен — списания не было");

var result = await resp.Content.ReadFromJsonAsync<JsonElement>();

// Ответ песочницы помечен заголовком X-Atlorium-Sandbox: true.
Console.WriteLine($"Найдено {result.GetProperty("found").GetInt32()} из " +
                  $"{result.GetProperty("requested").GetInt32()}, " +
                  $"списано единиц: {result.GetProperty("billedUnits").GetInt32()}");
        

{
  "requested": 3,
  "found": 2,
  "billedUnits": 2,
  "items": [
    { "query": "Казань, улица Баумана, 13", "matches": [ { "precision": "exact" } ] },
    { "query": "Москва, Тверская 1",        "matches": [ { "precision": "exact" } ] },
    { "query": "мусор",                     "matches": [] }
  ],
  "attribution": "ГАР ФНС России, OpenStreetMap"
}
        

Тот же вызов на шести языках (Python, TypeScript, Go, Java, C#, PHP) — в репозитории gar-fias-address-api-client. Примеры запускаются сразу: ключ в них уже стоит демонстрационный.

Сводка того, за что списывается и за что нет:

Что произошлоСколько единиц
Обычный запрос к справочнику: реестр, БИК, телефон, адрес1
Пакет из 1 000 адресов, нашлось 700700
Обратный геокодинг с двумя обогащениями, одно из них ничего не вернуло2 вместо 3
Внешний источник недоступен, ответ 5030
Ошибка в параметрах запроса, ответ 4000
Справочник полей генератора тестовых данных — описание контракта, а не работа0

Демо-ключ ak_sandbox_demo_mockdata_v1 из примеров работает без регистрации и без карты. Он отдаёт моки — правдоподобные сгенерированные данные, одинаковые для одного и того же запроса, поэтому на них удобно писать тесты. Настоящие данные приходят только с личным ключом.

Чего оплата по факту не умеет

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

У нас есть порог входа. Полный доступ — запросы к API и создание ключей — открывает первый платёж: 1 000 ₽ для организаций и предпринимателей, 100 ₽ для частного лица. Деньги не сгорают, они зачисляются на баланс и тратятся запросами. Но это всё-таки входной платёж, и молчать о нём в статье про модели оплаты было бы нечестно. Минимальное пополнение дальше — 50 ₽.

Скидки за объём нет. Десятитысячный запрос стоит столько же, сколько первый. На больших и ровных объёмах договорная цена у подписочного поставщика может оказаться ниже нашей — см. раздел про точку безубыточности, там это посчитано.

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

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

Частые вопросы

Частые вопросы

Есть ли API без подписки и абонентской платы?

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

Что дешевле — подписка или оплата за запрос?

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

Сгорают ли неиспользованные запросы и кредиты?

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

Сколько стоит подключиться к ГАР/ФИАС по API?

Подключение бесплатное: нужен только аккаунт и API-ключ, договор и минимальный пакет не требуются. Платите за запросы — поиск по реестру стоит 0,6 рубля за запрос через API на день публикации статьи, актуальная цена всегда на странице тарифов. Автодополнение адреса, поиск и карточка объекта тарифицируются как обычные запросы.

Что считается одним запросом при оплате по факту?

Единица работы, а не HTTP-вызов. Обычный запрос — одна единица. Пакет стоит столько единиц, сколько строк в нём нашлось: пакет из тысячи адресов с семьюстами найденными стоит семьсот. Каждое дополнительное обогащение ответа добавляет единицу, а обогащение, не вернувшее данных, не оплачивается. Фактическое списание приходит прямо в ответе полем billedUnits.

Списываются ли деньги, если внешний источник не ответил?

Нет. Ответ 503 не тарифицируется — клиент не платит за сбой, который случился не у него. Не тарифицируются также ошибки в параметрах запроса и справочные вызовы, которые описывают контракт сервиса, а не выполняют работу.

Сервисы из этой статьи

Адреса ГАР/ФИАС

Поиск и нормализация адресов по справочнику ГАР/ФИАС

Сведения из ЕГРЮЛ/ЕГРИП

Карточка организации по ИНН/ОГРН: реквизиты, статус, руководитель, ОКВЭД, выписка PDF

Стандартизация адреса

Разбор адресной строки в структуру: уровни (регион/город/улица/дом/квартира), нормализация, коэффициент качества

Попробовать прямо сейчас — без регистрации

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

curl -H "Authorization: Bearer ak_sandbox_demo_mockdata_v1" \
     https://atlorium.com/openapi/gar_ru.json
Полезно? Перешлите коллеге: Telegram VK

Восстанавливаем соединение…

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

Не удалось переподключиться

Проверьте интернет-соединение. Можно повторить попытку или обновить страницу.

Сессия устарела

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