- specs/: Apple's App Store Connect OpenAPI 4.5.1 and the Google discovery docs for androidpublisher v3 and playdeveloperreporting v1beta1, pinned with URL, date and SHA-256 (specs/SOURCES.json) - tools/gen-api.ts: one row per operation (cli/api/apple.gen.ts 1303, cli/api/play.gen.ts 170), a scan of which operations the commands already call (cli/api/wrapped.gen.ts) and docs/api-coverage.md; CI checks freshness - cli/api/client.ts + types.ts: generic URL / parameter building, retries with Retry-After, pagination, types derived from the rows; auth reuses ascJwt and the Play service account - cli/api/gate.ts: GET runs, writes dry unless --yes in a TTY, owner-only operations need the id typed, nothing written under MCP or serve; MCP gets the read-only api_get - storebound api list | coverage | apple|play <op|METHOD path>; skill store-api, README, CHANGELOG, tests
4.4 KiB
4.4 KiB
| name | description |
|---|---|
| store-api | Call any App Store Connect API or Google Play Developer API operation that storebound's commands do not wrap, safely - `storebound api list / coverage` to find it, `storebound api apple|play <operationId>` (or `METHOD path`) to call it, with GETs run freely, writes dry until the owner sends them with --yes in a terminal, and owner-only operations (submit, release, delete, cancel, prices, testers, replies) needing the operation id typed. Use when the user needs a store feature with no storebound command (custom product pages, Game Center, app clips, users, purchases, sales reports, edit-level Play reads) or asks whether an endpoint is supported. |
Store API (every endpoint)
storebound covers the release journey with high-level commands. Everything else in the App Store Connect API
(1303 operations) and the Google Play Developer APIs (Android Publisher v3: 145, Reporting v1beta1: 25) is reachable
through storebound api, generated from the official specs pinned in specs/. Prefer a high-level command whenever
one exists (storebound api coverage and docs/api-coverage.md show which operations a command already wraps): those
are idempotent, check the config and know the store's rules.
Find the operation
storebound api list --store apple --search "appCustomProductPages"(words match the id, method and path;--json).storebound api coverage: counts per API and per resource, and how many a command already wraps.- The full table with gates: docs/api-coverage.md in the storebound repository.
- Apple ids look like
apps_getCollection,appStoreVersions_updateInstance,apps_customerReviews_getToManyRelated. Google ids look likeandroidpublisher.edits.tracks.list(theandroidpublisher.prefix may be left out).
Read (runs right away; MCP tool api_get)
storebound api apple apps_getCollection --param 'filter[bundleId]=com.example.app' --param 'fields[apps]=name,sku'
storebound api apple GET '/v1/apps/<id>/appStoreVersions?filter[platform]=IOS' --all-pages
storebound api play reviews.list --param packageName=com.example.app --all-pages --json
storebound api play POST /v1beta1/apps/com.example.app/crashRateMetricSet:query --body query.json # a read
storebound api apple salesReports_getCollection --param ... --out report.gz # non-JSON bodies need --out
- Parameters:
--param name=value, repeatable; lists are comma-separated (Apple) or repeated (Google). Missing required parameters and unknown names are errors before anything is sent. --all-pagesfollows Apple'slinks.nextand Google's page tokens and merges the pages.- Play edit-scoped reads (
edits.*.get/list) need an edit id, and opening an edit (edits.insert) is a write: usestorebound play statusfor those reads instead of opening edits by hand. - MCP:
api_getwithstore,operation,params(object) andall_pages. It runs GET operations only.
Write (only the owner sends)
- Run the write without
--yes: it prints the exact request (method, URL, body; the key is never shown) and sends nothing. Show that to the owner. - The owner runs it in their own terminal with
--yes. Outside an interactive terminal, under MCP or in the desktop app, a write is never sent, whatever the flags. - Owner-only operations (cli/api/gate.ts: every DELETE, submissions and their cancel, release requests, phased
release changes, product page test start / stop, price schedules and price migrations, review replies, tester and
user invitations, Play
edits.commit, product activation, refunds, revokes and cancels, app signing) also ask for the operation id to be typed at the prompt. Never try to get around this: tell the owner what the call does and let them run it (AGENTS.md rule 1).
Bodies: --body file.json (Apple: a JSON:API document { "data": { "type": ..., "attributes": ..., "relationships": ... } }),
--upload file for Google media uploads (bundles, APKs, images).
Rules
- Credentials only from env or
.storebound/(same keys as every other command); never ask for them in chat. - Never answer compliance questions through raw calls (age rating, App Privacy, Data safety, export compliance): the matching skill and the owner decide.
- Rate limits: storebound retries 429 and 5xx with backoff (Retry-After honoured) and prints Apple's remaining hourly
quota; long
--all-pagesruns go to the background with a log (> .storebound/api.log 2>&1 &).