Подписка, пакет или поштучно: что дешевле, когда спрос скачет
Подписку покупают в месяц миграции, а пользуются ей в обычные месяцы. Разбираем три модели оплаты данных, считаем фактическую цену запроса и показываем, где поштучная оплата проигрывает.
В марте компания переезжала на новую CRM. За две недели через проверку адресов прошла вся накопленная база — двенадцать с лишним тысяч строк. В апреле пришло сто восемьдесят новых клиентов, в мае — двести десять. Столько же примерно будет и дальше.
Подписку на год покупали в марте. Глядя на март.
В сентябре финансовый директор открывает статью расходов и видит ровную линию: сервис стоит одинаково в месяц миграции и в месяц, когда к нему обратились двести раз. Первым звучит вопрос «мы этим вообще пользуемся?», вторым — «сколько мы переплатили». Ответа на второй в личном кабинете поставщика обычно нет: там показывают остаток лимита, а не цену фактически полученного запроса.
Ниже — арифметика, которая отвечает на оба вопроса до покупки. Мы продаём оплату по факту, и было бы удобно закончить статью на «подписка — зло». Так не получится: есть объёмы и ситуации, где подписка выигрывает честно, и мы их назовём. Чужих тарифов в тексте нет намеренно — они меняются, а формулы нет. Подставьте цифры своего поставщика.
Что на самом деле продаёт каждая модель
Спор «подписка против поштучной оплаты» обычно ведут о цене. Он не о цене. Три модели по-разному распределяют один и тот же риск — риск, что вы ошиблись в прогнозе объёма.
Годовая подписка переносит этот риск на вас целиком и заранее. Вы платите за верхнюю границу своих ожиданий, а получаете столько, сколько получилось. Взамен вы точно знаете сумму в бюджете на двенадцать месяцев вперёд, и это настоящая ценность, а не уловка продавца.
Пакет запросов со сроком годности выглядит компромиссом, а на деле берёт плату дважды: сначала деньгами вперёд, потом планированием. Остаток, не выбранный к дате сгорания, превращается в чистый убыток, поэтому под конец периода начинается характерная суета — «давайте прогоним что-нибудь, чтобы не пропало».
Оплата по факту риск прогноза снимает: не угадали объём — не заплатили за то, чего не было. Взамен вы теряете предсказуемость строки в бюджете и скидку за обязательство. Это честный размен, а не бесплатный обед.
Подписка куплена под пик, а работает на среднем
- Что происходит
- Тариф выбирали в месяц миграции или сезонного всплеска: тогда объём был в десятки раз выше обычного. Дальше идут ровные месяцы, в которых лимит выбирается на несколько процентов.
- Во что обходится
- Переплата равна разнице между пиком и средним, помноженной на одиннадцать месяцев. Заметить её нельзя: в отчётах видно потраченный бюджет, а не цену одного полученного ответа.
- Чем закрывается
- Считать не по пику, а по годовому объёму: сколько запросов будет всего за двенадцать месяцев. Разовый всплеск при оплате по факту оплачивается один раз и в том месяце, когда он случился.
Пакет сгорел вместе с половиной бюджета
- Что происходит
- Купили десять тысяч запросов со сроком в год, использовали три тысячи. Остаток обнулился, и на следующий год покупается такой же пакет — «в прошлый раз же не хватило под конец».
- Во что обходится
- Номинальная цена запроса умножается на три с лишним. При этом на ценнике поставщика по-прежнему написана красивая цифра, и сравнивать по ней с кем угодно бесполезно.
- Чем закрывается
- Спрашивать перед покупкой два числа: когда остаток сгорает и переносится ли он. Если сгорает — считать цену по прогнозируемой утилизации, а не по объёму пакета.
Лимит тарифа кончился двадцатого числа
- Что происходит
- Дневной или месячный лимит исчерпан, до конца периода запросы либо не проходят, либо тарифицируются по повышенной цене сверх пакета.
- Во что обходится
- В худшем случае это остановка бизнес-процесса: форма перестаёт подсказывать адрес, проверка контрагента не срабатывает на этапе согласования. В лучшем — срочный переход на тариф выше, то есть плата за весь оставшийся год.
- Чем закрывается
- У оплаты по факту потолок — только ваш баланс. Ограничения частоты остаются в любой модели, но они про скорость, а не про месячный объём.
Арифметика: цена, которую вы платите на самом деле
Формула одна, и она помещается в строку:
Фактическая цена запроса = сумма договора ÷ количество запросов, которые вы реально сделали.
Пакет на десять тысяч запросов, номинал — условная единица за запрос. Смотрим, что получается при разной утилизации:
| Использовано из пакета | Фактическая цена запроса | Во сколько раз дороже номинала |
|---|---|---|
| 10 000 (100 %) | 1,00 | — |
| 7 000 (70 %) | 1,43 | 1,4 |
| 5 000 (50 %) | 2,00 | 2,0 |
| 3 000 (30 %) | 3,33 | 3,3 |
Отсюда правило сравнения: сравнивать поставщиков по цене с ценника можно только при утилизации, близкой к сотне процентов. В остальных случаях сравниваются разные вещи — у одного цена за купленный запрос, у другого за полученный.
Вторая величина, которую стоит посчитать, — отношение пика к среднему. Возьмите потребление по месяцам за прошлый год, найдите максимум и среднее и поделите одно на другое. Подписка покупается под максимум, работает на среднем: полученное число и есть коэффициент переплаты. При ровной нагрузке он около единицы, и подписка вас не обидит. При миграции, сезонности или проектной работе он легко выходит за пять.
Теперь тот же пример с адресами в цифрах. Поиск по реестру ГАР/ФИАС стоит 0,6 ₽ за запрос через API — это цена на день публикации, актуальная всегда на странице тарифов.
| Период | Запросов | Оплата по факту |
|---|---|---|
| Март: миграция базы | 12 400 | 7 440 ₽ |
| Апрель — февраль: новые клиенты, около 200 в месяц | 2 200 | 1 320 ₽ |
| Год целиком | 14 600 | 8 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 этого не заменяет. Если половина ценности для вас в интерфейсе, сравнение по цене запроса просто не про то.
Регламент закупки дороже самой закупки. В компании, где любой платёж проходит три согласования и две недели, годовой договор экономит не деньги, а календарь: одна процедура вместо ежемесячных пополнений. Это законный аргумент, и его редко произносят вслух.
Нужны гарантии, а не средняя цена. Договор с гарантированной пропускной способностью, приоритетом обработки и ответственностью за простой — отдельная услуга. Если она вам нужна, она стоит денег в любой модели, и покупается она обязательством.
Как посчитать свою границу за пятнадцать минут
Порядок действий, который даёт ответ без переговоров с продавцом.
- Выгрузите фактическое потребление помесячно за последние двенадцать месяцев. Не оценку «примерно тысяча в месяц», а числа из логов.
- Сложите — получится годовой объём. Найдите максимум и среднее, поделите: это ваш коэффициент неравномерности.
- Умножьте годовой объём на цену запроса. Это стоимость оплаты по факту.
- Возьмите цену годового договора и разделите на цену запроса. Это порог, выше которого договор дешевле.
- Сравните годовой объём с порогом. Если объём ниже — разница и есть плата за предсказуемость; решайте, нужна ли она вам за эти деньги.
И шесть вопросов поставщику, ответы на которые меняют арифметику сильнее, чем цена на витрине:
- Сгорает ли неиспользованный остаток и в какой день?
- Переносится ли остаток на следующий период — весь или частично?
- Что считается одним запросом: вызов, найденная запись, строка в пакете?
- Сколько стоит запрос сверх лимита и включается ли доплата автоматически?
- Что происходит, когда внешний источник недоступен: списывается ли такой запрос?
- Какие закрывающие документы вы получите и подойдут ли они вашей бухгалтерии?
Последний вопрос выглядит не финансовым, но именно на нём чаще всего застревают оплаты уже после того, как техническая часть готова. Мы разобрали его отдельно — чек, счёт и возврат при оплате 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 адресов, нашлось 700 | 700 |
| Обратный геокодинг с двумя обогащениями, одно из них ничего не вернуло | 2 вместо 3 |
| Внешний источник недоступен, ответ 503 | 0 |
| Ошибка в параметрах запроса, ответ 400 | 0 |
| Справочник полей генератора тестовых данных — описание контракта, а не работа | 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