# Storevisor API reference

> Every Storevisor tool over REST: the same 35 tools, wording and rules as the MCP server at https://storevisor.devino.ca/mcp. OpenAPI 3.1: https://storevisor.devino.ca/openapi.json

## Authentication

- Create a workspace key on the MCP & API page (read, or read and write; it is shown once) and send it as `Authorization: Bearer sws_…`.
- An OAuth access token this host issued for its MCP server works the same way.
- A key reaches one workspace. Revoking it on the MCP & API page stops it at once.
- A read key never reaches a write tool; a viewer's key, or any key in a workspace whose owner turned AI changes off, is read-only.

## Request and response

`POST https://storevisor.devino.ca/api/tools/<tool name>` with the tool's arguments as one JSON object (an empty body or `{}` when it needs none).

```sh
curl -X POST https://storevisor.devino.ca/api/tools/release_status \
  -H "Authorization: Bearer sws_…" \
  -H "Content-Type: application/json" \
  -d '{}'
```

- 200: the tool's own JSON answer.
- 400: the tool refused (`{"code": …, "message": …}`), the arguments did not match its schema, or the body was not JSON.
- 401, 404, 413, 429, 502, 503: refused before the tool ran. Every code: https://storevisor.devino.ca/docs/errors.md

OpenAPI 3.1: https://storevisor.devino.ca/openapi.json (generated from the same tool definitions the MCP server lists).

## Writes: preview first, then confirm

1. Call the write tool with its arguments. Nothing reaches the store: the answer is a preview (the diff or plan) with a `confirm_token` (for example `play_rollout_update`).
2. Repeat the same call with `"apply": true` and `"confirmToken": "<the token>"`. When the preview returned `commit_args`, merge them into the arguments: they pin the store state the preview saw, and a store that changed since is refused.
3. The token is single use, valid 10 minutes, and bound to the key or connection, the tool and those exact arguments.
4. A preview with `"status": "rejected"` carries no token and cannot be committed.

## Limits

- 60 calls a minute per key or AI connection, MCP and API together. Over it: 429 `rate_limited` with a `Retry-After` header (seconds) and `retry_after_s` in the body.
- Request bodies up to 256 KB (413 above).
- A call runs at most 15 minutes (502 after). When every worker is busy: 503 with `Retry-After: 5`.
- Answers are capped (at most 200 rows per read, 500 for `sql_query` where offered).

## Tools (35)

### apple_listing_get (read)

Apple: read the live App Store listing. Reads the CURRENT App Store listing for an app straight from App Store Connect (not the warehouse cache): name, subtitle, keywords, description, promotional text, what's new, URLs, and a screenshot-set summary per…

- `app` (required): string. app slug, Apple app id, or app name
- `locale`: string. e.g. en-US, en-CA. Omit for all locales.
- `platform`: "IOS" | "MAC_OS" | "TV_OS" | "VISION_OS". default: iOS preferred

### apple_listing_update (write)

Apple: update App Store listing metadata (gated). Proposes a listing metadata change. ALWAYS snapshots the current listing first and records the change in listing_changes.

- `app` (required): string.
- `locale` (required): string. exact ASC locale, e.g. en-US
- `fields` (required): object. only the fields you want to change
- `platform`: "IOS" | "MAC_OS" | "TV_OS" | "VISION_OS". whose version the version fields land on; default: iOS preferred
- `rationale` (required): string. why this change — stored in the audit log
- `apply`: boolean. true = commit for real. Requires the confirmToken returned by the preceding dry-run of this exact call.
- `confirmToken`: string. The confirm_token from the dry-run preview (single use, 10-minute TTL).

### apple_cpp_list (read)

Apple: list custom product pages. Lists App Store custom product pages (CPPs) for an app, with their versions and states.

- `app` (required): string.

### apple_cpp_create (write)

Apple: create a custom product page (gated). Creates a custom product page with one localization (promotional text only — screenshots are out of scope in this version).

