Подключения
Публичный API
Получайте актуальные тарифы Amazi, юридические документы, баннеры чата и страницы, а также анкету для внешнего сайта или приложения.
Доступные эндпоинты
Используйте эти эндпоинты, чтобы показывать актуальную публичную информацию Amazi на своём сайте или в приложении. Базовый адрес API — https://api.amazi.pro. Добавляйте к нему пути напрямую, без дополнительного префикса /api.
| Метод и путь | Ответ | Доступ из браузера с другого сайта |
|---|---|---|
| GET /public/plans | Объект с freePlan и plans | С любого домена, без cookies |
| GET /public/privacy-policy | Политика конфиденциальности | Только с разрешённых доменов; иначе используйте свой backend |
| GET /public/terms-of-use | Условия использования | Только с разрешённых доменов; иначе используйте свой backend |
| GET /public/chat-banners | Массив активных баннеров чата | С любого домена, без cookies |
| GET /public/chat-banners/page-top | Массив активных верхних баннеров страницы | С любого домена, без cookies |
| GET /public/poll | Объект с включённой анкетой в poll или poll: null | С любого домена, без cookies |
Все шесть запросов не требуют входа в аккаунт, API-ключа, тела или query-параметров. Они читают информацию и не изменяют её. Параметры пагинации и фильтрации не предусмотрены. HEAD возвращает заголовки без тела. OPTIONS обслуживает предварительную проверку браузера и не возвращает данные.
Язык и формат
Успешный GET-запрос возвращает HTTP 200 и JSON. Передавайте Accept-Language: ru или Accept-Language: en. Если заголовок отсутствует или язык не поддерживается, используется английский. Query-параметр locale не выбирает язык этих эндпоинтов.
Поля с окончаниями Ru и En содержат соответствующие переводы. Поля с окончанием CurrentLocale содержат текст на языке запроса; если он пустой, подставляется другой перевод. Ответы зависят от Accept-Language, поэтому записи кэша для разных языков нужно разделять.
Тарифы: GET /public/plans
Ответ содержит freePlan — объект бесплатного тарифа — и plans — массив активных платных тарифов в порядке каталога. Архивные сроки и варианты кредитов исключаются; сроки без оставшихся вариантов тоже исключаются. Массивы могут быть пустыми. Получайте актуальные значения из API, не зашивайте цены и лимиты в приложение.
Бесплатный и платные тарифы содержат:
| Поля | Значение |
|---|---|
| titleRu, titleEn, titleCurrentLocale | Название тарифа |
| descriptionLineOneRu/En/CurrentLocale, descriptionLineTwoRu/En/CurrentLocale | Две строки описания; каждое окончание через слеш обозначает отдельное поле |
| includedSections | Массив разделов с titleRu/En/CurrentLocale и contentMarkdownRu/En/CurrentLocale |
| availableFunctions | Массив ключей функций, например canManageProjectCode или canShareProject |
| maxProjects, maxAppsPerProject | Целочисленные лимиты тарифа; null означает, что тариф не задаёт этот лимит |
| mainColor | Цвет оформления тарифа |
В freePlan также есть целые количества кредитов: monthlyCredits, registrationCredits, paidPlanCompletionCredits и phoneVerificationCredits. Это значения каталога, а не баланс посетителя. Правила работы кредитов описаны в Тарифах и кредитах.
Каждый элемент plans дополнительно содержит id (UUID), order (целое число), isActive, isPopular, creditsDoNotExpire (логические значения) и durations (массив).
У каждого срока есть id, months, creditAccumulationMonths, creditsDoNotExpire, creditOptions и необязательное isArchived. У каждого варианта кредитов — id, credits, price, isNegotiatedPrice и необязательное isArchived. Для фиксированного варианта credits и price — неотрицательные целые числа. На api.amazi.pro price — полная стоимость выбранного срока в рублях, а не в копейках и не за месяц. Если isNegotiatedPrice равно true, credits и price равны null: показывайте договорные условия, а не нулевую цену. Используйте настройки срока действия кредитов из выбранного duration.
Для фиксированного варианта credits — количество кредитов в месяц, а months — длительность покупаемого срока. creditAccumulationMonths описывает срок накопления кредитов; creditsDoNotExpire отмечает кредиты без срока сгорания.
Эндпоинт не возвращает подписку вошедшего пользователя, его баланс, персональные скидки или результат оформления покупки.
Юридические документы
Используйте GET /public/privacy-policy для политики конфиденциальности или GET /public/terms-of-use для условий использования. Каждый эндпоинт возвращает только запрошенный документ в виде объекта со строковыми полями:
| Поля | Значение |
|---|---|
| contentMarkdownRu, contentMarkdownEn | Запрошенный документ на русском и английском |
| contentMarkdownCurrentLocale | Запрошенный документ на языке запроса |
| acceptanceUpdateTitle | Заголовок последнего запроса принять обновлённые документы; может быть пустым |
Тексты документов имеют формат Markdown. Пустой текст означает, что он не опубликован. Чтение эндпоинта не фиксирует согласие пользователя. Ответ содержит Cache-Control: no-store: не сохраняйте его как кэшированную копию актуальной политики.
Замените обращения к прежнему маршруту /public/documents на эндпоинт нужного документа. Прежний маршрут больше не доступен.
Баннеры чата: GET /public/chat-banners
Ответ — массив без внешнего объекта. Он содержит неархивные баннеры чата в сохранённом порядке. Пустой массив означает отсутствие активных баннеров чата. Верхние баннеры страниц и информация о закрытых посетителем баннерах сюда не входят.
| Поля каждого баннера | Значение |
|---|---|
| id | UUID баннера |
| contentMarkdownRu, contentMarkdownEn, contentMarkdownCurrentLocale | Текст Markdown и его значение на языке запроса |
| iconName | Идентификатор иконки |
| iconColor | Необязательный цвет иконки в формате #RRGGBB; null или отсутствие поля означает цвет иконки по умолчанию в интерфейсе |
| linkUrl | HTTP(S)-адрес или путь от корня сайта |
| openInNewTab | Нужно ли открыть ссылку в новой вкладке |
| archived | Необязательное логическое значение; архивные баннеры исключаются |
| banner | Необязательные настройки оформления: backgroundColor и textColor в формате #RRGGBB, weight — целое число |
Пути linkUrl от корня относятся к веб-приложению Amazi. Разрешайте их относительно https://app.amazi.pro, чтобы /settings не отправлял посетителя в настройки вашего сайта.
Верхние баннеры страницы: GET /public/chat-banners/page-top
Ответ — массив неархивных верхних баннеров в сохранённом порядке либо пустой массив. Поля совпадают с баннерами чата, но linkUrl может быть пустой строкой, если переход не нужен, а banner обязателен и содержит backgroundColor, textColor и weight. Сохранённый вес не определяет порядок показа. Выбор языка работает так же.
Эндпоинт содержит настроенные верхние объявления. Баннеры технических работ, приглашение пройти анкету, личные уведомления и информация о закрытых посетителем баннерах сюда не входят. Чтение не закрывает баннер.
Анкета: GET /public/poll
Ответ — { "poll": null }, если анкета выключена или ещё не настроена. Иначе poll содержит revision — неотрицательную целую версию, необязательный completionEpoch — неотрицательный целый номер цикла прохождения, и definition — включённую анкету. Ответ содержит Cache-Control: no-store.
| Поля definition | Значение |
|---|---|
| titleRu/En/CurrentLocale, iconName | Заголовок приглашения и идентификатор иконки |
| iconColor | Необязательный цвет иконки в формате #RRGGBB; null или отсутствие поля означает цвет иконки по умолчанию в интерфейсе |
| previewTitleRu/En/CurrentLocale, previewDescriptionRu/En/CurrentLocale | Заголовок и описание вступления; могут быть пустыми |
| enabled, bonusCredits | Признак включённой анкеты; награда за прохождение в кредитах или null без награды |
| banner | Необязательные backgroundColor и textColor в формате #RRGGBB и целое weight |
| startQuestionId, questions | UUID первого вопроса и массив вопросов |
Каждый вопрос содержит id, titleRu/En/CurrentLocale, type — single или multiple, options и nextQuestionId — UUID или null. Каждый вариант содержит id, labelRu/En/CurrentLocale, необязательный isCustom и nextQuestionId — UUID, end или null. При одиночном выборе используется переход варианта, а если он не задан — переход вопроса; при множественном выборе используется переход вопроса. Итоговый null или end завершает анкету. Вариант isCustom позволяет ввести свой текст.
Ответ не содержит заполненных ответов, статуса прохождения или других данных пользователя, даже если запрос отправлен с пользовательской сессией. Чтение не отправляет ответы и не начисляет кредиты. Отправка ответов и получение награды требуют входа в аккаунт через существующий сценарий анкеты; публичного эндпоинта отправки нет.
Примеры запросов
Эти запросы из терминала или backend работают без учётных данных:
curl --fail --silent --show-error https://api.amazi.pro/public/plans -H 'Accept-Language: ru'
curl --fail --silent --show-error https://api.amazi.pro/public/privacy-policy -H 'Accept-Language: ru'
curl --fail --silent --show-error https://api.amazi.pro/public/terms-of-use -H 'Accept-Language: ru'
curl --fail --silent --show-error https://api.amazi.pro/public/chat-banners -H 'Accept-Language: ru'
curl --fail --silent --show-error https://api.amazi.pro/public/chat-banners/page-top -H 'Accept-Language: ru'
curl --fail --silent --show-error https://api.amazi.pro/public/poll -H 'Accept-Language: ru'
Тарифы, оба вида баннеров и анкету можно запрашивать напрямую из браузера:
const response = await fetch("https://api.amazi.pro/public/plans", {
headers: { "Accept-Language": "ru" },
credentials: "omit",
});
if (!response.ok) throw new Error("Не удалось загрузить тарифы: " + response.status);
const { freePlan, plans } = await response.json();
console.log(freePlan.titleCurrentLocale, plans.map((plan) => plan.titleCurrentLocale));
Доступ из браузера и ошибки
Тарифы, оба вида баннеров и анкета разрешают запросы GET, HEAD и OPTIONS с любого домена без учётных данных. Для этих запросов не отправляйте cookies или Authorization. Документы тоже доступны без авторизации, но браузерный доступ ограничен доменом отправителя. Если ваш сайт не разрешён, запрашивайте /public/privacy-policy или /public/terms-of-use через свой backend и отдавайте результат из своего приложения с соблюдением no-store. Успешный curl-запрос не означает, что браузеру разрешён доступ по CORS.
Перед обработкой успешного ответа проверяйте HTTP-статус. Различайте HTTP-ошибки и сетевые ошибки или ограничения CORS; при сбое показывайте состояние недоступности. Выводите Markdown безопасным Markdown-компонентом. Допускайте неизвестные поля JSON и переменное количество записей: необязательные поля и пустые массивы допустимы. Публичный каталог не предоставляет права на аккаунт или проект.