Ошибки API — что означает каждый код и как это исправить
FastOG возвращает машиночитаемые коды ошибок, когда запрос завершается неудачно — при подписанном рендере OG-изображения или при вызове одной из встроенных административных поверхностей продукта. Каждый ответ с ошибкой содержит:
error— устаревший короткий токен. По-прежнему присутствует при каждом сбое, чтобы старый клиент продолжал работать.code— тот же стабильный документированный код ошибки (таблица ниже) под именем, которое использует публичный API.message— описание того, что пошло не так, в одном предложении.hint— краткое описание простым языком того, что пошло не так и как это исправить.docs_url— ссылка на эту страницу с якорем на раздел для этого кода.request_id— связывает этот сбой HTTP со строкой в таблице Render Logs в панели управления (также возвращается в заголовке ответаX-Request-ID). Поверхность, которой нечего сопоставлять, отвечаетnull, но ключ присутствует всегда.
Встроенные поверхности продукта — административная панель Shopify, WooCommerce Studio, мост Wix и демо — отвечают
тем же конвертом для кодов ниже, поэтому сбой означает одно и то же, где бы вы с ним ни столкнулись. Поверхность
модуля может сохранять HTTP-статус, который она всегда возвращала для кода (например, render_failed
отвечает 503 при экспорте обложки и 502 в публичном API); код, сообщение, подсказка и ссылка на документацию не меняются.
Чтение ответа с ошибкой
{
"error": "invalid_signature",
"code": "invalid_signature",
"message": "The signature does not match.",
"hint": "The signature did not match. Re-sign with your HMAC secret after every param change.",
"request_id": "5f2a9c1e-..."
}
Если вы получили ответ, который не понимаете, самый быстрый путь таков:
- Запишите
code. - Проверьте сборщик URL — большинство сбоев вызваны ошибками подписи, а не проблемами с аккаунтом.
- Найдите соответствующий код ниже, чтобы узнать точную причину и способ исправления.
- В панели управления откройте Render Logs и отфильтруйте по тому же
error_code— каждая строка показывает запрошенные параметры, чтобы вы могли воспроизвести ситуацию (и убедиться, чтоrequest_idсовпадает).
Подпись и аутентификация
missing_signature
В вашем запросе отсутствуют параметры запроса key и/или s (подпись).
Исправление: убедитесь, что ваш URL содержит и key=<api-key>, и s=<hmac-signature>. Используйте SDK или инструкцию /docs/hmac-signature-guide, чтобы его построить.
invalid_signature
Значение s не совпало с тем, что ваш HMAC-секрет выдаёт для этого URL.
Исправление: подпись охватывает все параметры запроса, кроме s, с отсортированными ключами. Изменение любого параметра — включая переупорядочивание, различия в URL-кодировании или добавление пробелов — делает подпись недействительной. Подписывайте заново после каждого изменения. Убедитесь, что ваш секрет совпадает с тем, который был показан при создании API-ключа.
invalid_signature_format
Значение s не является 64-символьной hex-строкой.
Исправление: подпись должна быть в виде сырого SHA-256 hex (нижний регистр a-f0-9). Если вы кодируете в base64 или обрезаете вывод, используйте обычный hex.
expired_timestamp
Предоставленная вами метка времени t старше 5 минут.
Исправление: генерируйте метку времени заново каждый раз, когда строите URL. Этот код относится к устаревшему потоку подписанных URL; в текущем потоке HMAC v2 метки времени нет.
invalid_api_key
Переданный вами key не существует.
Исправление: скопируйте полный API-ключ из панели управления — это публичный идентификатор, начинающийся с sk_. Он публичный и безопасен в URL; именно секрет (никогда не в URL) подтверждает владение.
missing_hmac_secret
Для API-ключа не настроен HMAC-секрет.
Исправление: создайте новый API-ключ в панели управления — HMAC-секрет генерируется и показывается один раз при создании.
Параметр / входные данные
invalid_image_url
Свойство, содержащее URL (image, brand_logo, logo, avatar, background_image, ...), не является публичным http(s) URL.
Исправление: передайте публично доступный по сети URL https://.... Localhost, частные IP-адреса и пути без хоста отклоняются для предотвращения подделки запросов на стороне сервера.
Подписка
subscription_required (402)
Запрос достиг Dynamic API, но у вашей учётной записи нет активного тарифа. Доступ к API предоставляется только по подписке: тариф является условием доступа и включает ту же линейку покрытия и возможностей, которую предлагают приложения FastOG. Сами рендеры не тарифицируются — нет ни месячной квоты на рендеры, ни оплаты за превышение.
Решение: выберите тариф Dynamic API в панели управления и создайте ключ API. В ответе будет top_up_url со ссылкой на страницу тарифов.
Сервис рендеринга
store_blocked (403)
Рендеринг для магазина, которому принадлежит этот ключ, приостановлен FastOG (например, из-за злоупотребления или неконтролируемого использования). Уже закэшированные на периферии изображения могут продолжать отдаваться до истечения их срока действия. Обратитесь в поддержку, чтобы решить вопрос; никакие изменения в запросе это не исправят.
render_unreachable
Не удалось связаться с сервисом рендеринга (кратковременное окно перезапуска).
Исправление: повторите попытку через несколько секунд. Рендер не был засчитан для этой попытки.
render_failed
Сервис рендеринга вернул ошибку на ваш запрос.
Исправление: проверьте свойства шаблона (props) — слишком длинные или некорректные значения, неподдерживаемые поля или недоступное вышестоящее изображение. Ответ содержит исходную ошибку status. Рендер не был засчитан.
Интерфейсы администратора магазина
Эти коды отвечают из административной панели Shopify и WooCommerce Studio — встроенных редакторов, в которых работает продавец, а не из подписанного API. Несколько из них используются совместно с публичным API (invalid_image_url, render_failed, invalid_signature); для них сохраняется описание, приведённое выше.
| Код | HTTP | Что это значит и что делать |
|---|---|---|
invalid_shop |
422 | Не удалось определить магазин Shopify. Перезагрузите приложение FastOG из панели администратора Shopify, чтобы встроенный запрос снова содержал магазин, затем повторите попытку. |
invalid_shop_or_page |
422 | Магазин или тип страницы неизвестен. Откройте приложение FastOG из панели администратора Shopify и выберите тип страницы обложки в редакторе. |
invalid_store |
422 | Не удалось определить магазин WooCommerce. Снова откройте Studio из панели администратора WordPress, чтобы токен магазина был передан заново, затем повторите попытку. |
invalid_store_or_page |
422 | Магазин или тип страницы неизвестен. Снова откройте Studio из панели администратора WordPress и выберите тип страницы обложки, который предлагает редактор. |
missing_api_key |
422 | У магазина нет ключа подписи. Завершите установку плагина из панели администратора WordPress, чтобы FastOG мог выдать магазину его ключ подписи. |
store_ownership_unverified |
403 | Не удалось проверить сайт WordPress. Он должен быть доступен по публичному HTTPS с включённым REST API. |
community_is_free |
422 | План Community бесплатный. Это бесплатный план по умолчанию, его нельзя купить; выберите платный тариф для перехода на него. |
not_installed |
404 | FastOG не установлен для этого магазина. Установите приложение FastOG из Shopify App Store для этого магазина, затем откройте его снова. |
oauth_required |
409 | Магазину нужно снова авторизовать FastOG. Повторно выполните установку FastOG через OAuth из панели администратора Shopify; сохранённое разрешение было отозвано или его области доступа изменились. |
reconnect_required |
409 | Подключение к Shopify нужно установить заново. Используйте кнопку Reconnect в приложении FastOG, чтобы был выдан новый токен доступа. |
token_rejected |
409 | Shopify выдал токен доступа, а затем отклонил его. Повторите переподключение один раз; если Shopify продолжит его отклонять, переустановите приложение. |
unauthorized |
401 | Запрос не содержит действительной сессии для этой поверхности. Перезагрузите приложение FastOG из панели администратора вашей платформы, чтобы был прикреплён новый токен сессии, затем повторите попытку. |
shop_not_found |
404 | Магазина больше нет в FastOG. Переустановите FastOG из панели администратора Shopify, чтобы заново создать запись магазина. |
invalid_product |
422 | Ссылка на товар недействительна. Перезагрузите страницу товара и снова откройте FastOG; отправленный id товара отсутствовал или не был числом. |
invalid_product_cover |
422 | Данные обложки товара имеют неверный формат. Перезагрузите редактор и сохраните снова; props, style и signals должны быть объектами. |
product_not_found |
404 | Не удалось прочитать товар из магазина. Проверьте, что товар по-прежнему существует и опубликован, затем перезагрузите редактор. |
product_customization_not_on_plan |
403 | Настройка обложки для отдельных товаров недоступна на этом плане. Перейдите на более высокий план или отредактируйте общую обложку товаров. |
no_product_handles |
422 | Не найдено ни одного товара для обновления. Опубликуйте хотя бы один товар с публичным handle, затем снова попробуйте обновить превью для соцсетей. |
invalid_style |
422 | Блок стилей непригоден к использованию. Перезагрузите редактор и заново выберите цвета и шрифты; одно значение не удалось нормализовать. |
invalid_template |
422 | Запрошенного шаблона нет в каталоге этой платформы. Выберите один из макетов, которые предлагает редактор. |
invalid_preset |
422 | Пресет с таким именем не предлагается на этой платформе. Выберите пресет на экране настройки. |
invalid_set |
422 | Данные набора обложек отсутствуют или имеют неверный формат. Перезагрузите экран настройки и снова выберите набор. |
preset_not_applyable |
422 | Пресет нельзя применить ко всем типам страниц. Выберите другой пресет; в этом отсутствует обложка хотя бы для одного типа страниц. |
template_not_available |
422 | Шаблона нет в каталоге доступных для рендеринга. Выберите макет, который предлагает средство выбора. |
template_not_available_on_shopify |
422 | Шаблон недоступен для магазинов Shopify. Выберите макет, который предлагает редактор Shopify. |
template_not_available_on_woocommerce |
422 | Шаблон недоступен для магазинов WooCommerce. Выберите макет, который предлагает Studio. |
template_unavailable |
422 | Шаблон недоступен для этого магазина. Выберите макет, который предлагает редактор; он снят с поддержки, неизвестен или превышает возможности магазина. |
template_not_on_plan |
403 | Для шаблона нужен более высокий план. Смените план или выберите макет, который покрывает текущий план. В ответе план указан в requires. |
template_requires_higher_plan |
403 | Для шаблона нужен более высокий план. В ответе план указан в requires. |
no_rule |
404 | Для этого типа страниц ещё нет правила обложки. Сначала сохраните обложку для этого типа страниц в редакторе. |
cover_not_configured |
404 | Обложка товара ещё не сохранена. Сохраните обложку товара, прежде чем скачивать её или делиться ею. |
schedule_only_product |
422 | Планирование кампании существует только для обложек товаров. Удалите дату возврата или перенесите кампанию на обложку товара. |
not_dismissible |
422 | Это объявление нельзя скрыть. Перезагрузите страницу; оно уже снято или принадлежит другому магазину. |
unsupported_locale |
422 | Этот язык интерфейса не входит в комплект поставки приложения. Выберите один из языков, которые перечислены в ответе в supported. |
no_setup_sets |
422 | Не удалось собрать ни одного подготовленного набора обложек. Повторите попытку на экране настройки; если он остаётся пустым, обратитесь в поддержку. |
export_unavailable |
403 | Скачивание недоступно на этом плане. Перейдите на Pro или выше, чтобы скачивать файлы обложек. |
cancellation_failed |
502 | В отмене подписки отказано. Повторите попытку через некоторое время; если ошибка повторяется, отмените подписку на странице выставления счетов Shopify или обратитесь в поддержку. |
logo_override_on_plan |
403 | Замена логотипа недоступна на этом плане. Перейдите на более высокий план или сбросьте замену логотипа. |
invalid_logo |
422 | Файл логотипа не является допустимым изображением. Загрузите PNG, JPEG или WebP в пределах ограничения размера, указанного в редакторе. |
invalid_brand_image |
422 | Референсное изображение бренда непригодно к использованию. Загрузите поддерживаемое изображение в пределах ограничения размера или сбросьте референс и сохраните снова. |
brand_image_too_large |
422 | Референсное изображение бренда слишком большое. Уменьшите файл и загрузите его снова. |
brand_colors_too_many |
422 | Передано больше трёх цветов бренда. Отправьте не более трёх hex-цветов. |
upload_failed |
500 | Не удалось сохранить загруженный файл. Повторите попытку; если ошибка повторяется, обратитесь в поддержку — хранилище ресурсов не вернуло публичный URL. |
attachment_upload_failed |
500 | Не удалось сохранить вложение для поддержки. Отправьте сообщение без вложения, затем пришлите файл в поддержку по электронной почте. |
invalid_webhook |
401 | Подпись вебхука магазина не прошла проверку. Проверьте, что секрет вебхука в настройках FastOG в WordPress совпадает с выданным FastOG. |
not_found |
404 | Этой конечной точки больше не существует. Снова откройте Studio из панели администратора WordPress. |
meta_refresh_unavailable |
503 | Обновление превью для соцсетей не настроено. Вместо этого повторно поделитесь ссылкой из Facebook. |
theme_write_disabled |
409 | Редактирование темы не включено для этого приложения. Используйте встраивание приложения в тему вместо правки файлов темы. |
scope_required |
403 | FastOG не хватает разрешения Shopify. Одобрите запрошенные области доступа с помощью consent_url в ответе, затем повторите исправление. |
Мост Wix
Мост Wix подписывается приложением Wix, а не сессией мерчанта, поэтому его ошибки адресованы разработчику приложения. Каждый ответ по-прежнему содержит code и request_id; идентификатор запроса моста — это идентификатор из подписанного конверта.
| Код | HTTP | Что это значит и что делать |
|---|---|---|
invalid_bridge_signature |
401 | Подпись моста Wix не прошла проверку. Пересоздайте запрос с общим секретом, точным путём и меткой времени не старше пяти минут. |
invalid_bridge_body |
400 | Тело конверта моста имеет неверный формат. Отправьте body как объект JSON и закодируйте каждое число внутри него как строку, чтобы каноническая подпись совпала. |
replayed_bridge_request |
401 | Этот запрос моста уже был использован. Создавайте новый request_id для каждого изменяющего вызова. |
wix_site_not_installed |
403 | FastOG не установлен на этом сайте Wix. Установите приложение FastOG на сайт, затем откройте его заново. |
wix_site_not_provisioned |
422 | У сайта Wix ещё нет учётных данных для подписи. Переустановите приложение FastOG, чтобы сайт был обеспечен ключом API. |
invalid_page_type |
422 | Этот тип страницы FastOG не поддерживает на Wix. Отправьте один из типов страниц, которые предлагает Studio. |
rule_not_found |
404 | Правила с таким id нет. Обновите список; правило было удалено или принадлежит другому сайту. |
invalid_target_id |
422 | Идентификатор цели Wix недопустим для этого типа страницы. Отправьте id, который приложение Wix предоставляет для этого типа страницы. |
invalid_preview |
422 | Полезная нагрузка предпросмотра имеет неверный формат. Прочитайте объект details, чтобы найти проблемное поле. |
invalid_rule |
422 | Полезная нагрузка правила обложки имеет неверный формат. Прочитайте объект details; template обязателен, а необязательные блоки должны быть объектами. |
invalid_sync |
422 | Полезная нагрузка синхронизации имеет неверный формат. Прочитайте объект details; target_type и target_id должны совпадать. |
invalid_regenerate_url |
422 | Отсутствует URL для перегенерации. Отправьте URL страницы в url. |
invalid_regenerate_host |
422 | URL не принадлежит хосту FastOG. Отправьте URL обложки с fastog.com. |
ai_presets_unsupported |
422 | Наборы обложек, созданные ИИ, больше не генерируются. Выберите один из кураторских вариантов оформления. |
original_tags_required |
422 | Исходные теги метаданных обязательны. Отправьте original_tags (или current_tags), чтобы при удалении можно было восстановить метаданные сайта. |
invalid_restored |
422 | Полезная нагрузка восстановленных ключей имеет неверный формат. Отправьте restored как массив ключей метаданных. |
invalid_seo_target |
422 | Тип цели SEO неизвестен. Используйте в пути site, pattern или item. |
invalid_seo_payload |
422 | Полезная нагрузка метаданных SEO имеет неверный формат. Отправьте target_id, current_tags и fastog_url как абсолютный URL http(s). |
sync_failed |
500 | Синхронизация метаданных с Wix не удалась. Повторите попытку; если ошибка сохраняется, проверьте, что сайт доступен и приложение всё ещё установлено. |
invalid_tier |
422 | Этот тариф FastOG не продаёт на Wix. Отправьте starter, pro или scale в качестве tier. |
Демонстрационная поверхность
Демо — это консоль продаж, доступная только владельцу, а не endpoint для мерчантов.
| Код | HTTP | Что это значит и что делать |
|---|---|---|
url_required |
422 | URL не был отправлен. Вставьте ссылку на магазин или товар перед чтением карточки. |
unreadable_url |
422 | Эту страницу не удалось прочитать. Проверьте, что ссылка публичная и полная; страницу за логином прочитать нельзя. |
no_api_key |
422 | Нет доступного API-ключа для подписи обложек. Создайте API-ключ (или введите действительный); в ответе есть ссылка на страницу API-ключей. |
no_presets |
500 | Пресеты обложек не настроены. Настройте хотя бы один пресет на сервере. |
Коды редакторов правил с областью действия
Редакторы правил с областью действия (админка Shopify и WooCommerce Studio) сами переводят эти токены на
язык продавца, поэтому в их ответах присутствуют error и code, но нет hint — второе английское
описание лишь разошлось бы с локализованным, которое продавец фактически видит:
scope_already_defined, scoped_rule_limit_reached, scoped_rules_not_on_plan,
scope_value_required, scope_value_too_long, unknown_scope_type, base_rule_required,
scoped_rules_product_only, cannot_delete_base_rule.
Всё ещё не получается?
- Откройте страницу Render Logs в панели управления — каждый результат (успех и отклонение) указан вместе с его
error_code, статусом HTTP и запрошенными параметрами. - Запустите
php artisan og:diagnoseна подписанном URL, чтобы пройти весь конвейер и увидеть, на каком этапе происходит сбой. - Ознакомьтесь с документацией в боковой панели для используемого вами фреймворка (Next.js, Express, SvelteKit, ...).