Amazi API

Публичные данные

Получайте тарифы, правовые документы, баннеры и анкету без аутентификации.

Доступные анонимные эндпоинты

Используйте эти эндпоинты, чтобы показывать актуальную публичную информацию Amazi на своём сайте или в приложении. Базовый адрес внешнего API — https://dev-api.amazi.pro/v1. В таблице приведены полные пути относительно https://dev-api.amazi.pro; не добавляйте префикс /api и не повторяйте /v1.

В существующих интеграциях замените /public/plans, /public/privacy-policy, /public/terms-of-use, /public/chat-banners, /public/chat-banners/page-top и /public/poll на соответствующие пути /v1 ниже. Прежние URL удалены и возвращают HTTP 404; перенаправлений и совместимых псевдонимов нет.

Метод и путьОтветДоступ из браузера с другого сайта
GET /v1/plansОбъект с freePlan и plansС любого домена, без cookies
GET /v1/privacy-policyПолитика конфиденциальностиС любого домена, без cookies
GET /v1/terms-of-useУсловия использованияС любого домена, без cookies
GET /v1/chat-bannersМассив активных баннеров чатаС любого домена, без cookies
GET /v1/chat-banners/page-topМассив активных верхних баннеров страницыС любого домена, без cookies
GET /v1/pollОбъект с включённой анкетой в poll или poll: nullС любого домена, без cookies

Все шесть запросов не требуют входа в аккаунт, API-ключа, тела или query-параметров. Они читают информацию и не изменяют её. Параметры пагинации и фильтрации не предусмотрены. HEAD возвращает заголовки без тела. OPTIONS обслуживает предварительную проверку браузера и не возвращает данные.

Язык и формат

Успешный GET-запрос возвращает HTTP 200 и JSON. Передавайте Accept-Language: ru, Accept-Language: en или Accept-Language: es. Если заголовок отсутствует или язык не поддерживается, используется английский. Query-параметр locale не выбирает язык этих эндпоинтов.

Поля с суффиксом языка, например titleEn, titleRu и titleEs, содержат опубликованные переводы. Поле без суффикса, например title, содержит текст на языке запроса. Если он пустой, API использует английский, затем другой доступный перевод. Ответы зависят от Accept-Language, поэтому записи кэша для разных языков нужно разделять.

Тарифы: GET /v1/plans

Ответ содержит freePlan — объект бесплатного тарифа — и plans — массив активных платных тарифов в порядке каталога. Архивные сроки и варианты кредитов исключаются; сроки без оставшихся вариантов тоже исключаются. Массивы могут быть пустыми. Получайте актуальные значения из API, не зашивайте цены и лимиты в приложение.

Бесплатный и платные тарифы содержат:

ПоляЗначение
title, titleEn, titleRu, titleEsНазвание тарифа
descriptionLineOne, descriptionLineOneEn, descriptionLineOneRu, descriptionLineOneEs, descriptionLineTwo, descriptionLineTwoEn, descriptionLineTwoRu, descriptionLineTwoEsДве строки описания; каждое имя обозначает отдельное поле
includedSectionsМассив разделов с title, titleEn, titleRu, titleEs и contentMarkdown, contentMarkdownEn, contentMarkdownRu, contentMarkdownEs
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 /v1/privacy-policy для политики конфиденциальности или GET /v1/terms-of-use для условий использования. Каждый эндпоинт возвращает только запрошенный документ в виде объекта со строковыми полями:

ПоляЗначение
contentMarkdownRu, contentMarkdownEn, contentMarkdownEsЗапрошенный документ на русском, английском и испанском
contentMarkdownЗапрошенный документ на языке запроса
acceptanceUpdateTitleЗаголовок последнего запроса принять обновлённые документы; может быть пустым

Тексты документов имеют формат Markdown. Пустой текст означает, что он не опубликован. Чтение эндпоинта не фиксирует согласие пользователя. Ответ содержит Cache-Control: no-store: не сохраняйте его как кэшированную копию актуальной политики.

Замените обращения к прежнему маршруту /public/documents на эндпоинт нужного документа. Прежний маршрут больше не доступен.

Баннеры чата: GET /v1/chat-banners

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