- `app` (required): string.
- `name` (required): string. internal CPP name (not customer visible)
- `locale` (required): string.
- `promotionalText` (required): string. max 170 chars
- `rationale` (required): string.
- `apply`: boolean. true = commit for real. Requires the confirmToken returned by the preceding dry-run of this exact call.
- `confirmToken`: string. The confirm_token from the dry-run preview (single use, 10-minute TTL).

### apple_screenshots_get (read)

Apple: read App Store screenshot sets. Reads the screenshot sets live from App Store Connect for the EDITABLE App Store version when one exists (that is the only surface a write can touch), otherwise the live version.

- `app` (required): string. app slug, Apple app id, or app name
- `locale`: string. e.g. en-US. Omit for all locales on the version.
- `platform`: "IOS" | "MAC_OS" | "TV_OS" | "VISION_OS". whose version to read (each platform has its own). Omit = every platform, iOS preferred

### apple_screenshot_delete (write)

Apple: delete an App Store screenshot (gated). Deletes one screenshot from a display-type set on the EDITABLE App Store version's localization.

- `app` (required): string.
- `locale` (required): string.
- `displayType` (required): "APP_IPHONE_67" | "APP_IPHONE_65" | "APP_IPHONE_61" | "APP_IPHONE_58" | "APP_IPHONE_55" | "APP_IPHONE_47" | "APP_IPHONE_40" | "APP_IPHONE_35" | ….
- `screenshotId` (required): string. appScreenshots resource id from apple_screenshots_get
- `platform`: "IOS" | "MAC_OS" | "TV_OS" | "VISION_OS". default = the display type's own; a mismatch is refused
- `rationale` (required): string.
- `apply`: boolean. true = commit for real. Requires the confirmToken returned by the preceding dry-run of this exact call.
- `confirmToken`: string. The confirm_token from the dry-run preview (single use, 10-minute TTL).

### apple_screenshots_copy (write)

Apple: copy one localization's screenshots to another (gated). Copies the screenshot sets of `from_locale` onto `to_locale` of the SAME platform's EDITABLE App Store version (every display type, or only `display_types`).

- `app` (required): string.
- `from_locale` (required): string. the localization to copy FROM, e.g. en-US
- `to_locale` (required): string. the localization to copy TO, e.g. en-CA (must already exist on the editable version)
- `display_types`: array of "APP_IPHONE_67" | "APP_IPHONE_65" | "APP_IPHONE_61" | "APP_IPHONE_58" | "APP_IPHONE_55" | "APP_IPHONE_47" | "APP_IPHONE_40" | "APP_IPHONE_35" | …. only these sets; default every set of from_locale on the platform
- `platform`: "IOS" | "MAC_OS" | "TV_OS" | "VISION_OS". default = the display types' own platform, else IOS
- `replace_existing`: boolean. delete the target's screenshots of each copied display type first (default: refuse when it has any)
- `expect_editable_version_id`: string. from commit_args; required on the commit, refused on mismatch
- `expect_source_ids`: array of string. from commit_args: <displayType>:<id> of every source shot; required on the commit, refused on mismatch
- `expect_target_ids`: array of string. from commit_args: <displayType>:<id> of every target shot replaced ([] = none); required on the commit, refused on mismatch
- `rationale` (required): string. why — stored in the audit log
- `apply`: boolean. true = commit for real. Requires the confirmToken returned by the preceding dry-run of this exact call.
- `confirmToken`: string. The confirm_token from the dry-run preview (single use, 10-minute TTL).

### apple_release_status (read)

Apple: release state (live / in review / waiting build). Reads the app's release pipeline live from App Store Connect: every App Store version (versionString, appVersionState, platform, createdDate, releaseType) with its attached build (version, processingState,…

- `app` (required): string. app slug, Apple app id, or app name

### apple_cloud_workflow_update (write)

