Skip to main content

REST → OpenAPI Inventory

Phase 3: canonical YAML is a full contract (requestBody / security / WpError / response codes), not only a path catalog. URLs are {product}/{slug}/v1. Canonical YAML lives in the plugin at docs/openapi/*.yaml. The site copies the specs (npm run sync:openapi) and generates MDX (npm run gen-api-docs). Audit: npm run audit:openapi (path-coverage plus depth: body or x-empty-body, security, ru/en status codes). Scanner exclusions: vendor, vendor-lib, tests, includes/analogwp-*. License is registered from wp2platform/plugin.php through the wordpress-core controller and is added to the audit explicitly.

OpenAPI column: contract — the operation is described in YAML with input/output/errors.

WP_REST_Server::EDITABLE in PHP = POST|PUT|PATCH; OpenAPI usually documents PATCH (this is sufficient for coverage). CREATABLE = POST, READABLE = GET, DELETABLE = DELETE.


wp2platform

Spec: docs/openapi/wp2platform-modules.yaml/docs/api/wp2platform. Default auth: cookie / Application Password (DualRest), network.

Site Manager — wp2/site-manager/v1

Clients: Site Manager admin UI. blog_id in path.

METHODPathOpenAPI
GET/wp-json/wp2/site-manager/v1/sitescontract
POST…/sitescontract
GET…/sites/slug-availabilitycontract
POST…/sites/bulkcontract
GET…/sites/{blog_id}contract
PATCH (EDITABLE)…/sites/{blog_id}contract
DELETE…/sites/{blog_id}contract
POST…/sites/{blog_id}/archivecontract
POST…/sites/{blog_id}/unarchivecontract
POST…/sites/{blog_id}/activatecontract
POST…/sites/{blog_id}/deactivatecontract
GET…/sites/{blog_id}/userscontract
POST…/sites/{blog_id}/userscontract
DELETE…/sites/{blog_id}/users/{user_id}contract
GET/POST…/categoriescontract
PATCH/DELETE…/categories/{id}contract
GET/POST…/statusescontract
PATCH/DELETE…/statuses/{id}contract
GET…/jobscontract
GET…/jobs/{job_id}contract
GET…/jobs/{job_id}/eventscontract

Site Duplicator — wp2/site-duplicator/v1

METHODPathOpenAPI
POST/wp-json/wp2/site-duplicator/v1/sites/{blog_id}/duplicatecontract
GET…/jobs, …/jobs/{job_id}, …/jobs/{job_id}/eventscontract

Post Duplicator — wp2/post-duplicator/v1

METHODPathOpenAPI
POST/wp-json/wp2/post-duplicator/v1/posts/{post_id}/duplicatecontract
POST…/posts/{post_id}/duplicate-batchcontract

Multi Network — wp2/multi-network/v1

METHODPathOpenAPI
GET/POST/wp-json/wp2/multi-network/v1/networkscontract
GET…/networks/{network_id}contract

Media Converter — wp2/media-converter/v1

Clients: media-hls-encode, media-whisper-tracks skills (formats, attachments, artifacts/pack). Query blog_id on some endpoints.

METHODPathOpenAPI
GET…/media-converter/v1/formatscontract
GET/PATCH…/settingscontract
POST…/media, …/encodecontract
GET…/attachments/{id}contract
POST…/attachments/{id}/encodecontract
GET…/queue, …/queue/{key}contract
POST…/queue/control, …/queue/clearcontract
DELETE…/queue/{key}contract
POST…/queue/{key}/formats/{format}/cancelcontract
GET/POST/DELETE…/attachments/{id}/frame-miniaturescontract
GET/POST…/attachments/{id}/thumbnailscontract
PATCH/DELETE…/attachments/{id}/thumbnails/postercontract
GET…/attachments/{id}/artifactscontract
POST…/attachments/{id}/artifacts/packcontract
PATCH/DELETE…/attachments/{id}/artifacts/{folder}contract

Subtitles & Timecodes — wp2/media-subtitles-timecodes/v1

Client: media-whisper-tracks skill.

METHODPathOpenAPI
GET/POST/PUT…/media-subtitles-timecodes/v1/attachments/{id}/trackscontract
POST…/tracks/uploadcontract
PATCH/DELETE…/tracks/{index}contract

Enable Media Replace — wp2/enable-media-replace/v1

METHODPathOpenAPI
GET…/enable-media-replace/v1/attachments/{id}/replace-infocontract
POST…/attachments/{id}/replacecontract

Error: playback_artifacts_present (409) if playback artifacts are associated with the attachment.

Studio Sync — wp2/studio-sync/v1 (already the phase 2 canonical form)

Client: WP2Studio (STUDIO_SYNC_REST_BASE). Auth: public on POST /desktop/connect; then Bearer. PHP: src/Modules/StudioSync/. Do not rework.

METHODPathAuthOpenAPI
POST/wp-json/wp2/studio-sync/v1/desktop/connectpublic (one-time token)contract
GET…/desktop/statusBearercontract
POST…/desktop/disconnectBearercontract
GET…/sitesBearercontract
GET…/statusBearer (legacy)contract
GET…/sync/itemsBearercontract
GET…/sync/posts/{post_id}Bearercontract
PATCH (EDITABLE)…/sync/posts/{post_id}Bearer, body base_hash+contentcontract

Local Sync — wp2/local-sync/v1

Clients: 09-local-sync skill, page-builder pipeline (POST /validate). Capability: manage_network (MS) / edit_pages. Query blog_id.

METHODPathOpenAPI
GET/wp-json/wp2/local-sync/v1/projectscontract
POST…/synccontract
POST…/validatecontract

Sections Folder — wp2/sections-folder/v1

Client: Gutenberg sidebar admin UI. manage_categories + edit_posts. Creating/deleting sections uses core /wp/v2/{taxonomy}, not this API.

METHODPathOpenAPI
GET/wp-json/wp2/sections-folder/v1/sidebarcontract
PUT…/reordercontract
PUT…/assigncontract
PATCH (EDITABLE)…/sections/{id}contract

Passwordless — wp2/passwordless/v1 (public)

Client: WP2 App SPA (AuthContext).

METHODPathOpenAPI
POST/wp-json/wp2/passwordless/v1/requestcontract
POST…/verifycontract

Client: WP2 App SPA.

METHODPathOpenAPI
POST/wp-json/wp2/magic-links/v1/consumecontract

Elementor Style Presets — wp2/elementor-style-presets/v1

Client: Elementor admin UI. edit_posts.

METHODPathOpenAPI
GET/POST/wp-json/wp2/elementor-style-presets/v1/presetscontract
GET…/presets/{id}contract
PATCH (EDITABLE)…/presets/{id}contract

Media Playback — wp2/media-playback/v1

Clients: players (Vidstack and others). Query blog_id, lang.

METHODPathOpenAPI
GET/wp-json/wp2/media-playback/v1/attachments/{id}contract

License — wp2/license/v1 (platform product)

Registration: plugin.phpLicenseRestController('wp2', 'license', $hub). The wp2-wordpress-core repository is not documented separately. Auth: manage_network_options / manage_options.

METHODPathOpenAPI
GET/wp-json/wp2/license/v1/productscontract
POST…/{product_id}/activatecontract
POST…/{product_id}/deactivatecontract
GET…/{product_id}/statuscontract
GET…/{product_id}/datacontract

wp2lms

Spec: docs/openapi/wp2lms.yaml.

Static Builder — wp2lms/static-builder/v1

Clients: 10-static-builder skill, 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, create_failed, configure_failed, update_failed, delete_failed, page_cache_rebuild.

METHODPathOpenAPI
GET/wp-json/wp2lms/static-builder/v1/pagescontract
GET/POST…/buildscontract
GET/PATCH/DELETE…/builds/{id}contract
POST…/builds/{id}/runcontract
POST…/builds/{id}/stopcontract

Turbo — wp2lms/turbo/v1

Clients: Turbo frontend (Gutenberg/Twig), Gravity Forms bridge, xAPI session.

METHODPathAuthOpenAPI
POST/wp-json/wp2lms/turbo/v1/xapi-actor/sessioncookie (email)contract
POST…/gravity-forms/submitcookiecontract
POST…/dsh/expandcookiecontract
GET…/static/{id}edit_postscontract

wp2lms-pro

Spec: docs/openapi/wp2lms-pro.yaml.

Embed Packages — wp2lms-pro/embed-packages/v1

The wp2platform/module/embed-packages/v1 alias is removed. Auth: manage_network / edit_pages. Query blog_id.

WP_Error: embed_packages_not_found, delete_failed, page_not_found, invalid_blog, unknown_blog.

METHODPathOpenAPI
GET/POST/wp-json/wp2lms-pro/embed-packages/v1/packagescontract
GET/PATCH/DELETE…/packages/{id}contract
POST…/packages/{id}/contentcontract
POST…/packages/{id}/materialize-pagescontract
GET/PUT/DELETE…/pages/{page_id}/packagecontract
POST…/batchcontract

wp2tutor

Spec: docs/openapi/wp2tutor.yaml. Namespaces are split per module. Bot is not in this spec (see wp2tutor-bot).

METHODPathAuthOpenAPI
GET / POST/wp-json/wp2tutor/ai/v1/chatGET public; POST X-Ai-Chat-Secretcontract
POST/wp-json/wp2tutor/embedding/v1/syncmanage_optionscontract
POST…/statusesmanage_optionscontract
POST…/diagnosticsmanage_optionscontract
GET/POST/wp-json/wp2tutor/rag/v1/datatablesadmincontract
GET…/chunk/{id_chunk}admincontract

wp2tutor-forms

Spec: docs/openapi/wp2tutor-forms.yaml. Own namespaces wp2tutor-forms/form/v1 and wp2tutor-forms/i18n/v1 (not shared wp2tutor/v1). Form: cookie (logged-in). i18n: public.

METHODPathOpenAPI
POST/wp-json/wp2tutor-forms/form/v1/updateDefinitioncontract
POST…/updateShortcodecontract
POST…/updateStylescontract
POST…/updateL10ncontract
POST…/updateRunnercontract
GET…/getRunnerDatacontract
GET/wp-json/wp2tutor-forms/i18n/v1/localecontract
GET…/translationcontract

wp2tutor-bot

Spec: docs/openapi/wp2tutor-bot.yaml. Public webhooks. Change the URL in Telegram/VK when deploying.

METHODPathAuthOpenAPI
POST/wp-json/wp2tutor-bot/telegram/v1/webhook/{bot_id}publiccontract
POST/wp-json/wp2tutor-bot/vk/v1/callback/{channel_id}publiccontract
POST/wp-json/wp2tutor-bot/deepchat/v1/chat/{channel_id}public + X-Wp2tutor-Bot-Secretcontract
OPTIONS…/chat/{channel_id}public CORScontract

Clients: Telegram/VK, Deep Chat UI; WP2 App proxies Deep Chat through wp2app/ai-chat/v1/chat (the secret is not in the bundle).


wp2app

Spec: onepix/wp2app/docs/openapi/wp2app.yaml/docs/api/wp2app. Cookie + wp_rest nonce. Passwordless/magic-links are not here (platform).

WP_Error: wp2app_auth_missing, wp2app_passwordless, wp2app_auth_failed, wp2app_reserved, wp2app_ai_chat_config, wp2app_ai_chat_secret.

METHODPathAuthOpenAPI
GET/wp-json/wp2app/auth/v1/mepublic (user: null for guests)contract
POST…/loginpubliccontract
POST…/logoutlogged-incontract
GET…/noncepubliccontract
POST…/lost-passwordpubliccontract
POST…/reset-passwordpubliccontract
GET/wp-json/wp2app/content/v1?path=logged-in / guests if Private Site is offcontract
GET…/{id}samecontract
POST/wp-json/wp2app/ai-chat/v1/chatlogged-in (wp2app/ai_chat/can_chat)contract
OPTIONS…/chatpubliccontract

Out of scope (intentionally absent from product YAML)

  • AJAX admin-ajax.php, WP-CLI.
  • Core /wp/v2/*, AnalogWP REST, third-party Elementor/WPML namespaces.
  • The wp2-wordpress-core library as a separate API (License is documented under platform).
  • Themes / skin blocks, wp2app-starter, deprecated standalone plugins.
  • WP2 Wrapper is a JS API, not WordPress REST.