MelioraAPI EN
Ранний доступ. Ключи выдаются по запросу. Как получить ключ

Успешный ответ всегда имеет статус 200. Ошибка приходит с кодом 4xx или 5xx и телом в формате RFC 9457.

#Формат

Ошибка возвращается с заголовком Content-Type: application/problem+json и телом из восьми полей:

Ответ с ошибкой
HTTP/1.1 400 Bad Request
Content-Type: application/problem+json; charset=utf-8
Request-Id: 0f3c7a95-2e8b-4d16-b9a4-6c5e1d8f7b20
Cache-Control: no-store

{
  "type": "urn:meliora:problem:invalid_parameter",
  "title": "Invalid parameter",
  "status": 400,
  "detail": "Проверьте значение параметра",
  "instance": "urn:request:0f3c7a95-2e8b-4d16-b9a4-6c5e1d8f7b20",
  "code": "invalid_parameter",
  "param": "limit",
  "request_id": "0f3c7a95-2e8b-4d16-b9a4-6c5e1d8f7b20"
}
ПолеОписание
typeURI типа ошибки: urn:meliora:problem: и код.
titleКороткое название на английском.
statusHTTP-статус, тот же, что у ответа.
detailПояснение для человека. Язык зависит от заголовка Accept-Language.
instanceURI запроса: urn:request: и идентификатор запроса.
codeМашинный код ошибки.
paramПараметр, к которому относится ошибка, или null.
request_idИдентификатор запроса, тот же, что в заголовке Request-Id.

#Отказы до проверки ключа

Часть запросов отклоняется еще до проверки ключа: превышен лимит с одного IP-адреса, неизвестный путь, тело в запросе, перегрузка. У таких ответов те же поля status, code, param и request_id, но type равен about:blank, а title и detail совпадают с code:

JSON
{
  "type": "about:blank",
  "title": "rate_limit_exceeded",
  "status": 429,
  "code": "rate_limit_exceeded",
  "detail": "rate_limit_exceeded",
  "instance": "urn:request:0f3c7a95-2e8b-4d16-b9a4-6c5e1d8f7b20",
  "request_id": "0f3c7a95-2e8b-4d16-b9a4-6c5e1d8f7b20",
  "param": null
}

Поэтому опирайтесь на status и code, а не на type и title.

#Как обрабатывать

  • Ветвите логику по status и code. Текст detail может меняться, не разбирайте его в коде.
  • Если пришел незнакомый code, обработайте ошибку по HTTP-статусу: 4xx означает проблему в запросе или доступе, 5xx временную проблему на нашей стороне.
  • При ошибке в параметре param содержит его имя: limit, status, cursor, include_text и так далее.
  • Ошибка никогда не продвигает курсор. После повтора запрос с тем же курсором вернет те же данные.

#Язык пояснения

По умолчанию detail на русском. Чтобы получать английский текст, передайте заголовок Accept-Language: en. Поля code и title от языка не зависят.

#Request-Id

Каждый ответ, включая ошибки, содержит заголовок Request-Id с UUID запроса. Записывайте его в журнал рядом с маршрутом и временем. В обращении в поддержку достаточно Request-Id: по нему мы найдем запрос. Сам ключ не присылайте.

#Коды ошибок

СтатусКодЧто случилось
400invalid_parameterЗначение параметра не подходит по формату, диапазону или сочетанию. Имя параметра в param.
400unknown_parameterМаршрут не принимает такой параметр. Ключ API в адресе тоже дает эту ошибку.
400cursor_mismatchКурсор поврежден, выдан для другого маршрута или фильтров, либо права и охват ключа изменились.
401invalid_api_keyКлюча нет, он неверен, отозван или истек его срок.
403scope_requiredКлюч не имеет права на это чтение. Для текстов нужен также включенный «Текст сообщений».
403api_disabledДоступ по API выключен в настройках кабинета.
403api_not_availableТариф кабинета не включает API. Чтение доступно с тарифа Pro.
403subscription_inactiveПодписка кабинета не действует.
403module_not_availableВ кабинете недоступен модуль рассылок.
403organization_suspendedДоступ кабинета приостановлен.
403ip_not_allowedЗапрос пришел с IP-адреса, которого нет в списке разрешенных у ключа.
404not_foundОбъект не найден или находится вне охвата ключа. Неизвестный путь тоже дает 404.
405method_not_allowedРазрешен только метод GET. Внешний адрес отвечает на другие методы 404 без тела, поэтому этот код снаружи не встречается.
410cursor_expiredСрок курсора истек: 15 минут для списков, 30 суток для ленты событий.
429rate_limit_exceededИсчерпан лимит запросов ключа, организации или IP-адреса. Повторите через Retry-After секунд.
503service_unavailableДанные временно не прочитаны. Повторите позже.
503server_busyСервис перегружен. Повторите через Retry-After секунд.
503integration_initializingНовый ключ еще готовится. Повторите позже.

#Что повторять

СтатусПовторять?Как
400НетИсправьте параметр из param. Для cursor_mismatch начните список заново.
401, 403НетПроверьте ключ, права и настройки кабинета.
404НетОбъект не существует или вне охвата ключа.
410НетКурсор истек: начните список заново или восстановите ленту.
429ДаПодождите Retry-After секунд, добавьте случайный разброс.
503ДаПодождите Retry-After секунд, при повторных отказах увеличивайте паузу.

Подробнее о паузах между повторами в руководстве Лимиты и повторы.

#Особые случаи

  • Неизвестный путь и объект с идентификатором не в формате UUID дают 404 not_found. Путь пишется точно как в справочнике: завершающий / или закодированные символы в пути тоже дают 404.
  • Методы кроме GET, включая HEAD и OPTIONS, и адреса вне /v1/ получают 404 без тела. Код method_not_allowed снаружи не встречается.
  • Тело в GET-запросе, адрес длиннее 8 КиБ или заголовки больше 8 КиБ дают 400 invalid_parameter с param равным body, uri или headers.
  • Повторенный параметр (?status=new&status=replied) и пустое значение (?status=) дают 400 invalid_parameter.
  • Долгий запрос прерывается через 10 секунд с ответом 503 service_unavailable.