Apple: make an Xcode Cloud workflow archive a platform for the App Store (gated). Adds an APP_STORE_ELIGIBLE ARCHIVE action for a platform to an Xcode Cloud workflow (default "Release (tag)"), or lifts an existing archive of that platform to APP_STORE_ELIGIBLE — the way to get macOS builds of a Mac…

- `app` (required): string.
- `platform` (required): "MACOS" | "IOS" | "VISIONOS". the platform to archive for the App Store
- `workflow`: string. workflow id or exact name; default "Release (tag)"
- `expect_workflow_id`: string. from commit_args; required on the commit
- `expect_actions`: string. from commit_args: the action list the preview saw; required on the commit
- `rationale` (required): string. why — stored in the audit log
- `apply`: boolean. true = commit for real. Requires the confirmToken returned by the preceding dry-run of this exact call.
- `confirmToken`: string. The confirm_token from the dry-run preview (single use, 10-minute TTL).

### apple_cloud_build_create (write)

Apple: start an Xcode Cloud release build (gated). Starts ONE Xcode Cloud build of the app's store-eligible workflow on a branch or tag — the way to get a build App Review accepts without a Mac.

- `app` (required): string.
- `git_reference` (required): string. branch or tag name to build, e.g. main or v1.2.0
- `workflow`: string. workflow id or exact name; default = the one store-eligible workflow, preferring "Release (tag)"
- `expect_workflow_id`: string. from commit_args: the workflow the preview resolved; required on the commit
- `expect_git_reference_id`: string. from commit_args: the git reference the preview resolved; required on the commit
- `rationale` (required): string. why — stored in the audit log
- `apply`: boolean. true = commit for real. Requires the confirmToken returned by the preceding dry-run of this exact call.
- `confirmToken`: string. The confirm_token from the dry-run preview (single use, 10-minute TTL).

### apple_version_submit (write)

Apple: submit a prepared version for review (gated). Submits an EXISTING App Store version for App Review — attaches nothing new.

- `app` (required): string.
- `version_string` (required): string. exact versionString of the prepared App Store version, e.g. 3.2.0
- `expect_build_id`: string. the build id the preview showed (from commit_args); required on the commit, refused on mismatch
- `with_products`: boolean. also submit every READY_TO_SUBMIT subscription / in-app purchase with this version (first products must ride with a version)
- `expect_products`: array of string. from commit_args (with_products only): the kind:id list of products the preview saw; required on the commit, refused on mismatch
- `expect_submission_id`: string. from commit_args (resubmission only): the UNRESOLVED_ISSUES submission id the preview saw; required on the commit, refused on mismatch
- `platform`: "IOS" | "MAC_OS" | "TV_OS" | "VISION_OS". which platform's version to submit when the same versionString exists on several (default IOS)
- `expect_draft_submission_id`: string. from commit_args: the empty never-submitted draft submission the preview chose to reuse (Apple will not cancel one); refused on mismatch
- `rationale` (required): string. why — stored in the audit log
- `apply`: boolean. true = commit for real. Requires the confirmToken returned by the preceding dry-run of this exact call.
- `confirmToken`: string. The confirm_token from the dry-run preview (single use, 10-minute TTL).

### apple_version_release (write)

Apple: release an approved version that waits on a manual release (gated). Releases an App Store version that App Review has ALREADY approved and that waits on the developer (appVersionState PENDING_DEVELOPER_RELEASE — a version created with release_type MANUAL).

- `app` (required): string. app slug, Apple app id, or app name
- `platform`: "IOS" | "MAC_OS" | "TV_OS" | "VISION_OS". default IOS — each platform's version is released separately
- `expect_version_id`: string. from commit_args: the pending version id the preview showed; required on the commit, refused on mismatch
- `rationale` (required): string. why — stored in the audit log
- `apply`: boolean. true = commit for real. Requires the confirmToken returned by the preceding dry-run of this exact call.
- `confirmToken`: string. The confirm_token from the dry-run preview (single use, 10-minute TTL).

