Коды ошибок
Код приходит в поле error (ошибка ручки) или code (ошибка до ручки). Ниже — все коды, которые отдаёт API v2, по разделам. Один код может встречаться в нескольких разделах с одинаковым смыслом.
Общие
| Код | HTTP | Когда | Что делать |
|---|---|---|---|
missing_token | 401 | нет Authorization: Bearer или X-OnPress-Key | передать токен |
invalid_token | 401 | токен неизвестен, отозван или не той формы | выпустить новый |
too_many_auth_failures | 429 | больше 20 неудачных входов в минуту с адреса | ждать Retry-After |
too_many_requests | 429 | больше 120 запросов в минуту | ждать Retry-After |
cross_origin | 403 | запрос с кукой сессии не с адреса дашборда | токеном, а не кукой |
invalid_blog_id | 400 | blog_id не положительное целое | исправить или перейти на /site/{siteId}/ |
site_not_found | 404 | сайта нет, он не ваш, неизвестный домен | проверить site_id и права |
insufficient_role | 403 | не администратор сайта; для сетевой операции — не суперадмин | нужен администратор |
wrong_realm | 409 | запись в блог другого контура; ничего не записано | слать в https://onpress.pro/api/v2/ |
invalid_json | 400 | тело не JSON | проверить JSON |
body_too_large | 413 | тело больше 10 МБ | меньше тело; файлы — по url |
not_found | 404 | нет такого маршрута | проверить путь и метод |
method_not_allowed | 405 | GET на POST-ручку /auth/* | POST |
internal_error | 500 | сбой сервиса | повторить, сообщить |
db_error | 500 | база отказала в записи; db_code | повторить, сообщить |
registry_busy | 503 | реестр фреймов или наборов занят параллельной записью | повторить через секунду |
internal_unavailable | 502 | исполнитель на сайте не ответил или не установлен | повторить позже |
internal_failed | 502 | исполнитель ответил ошибкой | смотреть message |
nothing_to_update, nothing_to_change | 400 | в теле нет полей для правки | прислать поле |
unknown_field | 400 | лишнее поле; допустимые в message или allowed | убрать поле |
Страницы
| Код | HTTP | Когда |
|---|---|---|
markdown_required | 400 | нет markdown или не строка |
invalid_section | 400 | разделы сайта: {section} не news, changelog или docs |
section_exists | 409 | разделы сайта: корень раздела на этом языке уже есть; page |
blocks_invalid | 400 | blocks не массив |
block_unsupported | 400 | блок в blocks не core/*, не блок плагина onpress/* и не raw |
dry_run_not_supported | 400 | dry_run у публикации — пробуйте черновиком |
invalid_status | 400 | статус вне publish, draft, pending, private, future; у ссылок страниц — status вне ok, broken, redirect, unknown |
invalid_kind | 400 | ссылки страниц: kind не internal и не external |
too_many_pages | 413 | ссылки страниц и граф ссылок: на сайте больше 5000 опубликованных страниц |
invalid_date | 400 | date во frontmatter или publish_at — не дата; field, value |
pages_required | 400 | у серии нет pages или это не непустой список |
invalid_interval | 400 или 422 | interval серии не шаг (400) или вне 60 с … 30 дней (422; seconds, min, max) |
series_too_large | 413 | в серии больше 50 страниц |
series_invalid | 422 | в серии есть ошибки, ничего не записано; errors: [{index, code, message}] |
frame_single | 400 | во frame список или не строка |
excerpt_invalid | 400 | excerpt не строка |
howto_invalid | 400 | howto (frontmatter или PATCH) не auto, on, off; allowed |
redirect_field_removed | 400 | PATCH /pages/{ref} с полем redirect: у страниц его больше нет, редирект — правило сайта, Редиректы |
image_invalid | 400 | превью (image во frontmatter, thumbnail в PATCH) не номер и не адрес картинки, список или объект без id и url; field |
image_not_found | 404 | вложения с таким номером на сайте нет |
image_not_image | 422 | вложение или файл по адресу — не картинка |
image_upload_failed | 502 | картинка по адресу не скачалась или не залилась в медиатеку; field |
domain_required | 400 | сайт не выбран ни адресом, ни domain |
page_not_found | 404 | нет страницы по id, слагу или пути |
not_a_page | 404 | ссылка ведёт на запись другого типа |
frame_not_found | 404 | фрейма нет на этом сайте |
ambiguous_page | 409 | слаг у нескольких страниц; matches или candidates |
lang_mismatch | 409 | id — страница другого языка; для перевода — translation_of |
page_language_mismatch | 409 | найденная страница другого языка, чем lang; actual_lang |
page_has_no_language | 409 | у страницы нет языка |
domain_mismatch | 409 | domain во frontmatter — другой сайт |
page_has_children | 409 | удаление страницы с детьми без with_children; children |
front_page_delete | 409 | удаление главной, страницы блога или главной языка |
polylang_inactive | 409 | lang на сайте без языков |
parent_not_found | 422 | сегмент url — не страница; segment |
absolute_url_in_path | 422 | схема или домен в url |
unknown_language | 422 | языка нет на сайте; languages |
unknown_status, unknown_orderby | 422 | неизвестный статус или сортировка в списке |
page_vanished | 500 | страница исчезла во время записи — повторить |
parent_create_failed | 500 | не удалось создать недостающего родителя |
post_type_not_supported | 501 | type не page |
acf_block_unsupported | 501 | ACF-блок в blocks |
exporter_missing | 501 | на сайте нет выгрузчика markdown |
export_failed | — | выгрузка не удалась; у GET /pages/{ref} — в markdown_error |
delete_failed | — | ядро отказало удалить страницу; внутри записи removed |
markdown_missing | 500 | на сайте не включена сборка markdown-копий (/site/markdown) |
Переводы
| Код | HTTP | Когда |
|---|---|---|
translation_link_failed | 422 | translation_of не сработал; reason: polylang_missing, lang_required, origin_not_found, origin_has_no_language, same_language |
translation_link_failed | 409 | группу нельзя записать: участники не совпадают с языками; rejected |
translation_group_conflict | 409 | найденная по слагу страница — в другой группе |
front_page_group_conflict | 409 | то же, и это главная языка |
bad_translations | 400 | translations не объект |
translations_rejected | 409 | записи карты неверны; rejected: [{lang, ref, reason}] |
page_in_other_group | 409 | страница в другой группе; its_group, target_group |
same_language | 409 | язык перевода совпадает с языком страницы |
page_required | 400 | нет page |
Фреймы
| Код | HTTP | Когда |
|---|---|---|
frame_html_required | 400 | нет html |
invalid_slug | 400 | слаг не по схеме; pattern, hint |
frame_url_not_supported | 400 | url во входе: у фрейма нет адреса |
frame_ref_required | 400 | пустая ссылка на фрейм |
frame_ref_conflict | 400 | во вставке onpress/frame два ключа ссылки (name и алиас) называют разные фреймы; conflicts |
page_required | 400 | assign без page |
nothing_to_rebake | 400 | POST /frames/rebake без признаков |
frame_not_found | 404 | нет фрейма |
slug_taken | 409 | слаг занят; id владельца |
frame_not_system | 409 | сброс, возврат к системному или отвязка фрейма, которого нет в библиотеке |
system_frame_missing | 409 | фрейм есть в библиотеке, но разметки его версии нет |
system_frame_not_found | 404 | такого фрейма нет в библиотеке системных |
blog_required | 400 | POST /frames/system без blog_id и domain; установка из библиотеки без blog_id и без all |
not_base_blog | 409 | эталон назначен, а фрейм публикуют в библиотеку или убирают из неё не с эталона; base_blog, blog_id |
frame_on_base | 409 | фрейм убирают из библиотеки, пока он стоит на эталоне; base_blog, id, slug |
base_blog | 409 | установка фрейма библиотеки на сам эталон; возврат к системному или отвязка на эталоне |
slug_taken_by_custom | 409 | установка из библиотеки: у сайта свой фрейм с тем же слагом; id, library_id — повторите с replace_custom |
slug_taken_by_system | 409 | установка из библиотеки: слаг занят другим системным фреймом |
insufficient_role | 403 | запись в библиотеку системных фреймов или во фреймы эталона не суперадмином |
gone | 410 | снятые умолчания и типы фреймов |
frame_too_large | 413 | больше 2 МБ; max_bytes |
invalid_file_name | 400 | имя файла фрейма не по схеме: латиница, цифры, -, _, до 48 символов, .css или .js; pattern, hint |
file_content_required | 400 | PUT файла без строки content |
too_many_files | 400 | у фрейма больше 16 файлов; max_files |
file_not_found | 404 | у фрейма нет такого файла |
file_exists | 409 | переименование файла в имя, которое уже занято |
file_too_large | 413 | файл больше 512 КБ; bytes, max_bytes |
comments_not_allowed | 422 | в разметке или файле фрейма комментарий (<!-- -->, //, /* */) или кириллица в коде вне строк; kind, count, found со строками. Вставки <!-- onpress/… -->, разделители <!-- wp:… --> и /*! … */ пропускаются — подробнее |
Данные
| Код | HTTP | Когда |
|---|---|---|
dataset_name_required | 400 | нет имени |
bad_dataset_name | 400 | имя не [a-z0-9][a-z0-9_-]{0,63} |
bad_dataset_items | 400 | нет items или не массив/объект |
bad_patch_op | 400 | неизвестная операция или нет данных |
item_ref_required | 400 | операция без index и match |
match_token_unsupported | 400 | токен в match, который сервис не считает; supported |
field_belongs_elsewhere | 400 | PATCH /data/site.settings с полем, которое меняется в другом месте |
whole_list_not_accepted | 400 | PATCH /data/site.languages со списком |
bad_menu_items | 400 | PUT /data/menu.* без массива items |
lang_required | 400 | PATCH /data/site.languages без lang |
invalid_page | 400 | PUT /data/site.front_page без page |
source_not_found | 404 | нет источника или набора |
dataset_not_found | 404 | нет набора (или варианта языка) для правки или удаления |
item_not_found | 404 | нет элемента по индексу или фильтру |
menu_not_assigned | 404 | в области нет меню |
wrong_method_for_source | 405 | не тот метод; правильный в write |
reserved_dataset_name | 409 | имя зарезервировано платформой |
computed_source | 409 | запись в pages.* или breadcrumbs; readonly_because |
system_source_not_deletable | 409 | DELETE системного источника |
dataset_too_large | 413 | больше 512 КБ |
Меню
| Код | HTTP | Когда |
|---|---|---|
menu_name_required | 400 | нет name |
menu_ref_required | 400 | нет ссылки на меню |
location_required | 400 | нет location |
unknown_location | 400 | тема не знает области; locations |
unknown_language | 400 | нет языка |
bad_items | 400 | items не массив |
bad_reorder | 400 | нет order |
item_target_required | 400 | пункт без page и url |
menu_not_found | 404 | нет меню |
menu_not_assigned | 404 | ~область пуста |
item_not_found | 404 | нет пункта |
page_not_found | 404 | пункт ведёт на несуществующую страницу |
ambiguous_menu | 409 | имя у нескольких меню |
menu_items_unresolved | 409 | пункты не разрешились; ничего не записано; errors |
menu_items_invalid | 409 | пункты на неопубликованные страницы; allow_invalid |
bad_parent | 409 | пункт сам себе родитель |
polylang_inactive | 409 | язык на сайте без языков |
menu_assignment_not_stored | 500 | карта областей после записи не совпала; ничего не записано |
invalid_theme | 400 | неверное имя темы в theme |
Сайдбар документации
| Код | HTTP | Когда |
|---|---|---|
bad_items | 400 | items не массив |
bad_missing | 400 | missing не hide и не keep |
bad_reorder | 400 | нет ни order, ни id |
bad_status | 400 | неизвестный статус; allowed |
item_ref_required | 400 | пустая ссылка на пункт |
docs_frame_not_found | 404 | названного фрейма документации нет |
page_language_mismatch | 404 | путь с префиксом одного языка, страница — другого |
duplicate_item | 409 | страница в дереве дважды |
not_a_sibling | 409 | в order пункт другой ветки |
sidebar_items_unresolved | 409 | PUT не применён; errors с координатами |
Стили
| Код | HTTP | Когда |
|---|---|---|
css_required | 400 | нет css или не строка |
css_too_large | 413 | больше 256 КБ |
comments_not_allowed | 422 | в CSS сайта комментарий /* */ или кириллица вне строк; found со строками. Маркеры блоков — :root{--имя:1}, лицензии /*! … */ пропускаются |
unknown_token | 400 | нет такого токена |
bad_token_value | 400 | значение не того типа или вне диапазона |
invalid_theme | 400 | неверное имя темы |
Настройки, главная, кэш
| Код | HTTP | Когда |
|---|---|---|
invalid_blogname, invalid_blogdescription | 400 | не строка или пустое название |
invalid_site_icon | 400 | не id вложения |
invalid_analytics | 400 | не объект с ключами счётчиков или неизвестный ключ; допустимые в allowed |
secret_field | 400 | в analytics секретный ключ (ywm_client_token, токены, ключи, пароли): ручка настроек секретов не пишет и не отдаёт, имена в fields |
invalid_page, invalid_lang | 400 | неверная главная или язык |
invalid_transients, invalid_pages, invalid_urls | 400 | неверные списки для сброса кэша |
nothing_to_flush | 400 | сбрасывать нечего |
page_not_published | 409 | главной может быть только опубликованная страница |
no_default_translation | 409 | у страницы нет перевода на основной язык |
Языки
| Код | HTTP | Когда |
|---|---|---|
locale_required | 400 | POST без locale |
invalid_locale, invalid_language, invalid_name, invalid_flag, invalid_order, invalid_slug | 400 | поле не своей формы |
locale_unknown | 400 | Polylang не знает локаль — нужны slug и name |
invalid_force_lang | 400 | force_lang вне 1–3 |
pll_invalid_slug, pll_non_unique_slug, pll_invalid_locale, pll_invalid_flag, pll_invalid_name | 400 | отказ Polylang; details |
language_not_found | 404 | нет языка |
polylang_inactive | 409 | нет Polylang |
language_exists | 409 | слаг занят языком с другими свойствами; diff |
language_in_use | 409 | у языка есть содержимое; usage, force |
language_is_default | 409 | удаление основного языка |
last_language | 409 | удаление единственного языка |
language_delete_failed | 500 | Polylang не удалил язык |
SEO
| Код | HTTP | Когда |
|---|---|---|
invalid_separator | 400 | неизвестный разделитель |
invalid_titles, invalid_metadesc, invalid_noindex, invalid_attachments, invalid_breadcrumbs, invalid_sitemap | 400 | раздел не объект |
invalid_organization_type | 400 | не company и не person |
invalid_person_user | 400 | нет такого пользователя |
invalid_logo, invalid_default_image | 400 | не картинка медиатеки этого сайта |
invalid_twitter_card | 400 | не summary и не summary_large_image |
invalid_profiles | 400 | profiles не объект или other не массив |
invalid_entries_per_page | 400 | вне 1–10000 |
sitemap_composition_readonly | 400 | состав карты сайта — через noindex |
invalid_index_now_key, index_now_key_missing | 400 | ключ IndexNow неверный или отсутствует |
yoast_missing | 409 | на сайте нет Yoast |
index_now_unsupported | 409 | эта сборка Yoast не отправляет IndexNow |
no_public_pages | 409 | обходить нечего |
sitemap_unavailable | 502 | адреса в карте сайта: sitemap_index.xml не ответил; sitemap, status, при обрыве — reason |
site_home_missing | 409 | адреса в карте сайта: у сайта нет адреса, карту читать неоткуда |
invalid_enabled, invalid_name, invalid_description | 400 | карточка приложения: enabled не bool, текстовое поле не строка |
invalid_category, invalid_currency, invalid_operating_systems | 400 | карточка приложения: значение вне choices (или платформы не массивом) |
invalid_price, invalid_rating_value, invalid_rating_count | 400 | цена меньше 0, оценка вне 1–5, число оценок не целое от 1 |
theme_fields_missing | 409 | тема сайта не знает настроек карточки приложения |
Позиции в выдаче
| Код | HTTP | Когда |
|---|---|---|
insufficient_credits | 402 | не хватает кредитов на позицию; required, available, topup_path |
daily_limit_reached | 429 | 50 снятых позиций за сутки по UTC; limit, used |
check_cooldown | 429 | запрос проверяли руками меньше 60 минут назад; retry_after_sec |
manual_hourly_limit | 429 | 10 ручных проверок за час; retry_after_sec |
queue_full | 429 | очередь съёма на сервере полна; retry_after_sec |
check_in_progress | 409 | идёт другая ваша проверка |
too_many_queries | 409 | на сайте уже 50 запросов; limit |
query_exists | 409 | такой запрос с тем же поисковиком и локалью уже есть; id |
query_not_found | 404 | нет такого запроса на этом сайте |
depth_not_allowed | 422 | глубина больше 30 за кредиты; max |
invalid_interval | 422 | interval_days вне 7–90; min |
invalid_query, invalid_engine, invalid_gl, invalid_hl, invalid_depth, invalid_mode, invalid_auto | 422 | неверное поле, оно в field |
invalid_api_key | 422 / 409 | ключ SerpApi не той формы или отвергнут; 409 — привязанный ключ перестал работать |
own_key_required, no_own_key | 409 | свой способ без привязанного ключа |
key_not_found | 404 | отвязывать нечего |
no_searches_left | 409 | на своём ключе кончились поиски; результат не сохранён |
serpapi_unavailable | 502 | SerpApi не ответил на проверку ключа |
serpapi_failed | 502 | SerpApi ответил ошибкой; kind |
platform_key_missing | 503 | на сервере не настроен ключ платформы — только свой ключ |
credits_unavailable | 503 | сервис кредитов не подключён на сервере |
serp_not_configured | 503 | на сервере не настроено хранение ключей |
Отправка на индексацию
| Код | HTTP | Когда |
|---|---|---|
confirmation_required | 409 | отправка без confirm: true; estimate |
cost_changed | 409 | expected_cost меньше суммы, посчитанной сервером; estimate |
insufficient_credits | 402 | не хватает кредитов; required, available, top_up_path |
daily_limit | 429 | суточный предел на владельца или на сайт; limit, used, left |
nothing_to_send | 409 | всё уже отправлено за 7 дней; already_sent |
submit_in_progress | 409 | идёт другая ваша отправка |
duplicate_submission | 409 | idempotency_key уже использован; ничего не отправлено и не списано |
urls_required, no_urls | 400 | адресов нет или ни один не принадлежит сайту |
too_many_urls | 413 | больше 2000 адресов |
platform_only | 400 | передан mode, отличный от platform |
own_key_disabled | 410 | PUT /indexing/account: свой ключ больше не принимается, отправка только за кредиты |
invalid_status | 400 | неверный status в журнале |
platform_unavailable | 503 | отправка сейчас недоступна |
credits_unavailable | 503 | сервис кредитов не подключён на сервере |
send_failed | 502 | отправка сорвалась на середине; pages, charged |
Редиректы
Правила сайта, Редиректы.
| Код | HTTP | Когда |
|---|---|---|
redirect_invalid | 400 | from или to не в своём формате: from не путь этого сайта или адрес самой платформы (/wp-admin/, /wp-json/…), to не путь и не адрес http(s), * не там; или прислано "enabled": false — выключенных правил нет, правило удаляют; field, value. У PUT /redirects/auto — не передан enabled |
redirect_loop | 409 | правило уводит на свой же адрес, замыкает круг с другими правилами или префикс растёт с каждым переходом; chain |
redirect_exists | 409 | у этого from уже есть правило; id |
redirect_not_found | 404 | правила с таким номером на сайте нет |
redirects_limit | 409 | больше 5000 правил на сайт или строк в одном импорте; limit |
nothing_to_import | 400 | у импорта нет ни csv, ни redirects, или в них нет строк |
invalid_on_conflict | 400 | on_conflict не skip и не replace |
Предупреждения live_page, chain, static_app, code_ignored, apply_failed приходят в warnings и отказом не являются: правило записано, ответ 201 или 200. Что каждое значит — Завести правило.
Медиа
| Код | HTTP | Когда |
|---|---|---|
source_required, source_ambiguous, filename_required | 400 | нет источника, два источника, data без имени |
bad_url, bad_data, bad_field | 400 | неверный адрес, base64 или поле |
bad_source_url, bad_sha256, bad_id | 400 | неверный параметр поиска |
bad_page, bad_per_page, bad_search, bad_type, bad_orderby, bad_order | 400 | неверный параметр списка |
unknown_language | 400 | нет языка |
empty_file | 400 или 422 | пустой файл |
media_not_found | 404 | не найдено |
file_too_large | 413 | больше 15 МБ |
unsupported_type | 415 | не JPEG, PNG, WebP, GIF, SVG |
unsafe_svg | 422 | SVG не прошёл проверку |
source_not_found, download_failed | 422 | источник не скачался |
sideload_failed | 422 | WordPress не принял файл |
media_failed, media_unavailable | 502, 503 | исполнитель ответил неожиданно или не ответил |
Сайты
| Код | HTTP | Когда |
|---|---|---|
invalid_name, invalid_donor, invalid_keep_frames | 400 | неверное тело создания |
invalid_domain, invalid_swap_with | 400 | неверный домен или второй сайт |
invalid_mode, invalid_drop_orphan_users | 400 | неверный режим удаления |
donor_not_found | 404 | нет донора |
site_exists | 409 | домен занят; blog_id |
site_deleted | 409 | сайт помечен удалённым |
main_site_locked | 409 | главный сайт не меняет домен |
main_site_protected | 409 | главный сайт не удаляется |
domain_taken, swap_domain_mismatch, domain_busy, domain_changed_meanwhile | 409 | конфликт домена |
site_already_gone | 409 | archive сайта без записи в реестре |
confirmation_required | 428 | purge непустого сайта без confirm; confirm_with |
purge_failed | 500 | клон создан, очистка остановилась |
domain_move_failed | 500 | ядро отказало переносу; откат в rolled_back |
unsafe_table | 500 | барьер остановил удаление таблицы |
not_multisite, network_not_found, site_id_exhausted | 500 | сбой окружения |
Пользователи и профиль
| Код | HTTP | Когда |
|---|---|---|
invalid_email, invalid_name | 400 | неверная почта или имя |
invalid_user_id | 400 | путь не id и не invite-<id> |
invalid_dashboard_lang | 400 | язык интерфейса не en/ru; allowed |
not_member | 404 | пользователь не на сайте |
invite_not_found | 404 | нет приглашения |
user_not_found | 404 | нет пользователя |
already_member, already_invited | 409 | уже на сайте или уже приглашён |
cannot_remove_self | 409 | снять себя |
last_admin | 409 | снять последнего администратора |
email_taken | 409 | почта занята в сети |
token_missing | 404 | GET /me/api-token: токена нет — выпустить POST /me/api-token |
token_not_recoverable | 409 | GET /me/api-token: токен выпущен до 01.10.2026, показать нельзя — выпустить заново |
impersonated | 403 | GET /me/api-token в сессии входа под другим пользователем |
Вход в дашборд
| Код | HTTP | Когда |
|---|---|---|
missing_id_token | 401 | нет ID-токена Firebase |
invalid_id_token | 401 | ID-токен неверный или просрочен |
no_session | 401 | нет сессии (в том числе билет по op_-токену) |
session_expired | 401 | сессия больше не действует |
email_required, email_not_verified | 403 | у учётки Firebase нет почты или она не подтверждена |
provider_not_allowed | 403 | способ входа не почта и не Google |
user_not_found | 403 | почты нет в сети и приглашений на неё нет |
blog_required | 400 | билет без сайта |
auth_not_configured | 503 | вход не настроен на этом экземпляре |
auth_error | 500 | сбой проверки |