Инвентарь REST → OpenAPI
Фаза 3: канонические YAML — полноценный контракт (requestBody / security / WpError / коды ответов), не только каталог path’ов. URL — {product}/{slug}/v1. Канон YAML — в плагине docs/openapi/*.yaml. Сайт копирует спеки (npm run sync:openapi) и генерирует MDX (npm run gen-api-docs). Сверка: npm run audit:openapi (path-coverage + глубина: тело или x-empty-body, security, ru/en коды). Исключения сканера: vendor, vendor-lib, tests, includes/analogwp-*. License регистрируется из wp2platform/plugin.php через контроллер wordpress-core — в аудит добавлен явно.
Колонка OpenAPI: контракт — операция описана в YAML с входом/выходом/ошибками.
WP_REST_Server::EDITABLE в PHP = POST|PUT|PATCH; в OpenAPI обычно документирован PATCH (этого достаточно для coverage). CREATABLE = POST, READABLE = GET, DELETABLE = DELETE.
wp2platform
Спека: docs/openapi/wp2platform-modules.yaml → /docs/api/wp2platform. Auth по умолчанию: cookie / Application Password (DualRest), сеть.
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
| 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
| 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
| METHOD | Path | OpenAPI |
|---|---|---|
| GET/POST | /wp-json/wp2/multi-network/v1/networks | контракт |
| GET | …/networks/{network_id} | контракт |
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
Клиент: скилл 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
| 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)
Клиент: 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
Клиенты: скилл 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 | контракт |
Sections Folder — wp2/sections-folder/v1
Клиент: админка Gutenberg sidebar. manage_categories + edit_posts. Create/delete секций — core /wp/v2/{taxonomy}, не этот API.
| METHOD | Path | OpenAPI |
|---|---|---|
| GET | /wp-json/wp2/sections-folder/v1/sidebar | контракт |
| PUT | …/reorder | контракт |
| PUT | …/assign | контракт |
| PATCH (EDITABLE) | …/sections/{id} | контракт |
Passwordless — wp2/passwordless/v1 (public)
Клиент: WP2 App SPA (AuthContext).
| METHOD | Path | OpenAPI |
|---|---|---|
| POST | /wp-json/wp2/passwordless/v1/request | контракт |
| POST | …/verify | контракт |
Magic Links — wp2/magic-links/v1 (public)
Клиент: WP2 App SPA.
| METHOD | Path | OpenAPI |
|---|---|---|
| POST | /wp-json/wp2/magic-links/v1/consume | контракт |