Поля каждого баннераЗначение
idUUID баннера
contentMarkdownRu, contentMarkdownEn, contentMarkdownEs, contentMarkdownТекст Markdown и его значение на языке запроса
iconNameИдентификатор иконки
iconColorНеобязательный цвет иконки в формате #RRGGBB; null или отсутствие поля означает цвет иконки по умолчанию в интерфейсе
linkUrlHTTP(S)-адрес или путь от корня сайта
openInNewTabНужно ли открыть ссылку в новой вкладке
archivedНеобязательное логическое значение; архивные баннеры исключаются
bannerНеобязательные настройки оформления: backgroundColor и textColor в формате #RRGGBB, weight — целое число

Пути linkUrl от корня относятся к веб-приложению Amazi. Разрешайте их относительно https://app.amazi.pro, чтобы /settings не отправлял посетителя в настройки вашего сайта.

Верхние баннеры страницы: GET /v1/chat-banners/page-top

Ответ — массив неархивных верхних баннеров в сохранённом порядке либо пустой массив. Поля совпадают с баннерами чата, но linkUrl может быть пустой строкой, если переход не нужен, а banner обязателен и содержит backgroundColor, textColor и weight. Сохранённый вес не определяет порядок показа. Выбор языка работает так же.

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

Анкета: GET /v1/poll

Ответ — { "poll": null }, если анкета выключена или ещё не настроена. Иначе poll содержит revision — неотрицательную целую версию, необязательный completionEpoch — неотрицательный целый номер цикла прохождения, и definition — включённую анкету. Ответ содержит Cache-Control: no-store.

Поля definitionЗначение
title, titleEn, titleRu, titleEs, iconNameЗаголовок приглашения и идентификатор иконки
iconColorНеобязательный цвет иконки в формате #RRGGBB; null или отсутствие поля означает цвет иконки по умолчанию в интерфейсе
previewTitle, previewTitleEn, previewTitleRu, previewTitleEs, previewDescription, previewDescriptionEn, previewDescriptionRu, previewDescriptionEsЗаголовок и описание вступления; могут быть пустыми
enabled, bonusCreditsПризнак включённой анкеты; награда за прохождение в кредитах или null без награды
bannerНеобязательные backgroundColor и textColor в формате #RRGGBB и целое weight
startQuestionId, questionsUUID первого вопроса и массив вопросов

Каждый вопрос содержит id, title, titleEn, titleRu, titleEs, type — single или multiple, options и nextQuestionId — UUID или null. Каждый вариант содержит id, label, labelEn, labelRu, labelEs, необязательный isCustom и nextQuestionId — UUID, end или null. При одиночном выборе используется переход варианта, а если он не задан — переход вопроса; при множественном выборе используется переход вопроса. Итоговый null или end завершает анкету. Вариант isCustom позволяет ввести свой текст.

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

Примеры запросов

Эти запросы из терминала или backend работают без учётных данных:

curl --fail --silent --show-error https://dev-api.amazi.pro/v1/plans -H 'Accept-Language: ru'
curl --fail --silent --show-error https://dev-api.amazi.pro/v1/privacy-policy -H 'Accept-Language: ru'
curl --fail --silent --show-error https://dev-api.amazi.pro/v1/terms-of-use -H 'Accept-Language: ru'
curl --fail --silent --show-error https://dev-api.amazi.pro/v1/chat-banners -H 'Accept-Language: ru'
curl --fail --silent --show-error https://dev-api.amazi.pro/v1/chat-banners/page-top -H 'Accept-Language: ru'
curl --fail --silent --show-error https://dev-api.amazi.pro/v1/poll -H 'Accept-Language: ru'

Все шесть эндпоинтов можно запрашивать напрямую из браузера:

const response = await fetch("https://dev-api.amazi.pro/v1/plans", {
  headers: { "Accept-Language": "ru" },
  credentials: "omit",
});
if (!response.ok) throw new Error("Не удалось загрузить тарифы: " + response.status);
const { freePlan, plans } = await response.json();
console.log(freePlan.title, plans.map((plan) => plan.title));

Доступ из браузера и ошибки

Все шесть публичных эндпоинтов, включая юридические документы, разрешают запросы GET, HEAD и OPTIONS с любого сайта без учётных данных. Используйте credentials: "omit" и не отправляйте cookies или Authorization. Для юридических документов продолжает действовать no-store, чтобы посетители получали актуальный текст.

Перед обработкой успешного ответа проверяйте HTTP-статус. Различайте HTTP-ошибки и сетевые ошибки или ограничения CORS; при сбое показывайте состояние недоступности. Выводите Markdown безопасным Markdown-компонентом. Допускайте неизвестные поля JSON и переменное количество записей: необязательные поля и пустые массивы допустимы. Публичный каталог не предоставляет права на аккаунт или проект.