Linework Developers
RU
Получить доступ

Концепции

Ошибки

Ошибки используют стандартные коды состояния HTTP и всегда имеют одинаковую JSON-структуру.

Формат ошибки#

{
  "error": {
    "code": "INSUFFICIENT_SCOPE",
    "message": "This API key does not have the scope posts:write"
  }
}
  • code стабилен: используйте его в своём коде.
  • message предназначен для людей и может меняться.
  • Некоторые ошибки добавляют дополнительные поля рядом с code и message (например, некорректное поле в ошибке валидации).

Коды ошибок#

СтатусКодЗначение · что делать
400VALIDATION_ERRORПараметр или поле тела отсутствует либо некорректно. Исправьте запрос; не повторяйте его без изменений.
400INVALID_JSONТело не является корректным JSON. Отправляйте Content-Type: application/json и корректное тело.
401INVALID_API_KEYКлюч отсутствует, имеет неверный формат или отозван. Проверьте заголовок Authorization.
403INSUFFICIENT_SCOPEУ ключа нет scope, необходимого для этого endpoint. Создайте ключ с нужными scopes.
403DEVELOPER_ACCESS_REVOKEDДоступ разработчика для этого аккаунта приостановлен или отозван. Напишите на developers@linework.app.
403PROFILE_INCOMPLETEДобавьте в аккаунт фото профиля и обложку, прежде чем использовать endpoint записи.
403CHAT_NOT_ALLOWEDПравило антиспама не разрешает это сообщение: человек вам не писал и не подписан на вас.
403CHAT_BLOCKEDОдин из вас заблокировал другого. Не повторяйте запрос.
403STORE_BLOCKEDЭтот магазин заблокировал вас.
403USER_UNAVAILABLEПользователь недоступен (заблокирован, закрыт или приостановлен).
403FORBIDDENДействие не разрешено для этого аккаунта (например, редактирование чужого поста).
404NOT_FOUNDРесурс не существует или вы не можете его видеть.
409CONFLICTЗапрос конфликтует с текущим состоянием (например, повторная отправка уже отправленного заказа).
413PAYLOAD_TOO_LARGEТело запроса или загружаемый файл слишком велики. См. ограничения на медиафайлы в разделе Пост с медиафайлами.
429RATE_LIMITEDСлишком много запросов или исчерпана дневная квота. Подождите Retry-After. См. Ограничения частоты.
500INTERNAL_ERRORЧто-то пошло не так на нашей стороне. Повторите попытку позже с экспоненциальной задержкой.

Со временем могут добавляться новые коды: трактуйте неизвестный код в общем значении его HTTP-статуса.

Повторять или нет?#

СтатусПовторять?
400, 401, 403, 404, 409, 413Нет. Сначала исправьте запрос, ключ или аккаунт.
429Да, после Retry-After.
500, 502, 503, 504Да, с экспоненциальной задержкой. Для неидемпотентных операций записи (например, POST /posts) сначала убедитесь, что действие ещё не было выполнено.

Пример обработчика#

const res = await fetch(url, options);
if (!res.ok) {
  const { error } = await res.json().catch(() => ({ error: { code: "UNKNOWN" } }));
  switch (error.code) {
    case "RATE_LIMITED": /* wait Retry-After, then retry */ break;
    case "INVALID_API_KEY":
    case "DEVELOPER_ACCESS_REVOKED": /* stop the bot and alert someone */ break;
    case "CHAT_NOT_ALLOWED": /* skip this user */ break;
    default: throw new Error(`${res.status} ${error.code}: ${error.message}`);
  }
}
r = s.post(url, json=body, timeout=30)  # s = requests.Session() with the Authorization header
if not r.ok:
    err = r.json().get("error", {})
    code = err.get("code")
    if code == "RATE_LIMITED":
        ...  # wait Retry-After, then retry
    elif code in ("INVALID_API_KEY", "DEVELOPER_ACCESS_REVOKED"):
        ...  # stop the bot and alert someone
    elif code == "CHAT_NOT_ALLOWED":
        ...  # skip this user
    else:
        raise RuntimeError(f"{r.status_code} {code}: {err.get('message')}")