Инвентарь REST-ручек
Фаза 3: канонические YAML — полноценный контракт (requestBody / security / WpError / коды ответов), не только каталог path’ов. URL — {product}/{slug}/v1.
Канон YAML — в плагине: docs/openapi/<base>.{en,ru}.yaml (например wp2platform-modules.en.yaml). Сайт копирует спеки (npm run sync:openapi → openapi-specs/{en,ru}/<base>.yaml) и собирает API-страницы через Starlight OpenAPI. Сверка path/глубины: npm run audit:openapi (тело или x-empty-body, security, ru/en коды). Исключения сканера: vendor, vendor-lib, tests, includes/analogwp-*. License регистрируется из wp2platform/plugin.php через контроллер wordpress-core — в аудит добавлен явно.
Объём контракта (EN): 137 операций в продуктовых YAML ниже. Живая функциональная сверка на stage (Application Password): harness .cursor/skills/remote-ssh-wp/scripts/stage_openapi_e2e/ — целевой счёт 137 PASS. Multi-network REST на stage появляется только после committed setup (wp2platform_multi_network_committed); иначе path есть в YAML, но не в rest_get_server().
Колонка OpenAPI: контракт — операция описана в YAML с входом/выходом/ошибками.
WP_REST_Server::EDITABLE в PHP = POST|PUT|PATCH; в OpenAPI обычно документирован PATCH (этого достаточно для coverage). CREATABLE = POST, READABLE = GET, DELETABLE = DELETE.
wp2platform
Заголовок раздела «wp2platform»Спека: docs/openapi/wp2platform-modules.{en,ru}.yaml → /docs/api/wp2platform. Auth по умолчанию: cookie / Application Password (DualRest), сеть.
Site Manager — wp2/site-manager/v1
Заголовок раздела «Site Manager — wp2/site-manager/v1»Клиенты: админка Site Manager. blog_id в path.
| METHOD | Path | OpenAPI |
|---|---|---|
| GET | /wp-json/wp2/site-manager/v1/sites |
контракт |
| POST | …/sites |
контракт |
| GET | …/sites/slug-availability |
контракт |
| POST | …/sites/bulk |
контракт |
| GET | …/sites/{blog_id} |
контракт |
| PATCH (EDITABLE) | …/sites/{blog_id} |
контракт |
| DELETE | …/sites/{blog_id} |
контракт |
| POST | …/sites/{blog_id}/archive |
контракт |
| POST | …/sites/{blog_id}/unarchive |
контракт |
| POST | …/sites/{blog_id}/activate |
контракт |
| POST | …/sites/{blog_id}/deactivate |
контракт |
| GET | …/sites/{blog_id}/users |
контракт |
| POST | …/sites/{blog_id}/users |
контракт |
| DELETE | …/sites/{blog_id}/users/{user_id} |
контракт |
| GET/POST | …/categories |
контракт |
| PATCH/DELETE | …/categories/{id} |
контракт |
| GET/POST | …/statuses |
контракт |
| PATCH/DELETE | …/statuses/{id} |
контракт |
| GET | …/jobs |
контракт |
| GET | …/jobs/{job_id} |
контракт |
| GET | …/jobs/{job_id}/events |
контракт |
Site Duplicator — wp2/site-duplicator/v1
Заголовок раздела «Site Duplicator — wp2/site-duplicator/v1»| METHOD | Path | OpenAPI |
|---|---|---|
| POST | /wp-json/wp2/site-duplicator/v1/sites/{blog_id}/duplicate |
контракт |
| GET | …/jobs, …/jobs/{job_id}, …/jobs/{job_id}/events |
контракт |
Post Duplicator — wp2/post-duplicator/v1
Заголовок раздела «Post Duplicator — wp2/post-duplicator/v1»| METHOD | Path | OpenAPI |
|---|---|---|
| POST | /wp-json/wp2/post-duplicator/v1/posts/{post_id}/duplicate |
контракт |
| POST | …/posts/{post_id}/duplicate-batch |
контракт |
Multi Network — wp2/multi-network/v1
Заголовок раздела «Multi Network — wp2/multi-network/v1»Runtime: модуль boot’ится только при committed multi-network setup; без него ручки в OpenAPI есть, на сайте — нет.
| METHOD | Path | OpenAPI |
|---|---|---|
| GET/POST | /wp-json/wp2/multi-network/v1/networks |
контракт |
| GET | …/networks/{network_id} |
контракт |
Media Converter — wp2/media-converter/v1
Заголовок раздела «Media Converter — wp2/media-converter/v1»Клиенты: скиллы media-hls-encode, media-whisper-tracks (formats, attachments, artifacts/pack). Query blog_id на части ручек.
| METHOD | Path | OpenAPI |
|---|---|---|
| GET | …/media-converter/v1/formats |
контракт |
| GET/PATCH | …/settings |
контракт |
| POST | …/media, …/encode |
контракт |
| GET | …/attachments/{id} |
контракт |
| POST | …/attachments/{id}/encode |
контракт |
| GET | …/queue, …/queue/{key} |
контракт |
| POST | …/queue/control, …/queue/clear |
контракт |
| DELETE | …/queue/{key} |
контракт |
| POST | …/queue/{key}/formats/{format}/cancel |
контракт |
| GET/POST/DELETE | …/attachments/{id}/frame-miniatures |
контракт |
| GET/POST | …/attachments/{id}/thumbnails |
контракт |
| PATCH/DELETE | …/attachments/{id}/thumbnails/poster |
контракт |
| GET | …/attachments/{id}/artifacts |
контракт |
| POST | …/attachments/{id}/artifacts/pack |
контракт |
| PATCH/DELETE | …/attachments/{id}/artifacts/{folder} |
контракт |
Subtitles & Timecodes — wp2/media-subtitles-timecodes/v1
Заголовок раздела «Subtitles & Timecodes — wp2/media-subtitles-timecodes/v1»Клиент: скилл media-whisper-tracks.
| METHOD | Path | OpenAPI |
|---|---|---|
| GET/POST/PUT | …/media-subtitles-timecodes/v1/attachments/{id}/tracks |
контракт |
| POST | …/tracks/upload |
контракт |
| PATCH/DELETE | …/tracks/{index} |
контракт |
Enable Media Replace — wp2/enable-media-replace/v1
Заголовок раздела «Enable Media Replace — wp2/enable-media-replace/v1»| METHOD | Path | OpenAPI |
|---|---|---|
| GET | …/enable-media-replace/v1/attachments/{id}/replace-info |
контракт |
| POST | …/attachments/{id}/replace |
контракт |
Ошибка: playback_artifacts_present (409), если к вложению привязаны артефакты playback.
Studio Sync — wp2/studio-sync/v1 (уже канон фазы 2)
Заголовок раздела «Studio Sync — wp2/studio-sync/v1 (уже канон фазы 2)»Клиент: WP2Studio (STUDIO_SYNC_REST_BASE). Auth: public на POST /desktop/connect; дальше Bearer. PHP: src/Modules/StudioSync/. Не переделывать.
| METHOD | Path | Auth | OpenAPI |
|---|---|---|---|
| POST | /wp-json/wp2/studio-sync/v1/desktop/connect |
public (one-time token) | контракт |
| GET | …/desktop/status |
Bearer | контракт |
| POST | …/desktop/disconnect |
Bearer | контракт |
| GET | …/sites |
Bearer | контракт |
| GET | …/status |
Bearer (legacy) | контракт |
| GET | …/sync/items |
Bearer | контракт |
| GET | …/sync/posts/{post_id} |
Bearer | контракт |
| PATCH (EDITABLE) | …/sync/posts/{post_id} |
Bearer, body base_hash+content |
контракт |
Local Sync — wp2/local-sync/v1
Заголовок раздела «Local Sync — wp2/local-sync/v1»Клиенты: скилл 09-local-sync, пайплайн page-builder (POST /validate). Capability: manage_network (MS) / edit_pages. Query blog_id.
| METHOD | Path | OpenAPI |
|---|---|---|
| GET | /wp-json/wp2/local-sync/v1/projects |
контракт |
| POST | …/sync |
контракт |
| POST | …/validate |
контракт |
Course Manager — wp2/course-manager/v1
Заголовок раздела «Course Manager — wp2/course-manager/v1»Клиент: админка Gutenberg sidebar. manage_categories + edit_posts. Create/delete секций — core /wp/v2/{taxonomy}, не этот API.
| METHOD | Path | OpenAPI |
|---|---|---|
| GET | /wp-json/wp2/course-manager/v1/sidebar |
контракт |
| PUT | …/reorder |
контракт |
| PUT | …/assign |
контракт |
| PATCH (EDITABLE) | …/sections/{id} |
контракт |
Passwordless — wp2/passwordless/v1 (public)
Заголовок раздела «Passwordless — wp2/passwordless/v1 (public)»Клиент: формы входа WP2 Platform.
| METHOD | Path | OpenAPI |
|---|---|---|
| POST | /wp-json/wp2/passwordless/v1/request |
контракт |
| POST | …/verify |
контракт |
Magic Links — wp2/magic-links/v1 (public)
Заголовок раздела «Magic Links — wp2/magic-links/v1 (public)»Клиент: interstitial consume в WP2 Platform.
| METHOD | Path | OpenAPI |
|---|---|---|
| POST | /wp-json/wp2/magic-links/v1/consume |
контракт |
Elementor Style Presets — wp2/elementor-style-presets/v1
Заголовок раздела «Elementor Style Presets — wp2/elementor-style-presets/v1»Клиент: админка Elementor. edit_posts. Модуль can_be_enabled только при установленном Elementor.
| METHOD | Path | OpenAPI |
|---|---|---|
| GET/POST | /wp-json/wp2/elementor-style-presets/v1/presets |
контракт |
| GET | …/presets/{id} |
контракт |
| PATCH (EDITABLE) | …/presets/{id} |
контракт |
Media Playback — wp2/media-playback/v1
Заголовок раздела «Media Playback — wp2/media-playback/v1»Клиенты: плееры (Vidstack и др.). Query blog_id, lang.
| METHOD | Path | OpenAPI |
|---|---|---|
| GET | /wp-json/wp2/media-playback/v1/attachments/{id} |
контракт |
License — wp2/license/v1 (продукт platform)
Заголовок раздела «License — wp2/license/v1 (продукт platform)»Регистрация: plugin.php → LicenseRestController('wp2', 'license', $hub). Репо wp2-wordpress-core не документируется отдельно. Auth: manage_network_options / manage_options.
| METHOD | Path | OpenAPI |
|---|---|---|
| GET | /wp-json/wp2/license/v1/products |
контракт |
| POST | …/{product_id}/activate |
контракт |
| POST | …/{product_id}/deactivate |
контракт |
| GET | …/{product_id}/status |
контракт |
| GET | …/{product_id}/data |
контракт |
Спека: docs/openapi/wp2lms.{en,ru}.yaml.
Static Builder — wp2lms/static-builder/v1
Заголовок раздела «Static Builder — wp2lms/static-builder/v1»Клиенты: скилл 10-static-builder, CLI bin/static-builder/*. Auth: edit_pages / manage_network. Query blog_id.
WP_Error: wp2lms_static_builder_invalid_blog, blog_not_found, busy, not_found, no_pages, cannot_stop, invalid_id, invalid_api_type, invalid_version, invalid_export_mode, pages_required, invalid_page_ids, page_not_found, empty_course, course_not_found, primary_requires_course, create_failed, configure_failed, update_failed, delete_failed, page_cache_rebuild, live_mode_disabled.
| METHOD | Path | OpenAPI |
|---|---|---|
| GET | /wp-json/wp2lms/static-builder/v1/pages |
контракт |
| GET/POST | …/builds |
контракт (POST: page_ids или build_course_id; is_primary) |
| GET | …/courses/{course_id}/builds |
контракт (is_primary в serialize) |
| GET/PATCH/DELETE | …/builds/{id} |
контракт (PATCH: is_primary) |
| POST | …/builds/{id}/run |
контракт |
| POST | …/builds/{id}/stop |
контракт |
Turbo — wp2lms/turbo/v1
Заголовок раздела «Turbo — wp2lms/turbo/v1»Клиенты: Turbo frontend (Gutenberg/Twig), Gravity Forms bridge, xAPI session.
| METHOD | Path | Auth | OpenAPI |
|---|---|---|---|
| POST | /wp-json/wp2lms/turbo/v1/xapi-actor/session |
cookie (email) | контракт |
| POST | …/gravity-forms/submit |
cookie | контракт |
| POST | …/dsh/expand |
cookie | контракт |
| GET | …/static/{id} |
edit_posts |
контракт |
wp2lms-pro
Заголовок раздела «wp2lms-pro»Спека: docs/openapi/wp2lms-pro.{en,ru}.yaml.
Embed Packages — wp2lms-pro/embed-packages/v1
Заголовок раздела «Embed Packages — wp2lms-pro/embed-packages/v1»Alias wp2platform/module/embed-packages/v1 снят. Auth: manage_network / edit_pages. Query blog_id.
WP_Error: embed_packages_not_found, delete_failed, page_not_found, invalid_blog, unknown_blog.
| METHOD | Path | OpenAPI |
|---|---|---|
| GET/POST | /wp-json/wp2lms-pro/embed-packages/v1/packages |
контракт |
| GET/PATCH/DELETE | …/packages/{id} |
контракт |
| POST | …/packages/{id}/content |
контракт |
| POST | …/packages/{id}/materialize-pages |
контракт |
| GET/PUT/DELETE | …/pages/{page_id}/package |
контракт |
| POST | …/batch |
контракт |
wp2tutor
Заголовок раздела «wp2tutor»Спека: docs/openapi/wp2tutor.{en,ru}.yaml. Namespace разделены по модулям. Bot не в этой спеке (см. wp2tutor-bot). RAG-ручки регистрируются при включённом модуле rag и rag_export_enabled.
| METHOD | Path | Auth | OpenAPI |
|---|---|---|---|
| GET / POST | /wp-json/wp2tutor/ai/v1/chat |
GET public; POST X-Ai-Chat-Secret |
контракт |
| POST | /wp-json/wp2tutor/embedding/v1/sync |
manage_options |
контракт |
| POST | …/statuses |
manage_options |
контракт |
| POST | …/diagnostics |
manage_options |
контракт |
| GET/POST | /wp-json/wp2tutor/rag/v1/datatables |
admin | контракт |
| GET | …/chunk/{id_chunk} |
admin | контракт |
wp2tutor-forms
Заголовок раздела «wp2tutor-forms»Спека: docs/openapi/wp2tutor-forms.{en,ru}.yaml. Свои NS wp2tutor-forms/form/v1 и wp2tutor-forms/i18n/v1 (не общий wp2tutor/v1). Form: cookie / Application Password (logged-in). i18n: public. Модуль wp2tutor_form через platform modules list.
| METHOD | Path | OpenAPI |
|---|---|---|
| POST | /wp-json/wp2tutor-forms/form/v1/updateDefinition |
контракт |
| POST | …/updateShortcode |
контракт |
| POST | …/updateStyles |
контракт |
| POST | …/updateL10n |
контракт |
| POST | …/updateRunner |
контракт |
| GET | …/getRunnerData |
контракт |
| GET | /wp-json/wp2tutor-forms/i18n/v1/locale |
контракт |
| GET | …/translation |
контракт |
wp2tutor-bot
Заголовок раздела «wp2tutor-bot»Спека: docs/openapi/wp2tutor-bot.{en,ru}.yaml. Публичные webhooks. При выкладке сменить URL в Telegram/VK.
| METHOD | Path | Auth | OpenAPI |
|---|---|---|---|
| POST | /wp-json/wp2tutor-bot/telegram/v1/webhook/{bot_id} |
public | контракт |
| POST | /wp-json/wp2tutor-bot/vk/v1/callback/{channel_id} |
public | контракт |
| POST | /wp-json/wp2tutor-bot/deepchat/v1/chat/{channel_id} |
public + X-Wp2tutor-Bot-Secret |
контракт |
| OPTIONS | …/chat/{channel_id} |
public CORS | контракт |
Клиенты: Telegram/VK, Deep Chat UI (секрет канала не в бандле клиента).
Вне scope (намеренно нет в YAML продуктов)
Заголовок раздела «Вне scope (намеренно нет в YAML продуктов)»- AJAX
admin-ajax.php, WP-CLI. - Core
/wp/v2/*, AnalogWP REST, Elementor/WPML чужие namespace. - Библиотека
wp2-wordpress-coreкак отдельный API (License описан у platform). - Темы / skin-блоки, deprecated отдельные плагины.
- WP2 Wrapper — JS API, не WordPress REST.