### apple_submission_cancel (write)

Apple: withdraw a version from App Review / cancel a review submission (gated). Cancels ONE open review submission of a platform — App Store Connect's "Remove from Review" / "Cancel Submission" — with PATCH /v1/reviewSubmissions/{id} {canceled:true}.

- `app` (required): string. app slug, Apple app id, or app name
- `platform`: "IOS" | "MAC_OS" | "TV_OS" | "VISION_OS". default IOS — review submissions are per platform
- `submission_id`: string. the review submission to cancel (apple_release_status review_submissions); default = the one open on the platform
- `expect_submission_id`: string. from commit_args: the submission the preview chose; required on the commit, refused on mismatch
- `expect_state`: string. from commit_args: its state when the preview ran; required on the commit, refused on mismatch
- `rationale` (required): string. why — stored in the audit log
- `apply`: boolean. true = commit for real. Requires the confirmToken returned by the preceding dry-run of this exact call.
- `confirmToken`: string. The confirm_token from the dry-run preview (single use, 10-minute TTL).

### apple_builds_list (read)

Apple: list TestFlight builds (newest first). Lists the newest TestFlight builds for an app live from App Store Connect: id, build_number (CFBundleVersion), pre_release_version (the marketing version), platform, processing_state, uploaded_at, expired,…

- `app` (required): string. app slug, Apple app id, or app name
- `limit`: integer 1-25. newest N builds, default 10
- `platform`: "IOS" | "MAC_OS" | "TV_OS" | "VISION_OS". default IOS

### apple_testflight_overview (read)

Apple: TestFlight overview — beta groups, testers, builds in testing, tester feedback. Reads an app's TestFlight state live from App Store Connect — the truthful, citable answer to App Review's "what beta testing did you do?": every beta group (name, internal / external, public link enabled + URL + limit,…

- `app` (required): string. app slug, Apple app id, or app name
- `platform`: "IOS" | "MAC_OS" | "TV_OS" | "VISION_OS". only this platform's builds; default = every platform the app has builds for
- `builds_per_platform`: integer 1-25. newest N builds per platform, default 5
- `feedback_limit`: integer 1-50. newest N feedback items of each kind, default 20

### apple_version_create (write)

Apple: create the next App Store version (gated). Creates the NEXT App Store version (PREPARE_FOR_SUBMISSION) for a platform and optionally attaches a TestFlight build to it (ids from apple_builds_list).

- `app` (required): string.
- `version_string` (required): string. the marketing version to create, e.g. 1.4.0
- `platform`: "IOS" | "MAC_OS" | "TV_OS" | "VISION_OS". default IOS
- `build_id`: string. TestFlight build id to attach right after creating (from apple_builds_list)
- `copyright`: string. e.g. 2026 Example Inc.
- `release_type`: "MANUAL" | "AFTER_APPROVAL" | "SCHEDULED". MANUAL | AFTER_APPROVAL | SCHEDULED
- `earliest_release_date`: string. ISO 8601; required with (and only with) release_type SCHEDULED
- `expect_editable_version_id`: string | null. from commit_args: null = the preview saw no editable version for the platform; required on the commit, refused on mismatch
- `rationale` (required): string. why — stored in the audit log
- `apply`: boolean. true = commit for real. Requires the confirmToken returned by the preceding dry-run of this exact call.
- `confirmToken`: string. The confirm_token from the dry-run preview (single use, 10-minute TTL).

### apple_version_build_attach (write)

Apple: attach a TestFlight build to the editable version (gated). Attaches (or replaces) the TestFlight build on the EDITABLE App Store version of a platform (PREPARE_FOR_SUBMISSION / *_REJECTED) — the step between apple_version_create and apple_version_submit.

- `app` (required): string.
- `build_id` (required): string. TestFlight build id to attach (from apple_builds_list)
- `platform`: "IOS" | "MAC_OS" | "TV_OS" | "VISION_OS". default IOS
- `expect_build_id`: string | null. from commit_args: the build id attached when the preview ran (null = none); required on the commit when a build is attached, refused on mismatch
- `rationale` (required): string. why — stored in the audit log
- `apply`: boolean. true = commit for real. Requires the confirmToken returned by the preceding dry-run of this exact call.
- `confirmToken`: string. The confirm_token from the dry-run preview (single use, 10-minute TTL).

### apple_app_setup_update (write)

Apple: first-release App Store setup — content rights, free price, privacy URL, copyright, App Review details (gated). Sets the first-release fields App Review refuses a submission without, through App Store Connect's public API: content_rights_declaration (PATCH /v1/apps), price: "free" (POST /v1/appPriceSchedules, base territory USA,…

- `app` (required): string. app slug, Apple app id, or app name
- `platform`: "IOS" | "MAC_OS" | "TV_OS" | "VISION_OS". default IOS — the platform whose editable version copyright / review_detail land on
- `version_string`: string. the editable version to target; default the platform's editable version
- `content_rights_declaration`: "DOES_NOT_USE_THIRD_PARTY_CONTENT" | "USES_THIRD_PARTY_CONTENT". does the app show, include or access third-party content?
- `price`: string. "free" only — anything else is refused (paid pricing is an owner decision)
- `privacy_policy_url`: string (uri). https URL of the privacy policy
- `privacy_policy_locales`: array of string. only these appInfo locales; default every locale of the editable appInfo
- `copyright`: string, ≤ 200 chars. e.g. "© 2026 14930398 Canada Inc."
- `review_detail`: object. App Review contact + sign-in details for the version
- `review_detail_from_platform`: "IOS" | "MAC_OS" | "TV_OS" | "VISION_OS". instead of review_detail: copy the App Review details (demo password included, never shown) from this other platform's newest version
- `review_detail_from_app`: string. instead of review_detail: copy ONLY the App Review contact (first/last name, phone, e-mail) from this other app's newest version — never its demo account or notes
- `expect_editable_version_id`: string | null. from commit_args: the editable version id the preview saw (null = none); required on the commit, refused on mismatch
- `rationale` (required): string. why — stored in the audit log
- `apply`: boolean. true = commit for real. Requires the confirmToken returned by the preceding dry-run of this exact call.
- `confirmToken`: string. The confirm_token from the dry-run preview (single use, 10-minute TTL).

### play_listing_get (read)

Play: get store listing. Read a Google Play store listing live from androidpublisher (title, short/full description, video, image counts per type).

- `app` (required): string. app slug or Play package name
- `locale`: string. BCP-47 Play language, e.g. en-US. Omit for all locales.

### play_listing_locales (read)

Play: list every localized store listing. Every localization of a Google Play store listing, live from androidpublisher edits.listings.list (language, title, shortDescription, fullDescription, video + character counts against Play's limits).

- `app` (required): string. app slug or Play package name

### play_listing_update (write)

Play: update store listing, or add a new language (gated). Change Play listing text, or CREATE a localization by passing a `locale` the listing does not have yet together with `create_locale: true` (then title, shortDescription and fullDescription are all required — Play…

- `app` (required): string.
- `locale` (required): string. Play language, e.g. en-US (case-sensitive). A language the listing does not have yet is CREATED only with create_locale: true.
- `fields` (required): object. only the fields you want to change (all three text fields when creating a new locale)
- `keep_existing_fields`: boolean. default true: fields you do not pass keep their live value. false: the localization becomes exactly the fields you pass.
- `create_locale`: boolean. default false: a locale the listing does not have is REFUSED. true: create it (all three text fields required).
- `rationale` (required): string. why this change is being made — stored in the audit log
- `apply`: boolean. true = commit for real. Requires the confirmToken returned by the preceding dry-run of this exact call.
- `confirmToken`: string. The confirm_token from the dry-run preview (single use, 10-minute TTL).

### play_app_details_get (read)

Play: contact details + default language. The app's store contact details (contactEmail, contactPhone, contactWebsite) and default language, live from androidpublisher edits.details through a throwaway edit that is always deleted.

- `app` (required): string. app slug or Play package name

### play_app_details_update (write)

Play: set contact details / default language (gated). Sets the store contact e-mail, phone, website and/or default language (a Play dashboard setup task) through edits.details.

- `app` (required): string.
- `fields` (required): object.
- `rationale` (required): string. why — stored in the audit log
- `apply`: boolean. true = commit for real. Requires the confirmToken returned by the preceding dry-run of this exact call.
- `confirmToken`: string. The confirm_token from the dry-run preview (single use, 10-minute TTL).

### play_data_safety_update (write)

Play: replace the Data safety declaration (gated). Replaces the app's whole Data safety declaration through applications.dataSafety, using the CSV format Play Console exports (App content → Data safety → Export to CSV; columns Question ID / Response ID / Response value…

- `app` (required): string.
- `file_path`: string. not usable in the cloud (a server directory); pass csv instead
- `csv`: string, ≤ 200000 chars. the CSV text itself
- `rationale` (required): string. why — stored in the audit log
- `apply`: boolean. true = commit for real. Requires the confirmToken returned by the preceding dry-run of this exact call.
- `confirmToken`: string. The confirm_token from the dry-run preview (single use, 10-minute TTL).

### play_release_status (read)

Play: release state per track. Reads every Play track (internal, alpha, beta, production, custom) live from androidpublisher with its releases: status (draft | inProgress | halted | completed), name, versionCodes, userFraction for staged rollouts,…

- `app` (required): string. app slug or Play package name

### play_release_promote (write)

Play: promote a release to another track (gated). Promotes the latest completed (else in-progress) release of `from_track` onto `to_track` via edits.tracks.update + edits.commit.

- `app` (required): string.
- `from_track` (required): string. internal | alpha | beta | production | a custom track name
- `to_track` (required): string.
- `user_fraction`: number 0-1. staged rollout fraction, e.g. 0.1 for 10%; omit or 1 = full release
- `release_notes`: object. { 'en-US': 'What changed' } — replaces the source release's notes
- `replace_draft`: boolean. true = discard a never-rolled DRAFT on to_track that carries the same version codes and put the promoted release there instead (that draft's notes are lost); without it such a draft is a refusal, and the flag with no such draft is refused too
- `expect_version_codes`: array of integer -9007199254740991-9007199254740991. the version codes the preview showed (from commit_args); required on the commit, refused on mismatch
- `rationale` (required): string. why — stored in the audit log
- `apply`: boolean. true = commit for real. Requires the confirmToken returned by the preceding dry-run of this exact call.
- `confirmToken`: string. The confirm_token from the dry-run preview (single use, 10-minute TTL).

### play_rollout_update (write)

Play: change or halt a staged rollout (gated). Moves a track's staged rollout: `user_fraction` raises it (Play never lets a fraction go down; 1 completes the rollout), `halt: true` halts it.

- `app` (required): string.
- `track` (required): string. the track carrying the staged rollout, usually production
- `user_fraction`: number 0-1. new fraction, must be above the current one; 1 = complete the rollout
- `halt`: boolean. true = halt the rollout (mutually exclusive with user_fraction)
- `expect_version_codes`: array of integer -9007199254740991-9007199254740991. the version codes the preview showed (from commit_args); required on the commit, refused on mismatch
- `rationale` (required): string. why — stored in the audit log
- `apply`: boolean. true = commit for real. Requires the confirmToken returned by the preceding dry-run of this exact call.
- `confirmToken`: string. The confirm_token from the dry-run preview (single use, 10-minute TTL).

### ms_listing_get (read)

Microsoft Store listing (live). Live Partner Center listing for an app: description, short description, features, search terms, image slots.

- `app` (required): string. app slug, app name, or Microsoft product id
- `lang`: string. listing locale, default en-us

### ms_release_status (read)

Microsoft Store release state (live). Live Partner Center release state for an app: the last published submission and the pending one — status, statusDetails (errors, warnings, certification reports), targetPublishMode, and every package with its version,…

- `app` (required): string. app slug, app name, or Microsoft product id

### ms_listing_update (write)

Microsoft Store listing update (gated write). Propose a Microsoft Store listing change.

- `app` (required): string. app slug, app name, or Microsoft product id
- `lang` (required): string. listing locale, e.g. en-us
- `fields` (required): object. only the listing fields you want changed
- `rationale` (required): string. why this change — stored in the listing_changes audit log
- `apply`: boolean. true = commit for real. Requires the confirmToken returned by the preceding dry-run of this exact call.
- `confirmToken`: string. The confirm_token from the dry-run preview (single use, 10-minute TTL).

### ms_submission_create (write)

Microsoft Store: create a pending submission (gated). Creates a new pending submission on an app, cloned from the last published one (POST /submissions) — the first step of a release: create, upload the package (package upload is not in the cloud yet), then…

- `app` (required): string. app slug, app name, or Microsoft product id
- `rationale`: string. why — stored in the audit log; defaults to a per-tool line naming the app + submission so commit_args always re-validates
- `expect_pending_submission_id`: string | null. from the preview's commit_args: null = no pending submission existed; required on the commit
- `apply`: boolean. true = commit for real. Requires the confirmToken returned by the preceding dry-run of this exact call.
- `confirmToken`: string. The confirm_token from the dry-run preview (single use, 10-minute TTL).

### ms_submission_commit (write)

Microsoft Store: commit the pending submission (gated). Commits the app's pending submission (POST /submissions/{id}/commit): Partner Center then runs pre-processing and certification, and publishes per the submission's targetPublishMode (a Manual mode still needs a human…

- `app` (required): string. app slug, app name, or Microsoft product id
- `rationale`: string. why — stored in the audit log; defaults to a per-tool line naming the app + submission so commit_args always re-validates
- `expect_submission_id`: string. the pending submission id the preview showed (from commit_args); required on the commit, refused on mismatch
- `expect_status`: string. the submission status the preview showed (PendingCommit); required on the commit, refused on mismatch
- `apply`: boolean. true = commit for real. Requires the confirmToken returned by the preceding dry-run of this exact call.
- `confirmToken`: string. The confirm_token from the dry-run preview (single use, 10-minute TTL).

### ms_submission_delete (write)

Microsoft Store: delete the pending submission (gated). Deletes the app's pending submission (DELETE /submissions/{id}) — the last published submission is untouched.

- `app` (required): string. app slug, app name, or Microsoft product id
- `rationale`: string. why — stored in the audit log; defaults to a per-tool line naming the app + submission so commit_args always re-validates
- `expect_submission_id`: string. the pending submission id the preview showed (from commit_args); required on the commit, refused on mismatch
- `apply`: boolean. true = commit for real. Requires the confirmToken returned by the preceding dry-run of this exact call.
- `confirmToken`: string. The confirm_token from the dry-run preview (single use, 10-minute TTL).

### release_status (read)

Release state across stores (live). One compact row per app x store, read live: live_version, pending_version, pending_state, latest_build, blocked_reason (null when nothing waits on you).

- `app`: string. app slug, app name, or a store id; omit for every app
- `stores`: array of "apple" | "play" | "microsoft". restrict to these stores (default: every configured store)

### review_watch_status (read)

App Review check state (no store call). What this workspace's App Review check saw on its last run, read from its saved state: NO store call.

- `app`: string. app slug to narrow to; omit for every app
