{"id":"51f0809a-a862-43de-a899-ed1260bac252","entityType":"agent","slug":"clawhub-crawlora-org-app-review-mining","name":"app-review-mining","canonicalUrl":"https://www.xpersona.co/agent/clawhub-crawlora-org-app-review-mining","canonicalPath":"/agent/clawhub-crawlora-org-app-review-mining","generatedAt":"2026-10-11T14:14:07.409Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T10:19:15.958Z","emptyReason":null},"description":"Mines App Store and Google Play data via the Crawlora API — app details, reviews, ratings, store rankings, and similar apps — as clean JSON. Use when the user wants mobile-app reviews, ratings, store charts/rankings, or competitive ASO (app store optimization) research without scraping store pages.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s17d53nb8nd03gyyfdy32rgde58e574f:app-review-mining","sourceUrl":"https://clawhub.ai/crawlora-org/app-review-mining","homepage":"https://clawhub.ai/crawlora-org/skills/app-review-mining","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/crawlora-org/app-review-mining","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/crawlora-org/skills/app-review-mining","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":61,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"app-review-mining technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T10:19:15.958Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T10:19:15.958Z","emptyReason":null},"stars":null,"forks":null,"downloads":1089,"packageName":null,"latestVersion":"1.0.19","tractionLabel":"1.1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T10:19:15.944Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T10:19:15.958Z","lastCrawledAt":"2026-10-11T10:19:15.944Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T10:19:15.944Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.19","createdAt":"2026-10-05T01:09:01.147Z","changelog":"Sync skill instructions, references, and helper from GitHub 83bb98ef1362f25cecb5ddd4bc1ea0e564555d97","fileCount":5,"zipByteSize":8589},{"version":"1.0.18","createdAt":"2026-09-21T01:26:53.237Z","changelog":"Sync skill instructions, references, and helper from GitHub 0cfbceba40b050ba434a0a3f4945ca97b668c805","fileCount":5,"zipByteSize":8527},{"version":"1.0.17","createdAt":"2026-09-17T10:09:44.131Z","changelog":"Sync skill instructions, references, and helper from GitHub f4ff4a1ad7c3323a106ef6b46d50ee0146fe65a5","fileCount":5,"zipByteSize":8371},{"version":"1.0.16","createdAt":"2026-09-14T01:30:09.599Z","changelog":"Sync skill instructions, references, and helper from GitHub 902f58316c643ffbcabc57fc6f15f59d27ec063d","fileCount":5,"zipByteSize":8899},{"version":"1.0.15","createdAt":"2026-09-10T12:30:31.755Z","changelog":"Validate API keys before curl config","fileCount":5,"zipByteSize":8526},{"version":"1.0.14","createdAt":"2026-09-10T12:14:18.519Z","changelog":"Keep API keys out of process arguments","fileCount":5,"zipByteSize":8541},{"version":"1.0.13","createdAt":"2026-09-10T12:04:45.433Z","changelog":"Reject curl local-file query syntax","fileCount":5,"zipByteSize":8195},{"version":"1.0.12","createdAt":"2026-09-10T11:52:06.985Z","changelog":"Stream helper request bodies through curl stdin","fileCount":5,"zipByteSize":8240}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17d53nb8nd03gyyfdy32rgde58e574f:app-review-mining","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17d53nb8nd03gyyfdy32rgde58e574f:app-review-mining` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/crawlora-org/app-review-mining before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-app-review-mining/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-app-review-mining/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-app-review-mining/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-app-review-mining/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-app-review-mining/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-app-review-mining/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T14:14:07.405Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-app-review-mining/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-app-review-mining/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-app-review-mining/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-app-review-mining/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T10:19:15.958Z","emptyReason":null},"readme":"Skill: app-review-mining\n\nOwner: crawlora-org\n\nSummary: Mines App Store and Google Play data via the Crawlora API — app details, reviews, ratings, store rankings, and similar apps — as clean JSON. Use when the user wants mobile-app reviews, ratings, store charts/rankings, or competitive ASO (app store optimization) research without scraping store pages.\n\nTags: latest:1.0.19\n\nVersion history:\n\nv1.0.19 | 2026-10-05T01:09:01.147Z | user\n\nSync skill instructions, references, and helper from GitHub 83bb98ef1362f25cecb5ddd4bc1ea0e564555d97\n\nv1.0.18 | 2026-09-21T01:26:53.237Z | user\n\nSync skill instructions, references, and helper from GitHub 0cfbceba40b050ba434a0a3f4945ca97b668c805\n\nv1.0.17 | 2026-09-17T10:09:44.131Z | user\n\nSync skill instructions, references, and helper from GitHub f4ff4a1ad7c3323a106ef6b46d50ee0146fe65a5\n\nv1.0.16 | 2026-09-14T01:30:09.599Z | user\n\nSync skill instructions, references, and helper from GitHub 902f58316c643ffbcabc57fc6f15f59d27ec063d\n\nv1.0.15 | 2026-09-10T12:30:31.755Z | user\n\nValidate API keys before curl config\n\nv1.0.14 | 2026-09-10T12:14:18.519Z | user\n\nKeep API keys out of process arguments\n\nv1.0.13 | 2026-09-10T12:04:45.433Z | user\n\nReject curl local-file query syntax\n\nv1.0.12 | 2026-09-10T11:52:06.985Z | user\n\nStream helper request bodies through curl stdin\n\nv1.0.11 | 2026-09-10T11:31:49.442Z | user\n\nScope helper routes and remove secret-shaped key examples\n\nv1.0.10 | 2026-09-10T06:27:36.517Z | user\n\nMigrate publisher from tonywangcn to crawlora-org for brand consistency with the plugins\n\nv1.0.9 | 2026-09-08T04:27:26.790Z | user\n\nRefresh stale REST examples, endpoint references, and Bash helper from crawlora-skills 1.17.1.\n\nv1.0.8 | 2026-09-07T13:39:47.308Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.7 | 2026-09-07T08:21:39.978Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.6 | 2026-09-07T06:46:16.929Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.5 | 2026-08-24T07:25:44.436Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.4 | 2026-08-24T06:39:19.503Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.3 | 2026-08-24T05:18:08.104Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.2 | 2026-08-14T18:37:33.998Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.1 | 2026-08-10T18:24:08.291Z | user\n\nSet categories\n\nv1.0.0 | 2026-08-10T17:59:06.673Z | auto\n\n- Initial release of app-review-mining skill.\n- Retrieve App Store and Google Play app details, reviews, ratings, rankings, and similar apps as clean JSON via the Crawlora API.\n- Supports API-powered search, review mining, ranking charts, and competitor analysis for app store optimization.\n- Includes setup instructions, usage scenarios, API call examples, and notes on limits and security.\n- Requires a Crawlora API key; free tier offers 2,000 credits/month.\n\nArchive index:\n\nArchive v1.0.19: 5 files, 8589 bytes\n\nFiles: reference/endpoints.md (15379b), scripts/crawlora.sh (4385b), skill-card.md (1760b), SKILL.md (3555b), _meta.json (137b)\n\nFile v1.0.19:SKILL.md\n\n---\nname: app-review-mining\ndescription: Mines App Store and Google Play data via the Crawlora API — app details, reviews, ratings, store rankings, and similar apps — as clean JSON. Use when the user wants mobile-app reviews, ratings, store charts/rankings, or competitive ASO (app store optimization) research without scraping store pages.\n---\n\n# App review mining & ASO\n\nPull App Store (iOS) and Google Play (Android) app details, reviews, ratings,\nrankings, and similar-app lists as normalized JSON from the Crawlora API.\n\n## When to use this skill\n\n- \"What are the reviews / ratings for <app>?\"\n- \"How is <app> ranked?\" / \"top apps in <category>.\"\n- \"Find apps similar to <app>\" / competitive ASO research.\n- \"Pull this app's details / privacy / version history.\"\n- Building an app-review sentiment or competitor-tracking pipeline.\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\nChoose the store (both have parallel endpoints), then the job:\n\n1. **Find the app** — `/appstore/search?term=...` or `/googleplay/search?q=...`\n   to resolve the app id / bundle id.\n2. **Details** — `/appstore/app`, `/googleplay/app` for metadata, rating summary,\n   description, and developer.\n3. **Reviews** — `/appstore/reviews`, `/googleplay/reviews` (paginate) for the\n   review text, score, and date to mine sentiment and themes.\n4. **Rankings** — `/appstore/list`, `/googleplay/list` for store charts by category.\n5. **Competitors** — `/appstore/similar`, `/googleplay/similar` for similar apps.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Find an app, then pull its reviews (GET, key=value params):\nscripts/crawlora.sh /appstore/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /appstore/reviews id=1232780281 country=us | jq '.data'\n\nscripts/crawlora.sh /googleplay/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /googleplay/reviews app_id=\"notion.id\" | jq '.'\n```\n\nUse `scripts/crawlora.sh` for all requests; it keeps the API key out of command-line arguments.\n\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for every App Store and\nGoogle Play endpoint this skill uses (method, path, params, description).\n\n## Examples\n\n- **Review sentiment:** resolve the app id via search → `/appstore/reviews`\n  (paginate) → classify each review's sentiment and summarize top complaints/praise.\n- **Cross-store compare:** pull `/appstore/app` and `/googleplay/app` for the same\n  product to compare ratings and review volume across platforms.\n- **Category ranking watch:** `/googleplay/list` for a category to track where an\n  app sits in the charts over time.\n\n## Notes & limits\n\n- **Credits / pay-on-success:** billed only on `2xx`; free tier 2,000 credits/mo.\n  Key at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- **Public data only** — public store pages; respect Apple's and Google's terms.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- Reviews are paginated and locale-specific — pass `country`/`page` to widen coverage.\n\nFile v1.0.19:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"app-review-mining\",\n  \"version\": \"1.0.19\",\n  \"publishedAt\": 1791162541147\n}\n\nFile v1.0.19:reference/endpoints.md\n\n# app-review-mining — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**26 endpoints across 2 platform group(s).**\n\n## AppStore (15)\n\n### `appstore_app`\n\n- **HTTP:** `GET /appstore/app`\n- **What:** Retrieve full App Store app details. Returns normalized app metadata from the App Store lookup API. Provide either `id` (numeric track ID) or `app_id` (bundle ID). `id`/`app_id` can identify an iPhone, iPad, or Mac App Store listing.\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag; `platforms` (boolean, optional) — Include the full device-platform compatibility list (adds one extra upstream fetch); `ratings` (boolean, optional) — Include ratings histogram\n\n### `appstore_categories`\n\n- **HTTP:** `GET /appstore/categories`\n- **What:** Retrieve App Store chart categories and collections. Returns every category ID and chart collection accepted by `/appstore/list`, including Games and Magazines & Newspapers subgenres with their parent ID. Collections carry their device platform (`phone`, `pad`, `mac`), chart type (`top_free`, `top_paid`, `top_grossing`, `top`, `new`), and whether the feed currently returns entries.\n- **Params:** _none_\n\n### `appstore_collection`\n\n- **HTTP:** `GET /appstore/collection`\n- **What:** Retrieve apps in one App Store collection. Returns app items embedded in an Apple room or EDS collection page. Discover IDs with `appstore_collections`. `platform` enum: `iphone`, `ipad`, `mac`, `vision`, `watch`, `tv`. `collection_id` must be a numeric room ID or `eds.UUID` ID returned by the discovery endpoint.\n- **Params:** `collection_id` (string, **required**) — Room ID or EDS UUID collection ID from appstore_collections; `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Result language tag; `platform` (string, **required**) — Apple device catalog\n\n### `appstore_collections`\n\n- **HTTP:** `GET /appstore/collections`\n- **What:** Discover App Store editorial collections. Returns the room and EDS collection links embedded in Apple's browse page for one device. `platform` enum: `iphone`, `ipad`, `mac`, `vision`, `watch`, `tv`. Pass a returned `id` and the same platform to `appstore_collection` to retrieve the collection's apps.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Result language tag; `platform` (string, **required**) — Apple device catalog\n\n### `appstore_developer`\n\n- **HTTP:** `GET /appstore/developer/{dev_id}`\n- **What:** Retrieve apps by developer ID. Returns App Store apps associated with a specific developer artist ID.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `dev_id` (string, **required**) — Developer artist ID; `lang` (string, optional) — Result language tag\n\n### `appstore_editorial`\n\n- **HTTP:** `GET /appstore/editorial`\n- **What:** Retrieve an App Store device or Arcade editorial landing page. Returns the curated editorial shelves from one of Apple's per-device App Store landing pages (the same content shown by apps.apple.com's device switcher). `device` enum: `iphone`, `ipad`, `mac`, `vision`, `watch`, `tv`. `section` enum: `main` (the device's Today/Discover/Apps & Games landing page), `arcade` (the device's Apple Arcade landing page). Watch has no Arcade page — `device=watch` with `section=arcade` returns `400`.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `device` (string, **required**) — Apple device catalog; `lang` (string, optional) — Result language tag; `section` (string, optional) — Editorial section within the device\n\n### `appstore_editorial_category`\n\n- **HTTP:** `GET /appstore/editorial/category`\n- **What:** Retrieve an App Store category-scoped editorial page. Returns the curated editorial shelves for one device category page (e.g. \"Entertainment Apps for Vision\"). `category_id` is a numeric, device-specific editorial page ID — not a static enum — discovered from an `appstore_editorial` response for the SAME `device`, in its \"Browse by Category\" shelf items' `destination_id` field. `device` enum: `iphone`, `ipad`, `mac`, `vision`, `watch`, `tv`.\n- **Params:** `category_id` (string, **required**) — Numeric App Store editorial page ID, discovered from appstore_editorial (same device); `country` (string, optional) — Two-letter storefront country code; `device` (string, **required**) — Apple device catalog; `lang` (string, optional) — Result language tag\n\n### `appstore_list`\n\n- **HTTP:** `GET /appstore/list`\n- **What:** Retrieve App Store collection rankings. Returns ranked App Store apps from an iTunes RSS collection, optionally expanded to full lookup details. `collection` enum: `topfreeapplications`, `toppaidapplications`, `topgrossingapplications`, `topfreeipadapplications`, `toppaidipadapplications`, `topgrossingipadapplications`, `topmacapps`, `topfreemacapps`, `topgrossingmacapps`, `toppaidmacapps`, `newapplications`, `newfreeapplications`, `newpaidapplications`. Of the Mac collections, only `topfreemacapps` currently returns ranked apps — `topmacapps`, `topgrossingmacapps`, and `toppaidmacapps` are accepted but Apple's feed for them is currently empty. There is no separate Games `collection` — combine any collection with `category=6014` (or a Games subgenre ID, e.g. `7012` for Puzzle) to get its Games-only equivalent, e.g. Top Free Games. See the endpoint markdown for the full category ID table.\n- **Params:** `category` (integer, optional) — Numeric App Store category ID, see description for the full enum; e.g. 6014 = Games, 7012 = Games/Puzzle; `collection` (string, optional) — Chart collection slug, see description for the full enum; `country` (string, optional) — Two-letter storefront country code; `full_detail` (boolean, optional) — Expand each app via lookup API; `lang` (string, optional) — Result language tag; `num` (integer, optional) — Number of apps to return\n\n### `appstore_privacy`\n\n- **HTTP:** `GET /appstore/privacy/{id}`\n- **What:** Retrieve App Store privacy disclosures. Returns the app privacy cards shown on the App Store page, including data categories and purposes.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n### `appstore_ratings`\n\n- **HTTP:** `GET /appstore/ratings`\n- **What:** Retrieve App Store ratings histogram. Returns total ratings count and the 1-5 star histogram shown on the App Store product page.\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n### `appstore_reviews`\n\n- **HTTP:** `GET /appstore/reviews`\n- **What:** Retrieve App Store reviews. Returns one page of customer reviews for an app. Provide either `id` (numeric track ID) or `app_id` (bundle ID).\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag; `page` (integer, optional) — Review page number (1-10); `sort` (string, optional) — Sort order\n\n### `appstore_search`\n\n- **HTTP:** `GET /appstore/search`\n- **What:** Search the App Store. Returns App Store search results for a term. Set `ids_only=true` to return only app IDs. `platform` enum: `phone`, `pad`, `mac`.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `ids_only` (boolean, optional) — Return only app IDs; `lang` (string, optional) — Result language tag; `num` (integer, optional) — Number of apps per page; `page` (integer, optional) — Search page number (1-based); `platform` (string, optional) — App Store catalog to search: phone, pad, mac; `term` (string, **required**) — Search term\n\n### `appstore_similar`\n\n- **HTTP:** `GET /appstore/similar`\n- **What:** Retrieve \"You Might Also Like\" apps. Returns the related apps shown on the App Store product page. Provide either `id` (numeric track ID) or `app_id` (bundle ID).\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n### `appstore_suggest`\n\n- **HTTP:** `GET /appstore/suggest/{term}`\n- **What:** Retrieve App Store search suggestions. Returns suggested search terms for the given partial keyword.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `term` (string, **required**) — Partial search term\n\n### `appstore_version_history`\n\n- **HTTP:** `GET /appstore/version-history/{id}`\n- **What:** Retrieve App Store version history. Returns the version history entries shown in the App Store \"What's New\" section.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n## GooglePlay (11)\n\n### `googleplay_app`\n\n- **HTTP:** `GET /googleplay/app`\n- **What:** Retrieve full Google Play app details. Returns normalized app metadata from a Google Play details page, including installs, ratings, pricing, version info, developer metadata, media assets, release state, selected user comments, and \"More by this developer\" and \"Similar apps\" recommendation rails. For a per-device (phone/tablet/Chromebook) ratings-and-reviews breakdown, see `/googleplay/ratings`. Defaults: `country=us`, `lang=en`.\n- **Params:** `app_id` (string, **required**) — Google Play package name; `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_categories`\n\n- **HTTP:** `GET /googleplay/categories`\n- **What:** Retrieve Google Play app categories. Returns category ids found in the Google Play apps navigation.\n- **Params:** `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_datasafety`\n\n- **HTTP:** `GET /googleplay/datasafety`\n- **What:** Retrieve Google Play data safety details. Returns the data safety information displayed on Google Play.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_developer`\n\n- **HTTP:** `GET /googleplay/developer/{dev_id}`\n- **What:** Retrieve apps by Google Play developer. Returns apps published by a developer id or developer name.\n- **Params:** `country` (string, optional) — Two-letter country code; `dev_id` (string, **required**) — Developer id or name; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps\n\n### `googleplay_list`\n\n- **HTTP:** `GET /googleplay/list`\n- **What:** Retrieve apps from a Google Play top collection. Returns apps from a Google Play collection and category.\n- **Params:** `age` (string, optional) — Family age range; `category` (string, optional) — Category id; `collection` (string, optional) — Collection: TOP_FREE, TOP_PAID, GROSSING, NEW_FREE, NEW_PAID; `country` (string, optional) — Two-letter country code; `device` (string, optional) — Google Play device tab: phone, tablet, tv, chromebook, watch, xr, car; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps\n\n### `googleplay_permissions`\n\n- **HTTP:** `GET /googleplay/permissions`\n- **What:** Retrieve Google Play app permissions. Returns Google Play permission groups or a short permission name list.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code; `short` (boolean, optional) — Return only permission names\n\n### `googleplay_ratings`\n\n- **HTTP:** `GET /googleplay/ratings`\n- **What:** Get Google Play ratings by device. Returns the ratings-and-reviews breakdown Google Play shows under the details page's device tabs, one entry each for phone, tablet, and Chromebook. Defaults: `country=us`, `lang=en`.\n- **Params:** `app_id` (string, **required**) — Google Play package name; `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_reviews`\n\n- **HTTP:** `GET /googleplay/reviews`\n- **What:** Retrieve Google Play reviews. Returns one or more pages of app reviews. Set `paginate=true` to fetch only the requested page.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code; `next_pagination_token` (string, optional) — Token from a previous response; `num` (integer, optional) — Number of reviews; `paginate` (boolean, optional) — Only fetch the requested page; `sort` (string, optional) — Sort: helpfulness, newest, rating\n\n### `googleplay_search`\n\n- **HTTP:** `GET /googleplay/search`\n- **What:** Search Google Play. Returns Google Play search results for a term.\n- **Params:** `country` (string, optional) — Two-letter country code; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps; `price` (string, optional) — Price filter: all, free, paid; `term` (string, **required**) — Search term\n\n### `googleplay_similar`\n\n- **HTTP:** `GET /googleplay/similar`\n- **What:** Retrieve similar Google Play apps. Returns apps from the \"Similar apps\" cluster on an app details page.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `country` (string, optional) — Two-letter country code; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps\n\n### `googleplay_suggest`\n\n- **HTTP:** `GET /googleplay/suggest/{term}`\n- **What:** Retrieve Google Play query suggestions. Returns up to 10 suggestions for a search term.\n- **Params:** `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code; `term` (string, **required**) — Search term prefix\n\nFile v1.0.19:skill-card.md\n\n## Description:\n\nRetrieves App Store and Google Play app details, reviews, ratings, rankings, and similar apps through the Crawlora API for app-review and ASO research.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[crawlora-org](https://clawhub.ai/user/crawlora-org)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and app researchers use this skill to compare mobile-app ratings, analyze public reviews, monitor store rankings, and discover competing apps.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: App lookup parameters and the API key are sent to Crawlora.\n\nMitigation: Use the skill only when that transfer is acceptable; keep CRAWLORA_API_KEY out of logs, commits, and shared shell history.\n\nRisk: Implicit locale selection can make review and ranking comparisons misleading.\n\nMitigation: Pass country and language explicitly when locale matters, and account for paginated reviews.\n\n## Reference(s):\n\n- [App Store and Google Play endpoint reference](reference/endpoints.md)\n- [Crawlora](https://crawlora.net)\n- [ClawHub skill release](https://clawhub.ai/crawlora-org/skills/app-review-mining)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Analysis]\n\n**Output Format:** [JSON data or Markdown summaries]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Results depend on the selected store, locale, and review pagination.]\n\n## Skill Version(s):\n\n1.0.19 (source: server-resolved release)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.18: 5 files, 8527 bytes\n\nFiles: reference/endpoints.md (14112b), scripts/crawlora.sh (4292b), skill-card.md (2220b), SKILL.md (3555b), _meta.json (137b)\n\nFile v1.0.18:SKILL.md\n\n---\nname: app-review-mining\ndescription: Mines App Store and Google Play data via the Crawlora API — app details, reviews, ratings, store rankings, and similar apps — as clean JSON. Use when the user wants mobile-app reviews, ratings, store charts/rankings, or competitive ASO (app store optimization) research without scraping store pages.\n---\n\n# App review mining & ASO\n\nPull App Store (iOS) and Google Play (Android) app details, reviews, ratings,\nrankings, and similar-app lists as normalized JSON from the Crawlora API.\n\n## When to use this skill\n\n- \"What are the reviews / ratings for <app>?\"\n- \"How is <app> ranked?\" / \"top apps in <category>.\"\n- \"Find apps similar to <app>\" / competitive ASO research.\n- \"Pull this app's details / privacy / version history.\"\n- Building an app-review sentiment or competitor-tracking pipeline.\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\nChoose the store (both have parallel endpoints), then the job:\n\n1. **Find the app** — `/appstore/search?term=...` or `/googleplay/search?q=...`\n   to resolve the app id / bundle id.\n2. **Details** — `/appstore/app`, `/googleplay/app` for metadata, rating summary,\n   description, and developer.\n3. **Reviews** — `/appstore/reviews`, `/googleplay/reviews` (paginate) for the\n   review text, score, and date to mine sentiment and themes.\n4. **Rankings** — `/appstore/list`, `/googleplay/list` for store charts by category.\n5. **Competitors** — `/appstore/similar`, `/googleplay/similar` for similar apps.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Find an app, then pull its reviews (GET, key=value params):\nscripts/crawlora.sh /appstore/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /appstore/reviews id=1232780281 country=us | jq '.data'\n\nscripts/crawlora.sh /googleplay/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /googleplay/reviews app_id=\"notion.id\" | jq '.'\n```\n\nUse `scripts/crawlora.sh` for all requests; it keeps the API key out of command-line arguments.\n\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for every App Store and\nGoogle Play endpoint this skill uses (method, path, params, description).\n\n## Examples\n\n- **Review sentiment:** resolve the app id via search → `/appstore/reviews`\n  (paginate) → classify each review's sentiment and summarize top complaints/praise.\n- **Cross-store compare:** pull `/appstore/app` and `/googleplay/app` for the same\n  product to compare ratings and review volume across platforms.\n- **Category ranking watch:** `/googleplay/list` for a category to track where an\n  app sits in the charts over time.\n\n## Notes & limits\n\n- **Credits / pay-on-success:** billed only on `2xx`; free tier 2,000 credits/mo.\n  Key at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- **Public data only** — public store pages; respect Apple's and Google's terms.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- Reviews are paginated and locale-specific — pass `country`/`page` to widen coverage.\n\nFile v1.0.18:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"app-review-mining\",\n  \"version\": \"1.0.18\",\n  \"publishedAt\": 1789954013237\n}\n\nFile v1.0.18:reference/endpoints.md\n\n# app-review-mining — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**24 endpoints across 2 platform group(s).**\n\n## AppStore (13)\n\n### `appstore_app`\n\n- **HTTP:** `GET /appstore/app`\n- **What:** Retrieve full App Store app details. Returns normalized app metadata from the App Store lookup API. Provide either `id` (numeric track ID) or `app_id` (bundle ID). `id`/`app_id` can identify an iPhone, iPad, or Mac App Store listing.\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag; `platforms` (boolean, optional) — Include the full device-platform compatibility list (adds one extra upstream fetch); `ratings` (boolean, optional) — Include ratings histogram\n\n### `appstore_categories`\n\n- **HTTP:** `GET /appstore/categories`\n- **What:** Retrieve App Store chart categories and collections. Returns every category ID and chart collection accepted by `/appstore/list`, including Games and Magazines & Newspapers subgenres with their parent ID. Collections carry their device platform (`phone`, `pad`, `mac`), chart type (`top_free`, `top_paid`, `top_grossing`, `top`, `new`), and whether the feed currently returns entries.\n- **Params:** _none_\n\n### `appstore_developer`\n\n- **HTTP:** `GET /appstore/developer/{dev_id}`\n- **What:** Retrieve apps by developer ID. Returns App Store apps associated with a specific developer artist ID.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `dev_id` (string, **required**) — Developer artist ID; `lang` (string, optional) — Result language tag\n\n### `appstore_editorial`\n\n- **HTTP:** `GET /appstore/editorial`\n- **What:** Retrieve an App Store device or Arcade editorial landing page. Returns the curated editorial shelves from one of Apple's per-device App Store landing pages (the same content shown by apps.apple.com's device switcher). `device` enum: `iphone`, `ipad`, `mac`, `vision`, `watch`, `tv`. `section` enum: `main` (the device's Today/Discover/Apps & Games landing page), `arcade` (the device's Apple Arcade landing page). Watch has no Arcade page — `device=watch` with `section=arcade` returns `400`.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `device` (string, **required**) — Apple device catalog; `lang` (string, optional) — Result language tag; `section` (string, optional) — Editorial section within the device\n\n### `appstore_editorial_category`\n\n- **HTTP:** `GET /appstore/editorial/category`\n- **What:** Retrieve an App Store category-scoped editorial page. Returns the curated editorial shelves for one device category page (e.g. \"Entertainment Apps for Vision\"). `category_id` is a numeric, device-specific editorial page ID — not a static enum — discovered from an `appstore_editorial` response for the SAME `device`, in its \"Browse by Category\" shelf items' `destination_id` field. `device` enum: `iphone`, `ipad`, `mac`, `vision`, `watch`, `tv`.\n- **Params:** `category_id` (string, **required**) — Numeric App Store editorial page ID, discovered from appstore_editorial (same device); `country` (string, optional) — Two-letter storefront country code; `device` (string, **required**) — Apple device catalog; `lang` (string, optional) — Result language tag\n\n### `appstore_list`\n\n- **HTTP:** `GET /appstore/list`\n- **What:** Retrieve App Store collection rankings. Returns ranked App Store apps from an iTunes RSS collection, optionally expanded to full lookup details. `collection` enum: `topfreeapplications`, `toppaidapplications`, `topgrossingapplications`, `topfreeipadapplications`, `toppaidipadapplications`, `topgrossingipadapplications`, `topmacapps`, `topfreemacapps`, `topgrossingmacapps`, `toppaidmacapps`, `newapplications`, `newfreeapplications`, `newpaidapplications`. Of the Mac collections, only `topfreemacapps` currently returns ranked apps — `topmacapps`, `topgrossingmacapps`, and `toppaidmacapps` are accepted but Apple's feed for them is currently empty. There is no separate Games `collection` — combine any collection with `category=6014` (or a Games subgenre ID, e.g. `7012` for Puzzle) to get its Games-only equivalent, e.g. Top Free Games. See the endpoint markdown for the full category ID table.\n- **Params:** `category` (integer, optional) — Numeric App Store category ID, see description for the full enum; e.g. 6014 = Games, 7012 = Games/Puzzle; `collection` (string, optional) — Chart collection slug, see description for the full enum; `country` (string, optional) — Two-letter storefront country code; `full_detail` (boolean, optional) — Expand each app via lookup API; `lang` (string, optional) — Result language tag; `num` (integer, optional) — Number of apps to return\n\n### `appstore_privacy`\n\n- **HTTP:** `GET /appstore/privacy/{id}`\n- **What:** Retrieve App Store privacy disclosures. Returns the app privacy cards shown on the App Store page, including data categories and purposes.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n### `appstore_ratings`\n\n- **HTTP:** `GET /appstore/ratings`\n- **What:** Retrieve App Store ratings histogram. Returns total ratings count and the 1-5 star histogram shown on the App Store product page.\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n### `appstore_reviews`\n\n- **HTTP:** `GET /appstore/reviews`\n- **What:** Retrieve App Store reviews. Returns one page of customer reviews for an app. Provide either `id` (numeric track ID) or `app_id` (bundle ID).\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag; `page` (integer, optional) — Review page number (1-10); `sort` (string, optional) — Sort order\n\n### `appstore_search`\n\n- **HTTP:** `GET /appstore/search`\n- **What:** Search the App Store. Returns App Store search results for a term. Set `ids_only=true` to return only app IDs. `platform` enum: `phone`, `pad`, `mac`.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `ids_only` (boolean, optional) — Return only app IDs; `lang` (string, optional) — Result language tag; `num` (integer, optional) — Number of apps per page; `page` (integer, optional) — Search page number (1-based); `platform` (string, optional) — App Store catalog to search: phone, pad, mac; `term` (string, **required**) — Search term\n\n### `appstore_similar`\n\n- **HTTP:** `GET /appstore/similar`\n- **What:** Retrieve \"You Might Also Like\" apps. Returns the related apps shown on the App Store product page. Provide either `id` (numeric track ID) or `app_id` (bundle ID).\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n### `appstore_suggest`\n\n- **HTTP:** `GET /appstore/suggest/{term}`\n- **What:** Retrieve App Store search suggestions. Returns suggested search terms for the given partial keyword.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `term` (string, **required**) — Partial search term\n\n### `appstore_version_history`\n\n- **HTTP:** `GET /appstore/version-history/{id}`\n- **What:** Retrieve App Store version history. Returns the version history entries shown in the App Store \"What's New\" section.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n## GooglePlay (11)\n\n### `googleplay_app`\n\n- **HTTP:** `GET /googleplay/app`\n- **What:** Retrieve full Google Play app details. Returns normalized app metadata from a Google Play details page, including installs, ratings, pricing, version info, developer metadata, media assets, release state, selected user comments, and \"More by this developer\" and \"Similar apps\" recommendation rails. For a per-device (phone/tablet/Chromebook) ratings-and-reviews breakdown, see `/googleplay/ratings`. Defaults: `country=us`, `lang=en`.\n- **Params:** `app_id` (string, **required**) — Google Play package name; `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_categories`\n\n- **HTTP:** `GET /googleplay/categories`\n- **What:** Retrieve Google Play app categories. Returns category ids found in the Google Play apps navigation.\n- **Params:** `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_datasafety`\n\n- **HTTP:** `GET /googleplay/datasafety`\n- **What:** Retrieve Google Play data safety details. Returns the data safety information displayed on Google Play.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_developer`\n\n- **HTTP:** `GET /googleplay/developer/{dev_id}`\n- **What:** Retrieve apps by Google Play developer. Returns apps published by a developer id or developer name.\n- **Params:** `country` (string, optional) — Two-letter country code; `dev_id` (string, **required**) — Developer id or name; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps\n\n### `googleplay_list`\n\n- **HTTP:** `GET /googleplay/list`\n- **What:** Retrieve apps from a Google Play top collection. Returns apps from a Google Play collection and category.\n- **Params:** `age` (string, optional) — Family age range; `category` (string, optional) — Category id; `collection` (string, optional) — Collection: TOP_FREE, TOP_PAID, GROSSING, NEW_FREE, NEW_PAID; `country` (string, optional) — Two-letter country code; `device` (string, optional) — Google Play device tab: phone, tablet, tv, chromebook, watch, xr, car; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps\n\n### `googleplay_permissions`\n\n- **HTTP:** `GET /googleplay/permissions`\n- **What:** Retrieve Google Play app permissions. Returns Google Play permission groups or a short permission name list.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code; `short` (boolean, optional) — Return only permission names\n\n### `googleplay_ratings`\n\n- **HTTP:** `GET /googleplay/ratings`\n- **What:** Get Google Play ratings by device. Returns the ratings-and-reviews breakdown Google Play shows under the details page's device tabs, one entry each for phone, tablet, and Chromebook. Defaults: `country=us`, `lang=en`.\n- **Params:** `app_id` (string, **required**) — Google Play package name; `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_reviews`\n\n- **HTTP:** `GET /googleplay/reviews`\n- **What:** Retrieve Google Play reviews. Returns one or more pages of app reviews. Set `paginate=true` to fetch only the requested page.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code; `next_pagination_token` (string, optional) — Token from a previous response; `num` (integer, optional) — Number of reviews; `paginate` (boolean, optional) — Only fetch the requested page; `sort` (string, optional) — Sort: helpfulness, newest, rating\n\n### `googleplay_search`\n\n- **HTTP:** `GET /googleplay/search`\n- **What:** Search Google Play. Returns Google Play search results for a term.\n- **Params:** `country` (string, optional) — Two-letter country code; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps; `price` (string, optional) — Price filter: all, free, paid; `term` (string, **required**) — Search term\n\n### `googleplay_similar`\n\n- **HTTP:** `GET /googleplay/similar`\n- **What:** Retrieve similar Google Play apps. Returns apps from the \"Similar apps\" cluster on an app details page.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `country` (string, optional) — Two-letter country code; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps\n\n### `googleplay_suggest`\n\n- **HTTP:** `GET /googleplay/suggest/{term}`\n- **What:** Retrieve Google Play query suggestions. Returns up to 10 suggestions for a search term.\n- **Params:** `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code; `term` (string, **required**) — Search term prefix\n\nFile v1.0.18:skill-card.md\n\n## Description:\n\nMines App Store and Google Play app details, reviews, ratings, store rankings, and similar apps via the Crawlora API as clean JSON for mobile-app review and competitive ASO research.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[crawlora-org](https://clawhub.ai/user/crawlora-org)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers, product teams, and ASO researchers use this skill to retrieve public App Store and Google Play metadata, reviews, ratings, rankings, and similar-app lists for sentiment analysis, market comparison, and competitor tracking.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: App IDs, search terms, locale choices, review-mining queries, and the Crawlora API key are sent to Crawlora.\n\nMitigation: Use the skill only when Crawlora's data handling is acceptable, avoid confidential competitive research terms, and keep the API key in CRAWLORA_API_KEY rather than in prompts, files, or command arguments.\n\nRisk: Review and ranking data can vary by country, language, pagination, and storefront behavior.\n\nMitigation: Specify country and language parameters for market-specific work and document pagination choices when using results for analysis or comparisons.\n\n## Reference(s):\n\n- [Endpoint reference](reference/endpoints.md)\n- [Crawlora](https://crawlora.net)\n- [Crawlora API base](https://api.crawlora.net/api/v1)\n- [ClawHub skill page](https://clawhub.ai/crawlora-org/skills/app-review-mining)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Configuration, Guidance]\n\n**Output Format:** [Markdown guidance with shell command examples that return JSON from the Crawlora API]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires CRAWLORA_API_KEY and sends requests to Crawlora for public App Store and Google Play data.]\n\n## Skill Version(s):\n\n1.0.18 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.17: 5 files, 8371 bytes\n\nFiles: reference/endpoints.md (13627b), scripts/crawlora.sh (4246b), skill-card.md (2255b), SKILL.md (3555b), _meta.json (137b)\n\nFile v1.0.17:SKILL.md\n\n---\nname: app-review-mining\ndescription: Mines App Store and Google Play data via the Crawlora API — app details, reviews, ratings, store rankings, and similar apps — as clean JSON. Use when the user wants mobile-app reviews, ratings, store charts/rankings, or competitive ASO (app store optimization) research without scraping store pages.\n---\n\n# App review mining & ASO\n\nPull App Store (iOS) and Google Play (Android) app details, reviews, ratings,\nrankings, and similar-app lists as normalized JSON from the Crawlora API.\n\n## When to use this skill\n\n- \"What are the reviews / ratings for <app>?\"\n- \"How is <app> ranked?\" / \"top apps in <category>.\"\n- \"Find apps similar to <app>\" / competitive ASO research.\n- \"Pull this app's details / privacy / version history.\"\n- Building an app-review sentiment or competitor-tracking pipeline.\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\nChoose the store (both have parallel endpoints), then the job:\n\n1. **Find the app** — `/appstore/search?term=...` or `/googleplay/search?q=...`\n   to resolve the app id / bundle id.\n2. **Details** — `/appstore/app`, `/googleplay/app` for metadata, rating summary,\n   description, and developer.\n3. **Reviews** — `/appstore/reviews`, `/googleplay/reviews` (paginate) for the\n   review text, score, and date to mine sentiment and themes.\n4. **Rankings** — `/appstore/list`, `/googleplay/list` for store charts by category.\n5. **Competitors** — `/appstore/similar`, `/googleplay/similar` for similar apps.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Find an app, then pull its reviews (GET, key=value params):\nscripts/crawlora.sh /appstore/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /appstore/reviews id=1232780281 country=us | jq '.data'\n\nscripts/crawlora.sh /googleplay/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /googleplay/reviews app_id=\"notion.id\" | jq '.'\n```\n\nUse `scripts/crawlora.sh` for all requests; it keeps the API key out of command-line arguments.\n\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for every App Store and\nGoogle Play endpoint this skill uses (method, path, params, description).\n\n## Examples\n\n- **Review sentiment:** resolve the app id via search → `/appstore/reviews`\n  (paginate) → classify each review's sentiment and summarize top complaints/praise.\n- **Cross-store compare:** pull `/appstore/app` and `/googleplay/app` for the same\n  product to compare ratings and review volume across platforms.\n- **Category ranking watch:** `/googleplay/list` for a category to track where an\n  app sits in the charts over time.\n\n## Notes & limits\n\n- **Credits / pay-on-success:** billed only on `2xx`; free tier 2,000 credits/mo.\n  Key at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- **Public data only** — public store pages; respect Apple's and Google's terms.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- Reviews are paginated and locale-specific — pass `country`/`page` to widen coverage.\n\nFile v1.0.17:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"app-review-mining\",\n  \"version\": \"1.0.17\",\n  \"publishedAt\": 1789639784131\n}\n\nFile v1.0.17:reference/endpoints.md\n\n# app-review-mining — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**23 endpoints across 2 platform group(s).**\n\n## AppStore (12)\n\n### `appstore_app`\n\n- **HTTP:** `GET /appstore/app`\n- **What:** Retrieve full App Store app details. Returns normalized app metadata from the App Store lookup API. Provide either `id` (numeric track ID) or `app_id` (bundle ID). `id`/`app_id` can identify an iPhone, iPad, or Mac App Store listing.\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag; `platforms` (boolean, optional) — Include the full device-platform compatibility list (adds one extra upstream fetch); `ratings` (boolean, optional) — Include ratings histogram\n\n### `appstore_developer`\n\n- **HTTP:** `GET /appstore/developer/{dev_id}`\n- **What:** Retrieve apps by developer ID. Returns App Store apps associated with a specific developer artist ID.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `dev_id` (string, **required**) — Developer artist ID; `lang` (string, optional) — Result language tag\n\n### `appstore_editorial`\n\n- **HTTP:** `GET /appstore/editorial`\n- **What:** Retrieve an App Store device or Arcade editorial landing page. Returns the curated editorial shelves from one of Apple's per-device App Store landing pages (the same content shown by apps.apple.com's device switcher). `device` enum: `iphone`, `ipad`, `mac`, `vision`, `watch`, `tv`. `section` enum: `main` (the device's Today/Discover/Apps & Games landing page), `arcade` (the device's Apple Arcade landing page). Watch has no Arcade page — `device=watch` with `section=arcade` returns `400`.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `device` (string, **required**) — Apple device catalog; `lang` (string, optional) — Result language tag; `section` (string, optional) — Editorial section within the device\n\n### `appstore_editorial_category`\n\n- **HTTP:** `GET /appstore/editorial/category`\n- **What:** Retrieve an App Store category-scoped editorial page. Returns the curated editorial shelves for one device category page (e.g. \"Entertainment Apps for Vision\"). `category_id` is a numeric, device-specific editorial page ID — not a static enum — discovered from an `appstore_editorial` response for the SAME `device`, in its \"Browse by Category\" shelf items' `destination_id` field. `device` enum: `iphone`, `ipad`, `mac`, `vision`, `watch`, `tv`.\n- **Params:** `category_id` (string, **required**) — Numeric App Store editorial page ID, discovered from appstore_editorial (same device); `country` (string, optional) — Two-letter storefront country code; `device` (string, **required**) — Apple device catalog; `lang` (string, optional) — Result language tag\n\n### `appstore_list`\n\n- **HTTP:** `GET /appstore/list`\n- **What:** Retrieve App Store collection rankings. Returns ranked App Store apps from an iTunes RSS collection, optionally expanded to full lookup details. `collection` enum: `topfreeapplications`, `toppaidapplications`, `topgrossingapplications`, `topfreeipadapplications`, `toppaidipadapplications`, `topgrossingipadapplications`, `topmacapps`, `topfreemacapps`, `topgrossingmacapps`, `toppaidmacapps`, `newapplications`, `newfreeapplications`, `newpaidapplications`. Of the Mac collections, only `topfreemacapps` currently returns ranked apps — `topmacapps`, `topgrossingmacapps`, and `toppaidmacapps` are accepted but Apple's feed for them is currently empty. There is no separate Games `collection` — combine any collection with `category=6014` (or a Games subgenre ID, e.g. `7012` for Puzzle) to get its Games-only equivalent, e.g. Top Free Games. See the endpoint markdown for the full category ID table.\n- **Params:** `category` (integer, optional) — Numeric App Store category ID, see description for the full enum; e.g. 6014 = Games, 7012 = Games/Puzzle; `collection` (string, optional) — Chart collection slug, see description for the full enum; `country` (string, optional) — Two-letter storefront country code; `full_detail` (boolean, optional) — Expand each app via lookup API; `lang` (string, optional) — Result language tag; `num` (integer, optional) — Number of apps to return\n\n### `appstore_privacy`\n\n- **HTTP:** `GET /appstore/privacy/{id}`\n- **What:** Retrieve App Store privacy disclosures. Returns the app privacy cards shown on the App Store page, including data categories and purposes.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n### `appstore_ratings`\n\n- **HTTP:** `GET /appstore/ratings`\n- **What:** Retrieve App Store ratings histogram. Returns total ratings count and the 1-5 star histogram shown on the App Store product page.\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n### `appstore_reviews`\n\n- **HTTP:** `GET /appstore/reviews`\n- **What:** Retrieve App Store reviews. Returns one page of customer reviews for an app. Provide either `id` (numeric track ID) or `app_id` (bundle ID).\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag; `page` (integer, optional) — Review page number (1-10); `sort` (string, optional) — Sort order\n\n### `appstore_search`\n\n- **HTTP:** `GET /appstore/search`\n- **What:** Search the App Store. Returns App Store search results for a term. Set `ids_only=true` to return only app IDs. `platform` enum: `phone`, `pad`, `mac`.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `ids_only` (boolean, optional) — Return only app IDs; `lang` (string, optional) — Result language tag; `num` (integer, optional) — Number of apps per page; `page` (integer, optional) — Search page number (1-based); `platform` (string, optional) — App Store catalog to search: phone, pad, mac; `term` (string, **required**) — Search term\n\n### `appstore_similar`\n\n- **HTTP:** `GET /appstore/similar`\n- **What:** Retrieve \"You Might Also Like\" apps. Returns the related apps shown on the App Store product page. Provide either `id` (numeric track ID) or `app_id` (bundle ID).\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n### `appstore_suggest`\n\n- **HTTP:** `GET /appstore/suggest/{term}`\n- **What:** Retrieve App Store search suggestions. Returns suggested search terms for the given partial keyword.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `term` (string, **required**) — Partial search term\n\n### `appstore_version_history`\n\n- **HTTP:** `GET /appstore/version-history/{id}`\n- **What:** Retrieve App Store version history. Returns the version history entries shown in the App Store \"What's New\" section.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n## GooglePlay (11)\n\n### `googleplay_app`\n\n- **HTTP:** `GET /googleplay/app`\n- **What:** Retrieve full Google Play app details. Returns normalized app metadata from a Google Play details page, including installs, ratings, pricing, version info, developer metadata, media assets, release state, selected user comments, and \"More by this developer\" and \"Similar apps\" recommendation rails. For a per-device (phone/tablet/Chromebook) ratings-and-reviews breakdown, see `/googleplay/ratings`. Defaults: `country=us`, `lang=en`.\n- **Params:** `app_id` (string, **required**) — Google Play package name; `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_categories`\n\n- **HTTP:** `GET /googleplay/categories`\n- **What:** Retrieve Google Play app categories. Returns category ids found in the Google Play apps navigation.\n- **Params:** `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_datasafety`\n\n- **HTTP:** `GET /googleplay/datasafety`\n- **What:** Retrieve Google Play data safety details. Returns the data safety information displayed on Google Play.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_developer`\n\n- **HTTP:** `GET /googleplay/developer/{dev_id}`\n- **What:** Retrieve apps by Google Play developer. Returns apps published by a developer id or developer name.\n- **Params:** `country` (string, optional) — Two-letter country code; `dev_id` (string, **required**) — Developer id or name; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps\n\n### `googleplay_list`\n\n- **HTTP:** `GET /googleplay/list`\n- **What:** Retrieve apps from a Google Play top collection. Returns apps from a Google Play collection and category.\n- **Params:** `age` (string, optional) — Family age range; `category` (string, optional) — Category id; `collection` (string, optional) — Collection: TOP_FREE, TOP_PAID, GROSSING, NEW_FREE, NEW_PAID; `country` (string, optional) — Two-letter country code; `device` (string, optional) — Google Play device tab: phone, tablet, tv, chromebook, watch, xr, car; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps\n\n### `googleplay_permissions`\n\n- **HTTP:** `GET /googleplay/permissions`\n- **What:** Retrieve Google Play app permissions. Returns Google Play permission groups or a short permission name list.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code; `short` (boolean, optional) — Return only permission names\n\n### `googleplay_ratings`\n\n- **HTTP:** `GET /googleplay/ratings`\n- **What:** Get Google Play ratings by device. Returns the ratings-and-reviews breakdown Google Play shows under the details page's device tabs, one entry each for phone, tablet, and Chromebook. Defaults: `country=us`, `lang=en`.\n- **Params:** `app_id` (string, **required**) — Google Play package name; `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_reviews`\n\n- **HTTP:** `GET /googleplay/reviews`\n- **What:** Retrieve Google Play reviews. Returns one or more pages of app reviews. Set `paginate=true` to fetch only the requested page.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code; `next_pagination_token` (string, optional) — Token from a previous response; `num` (integer, optional) — Number of reviews; `paginate` (boolean, optional) — Only fetch the requested page; `sort` (string, optional) — Sort: helpfulness, newest, rating\n\n### `googleplay_search`\n\n- **HTTP:** `GET /googleplay/search`\n- **What:** Search Google Play. Returns Google Play search results for a term.\n- **Params:** `country` (string, optional) — Two-letter country code; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps; `price` (string, optional) — Price filter: all, free, paid; `term` (string, **required**) — Search term\n\n### `googleplay_similar`\n\n- **HTTP:** `GET /googleplay/similar`\n- **What:** Retrieve similar Google Play apps. Returns apps from the \"Similar apps\" cluster on an app details page.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `country` (string, optional) — Two-letter country code; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps\n\n### `googleplay_suggest`\n\n- **HTTP:** `GET /googleplay/suggest/{term}`\n- **What:** Retrieve Google Play query suggestions. Returns up to 10 suggestions for a search term.\n- **Params:** `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code; `term` (string, **required**) — Search term prefix\n\nFile v1.0.17:skill-card.md\n\n## Description:\n\nMines App Store and Google Play data via the Crawlora API - app details, reviews, ratings, store rankings, and similar apps - as clean JSON.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[crawlora-org](https://clawhub.ai/user/crawlora-org)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers, researchers, and product teams use this skill to retrieve public mobile app metadata, reviews, ratings, rankings, privacy details, and similar-app lists for app review mining and app store optimization research.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill sends app identifiers, search terms, locale parameters, and the Crawlora API key to Crawlora.\n\nMitigation: Install only when this data sharing is acceptable, keep CRAWLORA_API_KEY in the environment, and never commit the key.\n\nRisk: Review and ranking results are paginated and locale-specific, so incomplete country, language, or page parameters can produce incomplete analysis.\n\nMitigation: Use explicit country, language, pagination, and result-count parameters when coverage matters.\n\nRisk: The skill works with public app store data that may be subject to Apple or Google terms.\n\nMitigation: Use outputs for public-data research workflows and review downstream usage against applicable store terms.\n\n## Reference(s):\n\n- [Endpoint reference](reference/endpoints.md)\n- [Crawlora API service](https://crawlora.net)\n- [ClawHub skill page](https://clawhub.ai/crawlora-org/skills/app-review-mining)\n\n## Skill Output:\n\n**Output Type(s):** [API Calls, Shell commands, Configuration, JSON, Guidance]\n\n**Output Format:** [Markdown guidance with shell commands that return JSON from the Crawlora API]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires CRAWLORA_API_KEY and sends app identifiers, search terms, locale parameters, and the API key to Crawlora.]\n\n## Skill Version(s):\n\n1.0.17 (source: release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.16: 5 files, 8899 bytes\n\nFiles: reference/endpoints.md (13627b), scripts/crawlora.sh (5164b), skill-card.md (2382b), SKILL.md (3555b), _meta.json (137b)\n\nFile v1.0.16:SKILL.md\n\n---\nname: app-review-mining\ndescription: Mines App Store and Google Play data via the Crawlora API — app details, reviews, ratings, store rankings, and similar apps — as clean JSON. Use when the user wants mobile-app reviews, ratings, store charts/rankings, or competitive ASO (app store optimization) research without scraping store pages.\n---\n\n# App review mining & ASO\n\nPull App Store (iOS) and Google Play (Android) app details, reviews, ratings,\nrankings, and similar-app lists as normalized JSON from the Crawlora API.\n\n## When to use this skill\n\n- \"What are the reviews / ratings for <app>?\"\n- \"How is <app> ranked?\" / \"top apps in <category>.\"\n- \"Find apps similar to <app>\" / competitive ASO research.\n- \"Pull this app's details / privacy / version history.\"\n- Building an app-review sentiment or competitor-tracking pipeline.\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\nChoose the store (both have parallel endpoints), then the job:\n\n1. **Find the app** — `/appstore/search?term=...` or `/googleplay/search?q=...`\n   to resolve the app id / bundle id.\n2. **Details** — `/appstore/app`, `/googleplay/app` for metadata, rating summary,\n   description, and developer.\n3. **Reviews** — `/appstore/reviews`, `/googleplay/reviews` (paginate) for the\n   review text, score, and date to mine sentiment and themes.\n4. **Rankings** — `/appstore/list`, `/googleplay/list` for store charts by category.\n5. **Competitors** — `/appstore/similar`, `/googleplay/similar` for similar apps.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Find an app, then pull its reviews (GET, key=value params):\nscripts/crawlora.sh /appstore/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /appstore/reviews id=1232780281 country=us | jq '.data'\n\nscripts/crawlora.sh /googleplay/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /googleplay/reviews app_id=\"notion.id\" | jq '.'\n```\n\nUse `scripts/crawlora.sh` for all requests; it keeps the API key out of command-line arguments.\n\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for every App Store and\nGoogle Play endpoint this skill uses (method, path, params, description).\n\n## Examples\n\n- **Review sentiment:** resolve the app id via search → `/appstore/reviews`\n  (paginate) → classify each review's sentiment and summarize top complaints/praise.\n- **Cross-store compare:** pull `/appstore/app` and `/googleplay/app` for the same\n  product to compare ratings and review volume across platforms.\n- **Category ranking watch:** `/googleplay/list` for a category to track where an\n  app sits in the charts over time.\n\n## Notes & limits\n\n- **Credits / pay-on-success:** billed only on `2xx`; free tier 2,000 credits/mo.\n  Key at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- **Public data only** — public store pages; respect Apple's and Google's terms.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- Reviews are paginated and locale-specific — pass `country`/`page` to widen coverage.\n\nFile v1.0.16:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"app-review-mining\",\n  \"version\": \"1.0.16\",\n  \"publishedAt\": 1789349409599\n}\n\nFile v1.0.16:reference/endpoints.md\n\n# app-review-mining — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**23 endpoints across 2 platform group(s).**\n\n## AppStore (12)\n\n### `appstore_app`\n\n- **HTTP:** `GET /appstore/app`\n- **What:** Retrieve full App Store app details. Returns normalized app metadata from the App Store lookup API. Provide either `id` (numeric track ID) or `app_id` (bundle ID). `id`/`app_id` can identify an iPhone, iPad, or Mac App Store listing.\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag; `platforms` (boolean, optional) — Include the full device-platform compatibility list (adds one extra upstream fetch); `ratings` (boolean, optional) — Include ratings histogram\n\n### `appstore_developer`\n\n- **HTTP:** `GET /appstore/developer/{dev_id}`\n- **What:** Retrieve apps by developer ID. Returns App Store apps associated with a specific developer artist ID.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `dev_id` (string, **required**) — Developer artist ID; `lang` (string, optional) — Result language tag\n\n### `appstore_editorial`\n\n- **HTTP:** `GET /appstore/editorial`\n- **What:** Retrieve an App Store device or Arcade editorial landing page. Returns the curated editorial shelves from one of Apple's per-device App Store landing pages (the same content shown by apps.apple.com's device switcher). `device` enum: `iphone`, `ipad`, `mac`, `vision`, `watch`, `tv`. `section` enum: `main` (the device's Today/Discover/Apps & Games landing page), `arcade` (the device's Apple Arcade landing page). Watch has no Arcade page — `device=watch` with `section=arcade` returns `400`.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `device` (string, **required**) — Apple device catalog; `lang` (string, optional) — Result language tag; `section` (string, optional) — Editorial section within the device\n\n### `appstore_editorial_category`\n\n- **HTTP:** `GET /appstore/editorial/category`\n- **What:** Retrieve an App Store category-scoped editorial page. Returns the curated editorial shelves for one device category page (e.g. \"Entertainment Apps for Vision\"). `category_id` is a numeric, device-specific editorial page ID — not a static enum — discovered from an `appstore_editorial` response for the SAME `device`, in its \"Browse by Category\" shelf items' `destination_id` field. `device` enum: `iphone`, `ipad`, `mac`, `vision`, `watch`, `tv`.\n- **Params:** `category_id` (string, **required**) — Numeric App Store editorial page ID, discovered from appstore_editorial (same device); `country` (string, optional) — Two-letter storefront country code; `device` (string, **required**) — Apple device catalog; `lang` (string, optional) — Result language tag\n\n### `appstore_list`\n\n- **HTTP:** `GET /appstore/list`\n- **What:** Retrieve App Store collection rankings. Returns ranked App Store apps from an iTunes RSS collection, optionally expanded to full lookup details. `collection` enum: `topfreeapplications`, `toppaidapplications`, `topgrossingapplications`, `topfreeipadapplications`, `toppaidipadapplications`, `topgrossingipadapplications`, `topmacapps`, `topfreemacapps`, `topgrossingmacapps`, `toppaidmacapps`, `newapplications`, `newfreeapplications`, `newpaidapplications`. Of the Mac collections, only `topfreemacapps` currently returns ranked apps — `topmacapps`, `topgrossingmacapps`, and `toppaidmacapps` are accepted but Apple's feed for them is currently empty. There is no separate Games `collection` — combine any collection with `category=6014` (or a Games subgenre ID, e.g. `7012` for Puzzle) to get its Games-only equivalent, e.g. Top Free Games. See the endpoint markdown for the full category ID table.\n- **Params:** `category` (integer, optional) — Numeric App Store category ID, see description for the full enum; e.g. 6014 = Games, 7012 = Games/Puzzle; `collection` (string, optional) — Chart collection slug, see description for the full enum; `country` (string, optional) — Two-letter storefront country code; `full_detail` (boolean, optional) — Expand each app via lookup API; `lang` (string, optional) — Result language tag; `num` (integer, optional) — Number of apps to return\n\n### `appstore_privacy`\n\n- **HTTP:** `GET /appstore/privacy/{id}`\n- **What:** Retrieve App Store privacy disclosures. Returns the app privacy cards shown on the App Store page, including data categories and purposes.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n### `appstore_ratings`\n\n- **HTTP:** `GET /appstore/ratings`\n- **What:** Retrieve App Store ratings histogram. Returns total ratings count and the 1-5 star histogram shown on the App Store product page.\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n### `appstore_reviews`\n\n- **HTTP:** `GET /appstore/reviews`\n- **What:** Retrieve App Store reviews. Returns one page of customer reviews for an app. Provide either `id` (numeric track ID) or `app_id` (bundle ID).\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag; `page` (integer, optional) — Review page number (1-10); `sort` (string, optional) — Sort order\n\n### `appstore_search`\n\n- **HTTP:** `GET /appstore/search`\n- **What:** Search the App Store. Returns App Store search results for a term. Set `ids_only=true` to return only app IDs. `platform` enum: `phone`, `pad`, `mac`.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `ids_only` (boolean, optional) — Return only app IDs; `lang` (string, optional) — Result language tag; `num` (integer, optional) — Number of apps per page; `page` (integer, optional) — Search page number (1-based); `platform` (string, optional) — App Store catalog to search: phone, pad, mac; `term` (string, **required**) — Search term\n\n### `appstore_similar`\n\n- **HTTP:** `GET /appstore/similar`\n- **What:** Retrieve \"You Might Also Like\" apps. Returns the related apps shown on the App Store product page. Provide either `id` (numeric track ID) or `app_id` (bundle ID).\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n### `appstore_suggest`\n\n- **HTTP:** `GET /appstore/suggest/{term}`\n- **What:** Retrieve App Store search suggestions. Returns suggested search terms for the given partial keyword.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `term` (string, **required**) — Partial search term\n\n### `appstore_version_history`\n\n- **HTTP:** `GET /appstore/version-history/{id}`\n- **What:** Retrieve App Store version history. Returns the version history entries shown in the App Store \"What's New\" section.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n## GooglePlay (11)\n\n### `googleplay_app`\n\n- **HTTP:** `GET /googleplay/app`\n- **What:** Retrieve full Google Play app details. Returns normalized app metadata from a Google Play details page, including installs, ratings, pricing, version info, developer metadata, media assets, release state, selected user comments, and \"More by this developer\" and \"Similar apps\" recommendation rails. For a per-device (phone/tablet/Chromebook) ratings-and-reviews breakdown, see `/googleplay/ratings`. Defaults: `country=us`, `lang=en`.\n- **Params:** `app_id` (string, **required**) — Google Play package name; `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_categories`\n\n- **HTTP:** `GET /googleplay/categories`\n- **What:** Retrieve Google Play app categories. Returns category ids found in the Google Play apps navigation.\n- **Params:** `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_datasafety`\n\n- **HTTP:** `GET /googleplay/datasafety`\n- **What:** Retrieve Google Play data safety details. Returns the data safety information displayed on Google Play.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_developer`\n\n- **HTTP:** `GET /googleplay/developer/{dev_id}`\n- **What:** Retrieve apps by Google Play developer. Returns apps published by a developer id or developer name.\n- **Params:** `country` (string, optional) — Two-letter country code; `dev_id` (string, **required**) — Developer id or name; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps\n\n### `googleplay_list`\n\n- **HTTP:** `GET /googleplay/list`\n- **What:** Retrieve apps from a Google Play top collection. Returns apps from a Google Play collection and category.\n- **Params:** `age` (string, optional) — Family age range; `category` (string, optional) — Category id; `collection` (string, optional) — Collection: TOP_FREE, TOP_PAID, GROSSING, NEW_FREE, NEW_PAID; `country` (string, optional) — Two-letter country code; `device` (string, optional) — Google Play device tab: phone, tablet, tv, chromebook, watch, xr, car; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps\n\n### `googleplay_permissions`\n\n- **HTTP:** `GET /googleplay/permissions`\n- **What:** Retrieve Google Play app permissions. Returns Google Play permission groups or a short permission name list.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code; `short` (boolean, optional) — Return only permission names\n\n### `googleplay_ratings`\n\n- **HTTP:** `GET /googleplay/ratings`\n- **What:** Get Google Play ratings by device. Returns the ratings-and-reviews breakdown Google Play shows under the details page's device tabs, one entry each for phone, tablet, and Chromebook. Defaults: `country=us`, `lang=en`.\n- **Params:** `app_id` (string, **required**) — Google Play package name; `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_reviews`\n\n- **HTTP:** `GET /googleplay/reviews`\n- **What:** Retrieve Google Play reviews. Returns one or more pages of app reviews. Set `paginate=true` to fetch only the requested page.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code; `next_pagination_token` (string, optional) — Token from a previous response; `num` (integer, optional) — Number of reviews; `paginate` (boolean, optional) — Only fetch the requested page; `sort` (string, optional) — Sort: helpfulness, newest, rating\n\n### `googleplay_search`\n\n- **HTTP:** `GET /googleplay/search`\n- **What:** Search Google Play. Returns Google Play search results for a term.\n- **Params:** `country` (string, optional) — Two-letter country code; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps; `price` (string, optional) — Price filter: all, free, paid; `term` (string, **required**) — Search term\n\n### `googleplay_similar`\n\n- **HTTP:** `GET /googleplay/similar`\n- **What:** Retrieve similar Google Play apps. Returns apps from the \"Similar apps\" cluster on an app details page.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `country` (string, optional) — Two-letter country code; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps\n\n### `googleplay_suggest`\n\n- **HTTP:** `GET /googleplay/suggest/{term}`\n- **What:** Retrieve Google Play query suggestions. Returns up to 10 suggestions for a search term.\n- **Params:** `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code; `term` (string, **required**) — Search term prefix\n\nFile v1.0.16:skill-card.md\n\n## Description:\n\nMines App Store and Google Play data via the Crawlora API — app details, reviews, ratings, store rankings, and similar apps — as clean JSON.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[crawlora-org](https://clawhub.ai/user/crawlora-org)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers, analysts, and ASO researchers use this skill to retrieve public App Store and Google Play app metadata, reviews, ratings, rankings, privacy or safety details, and similar-app lists for competitive research and review analysis.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Searches, app identifiers, locale parameters, and review or ranking requests are sent to Crawlora as a third-party API service.\n\nMitigation: Avoid sensitive private data in search terms or request parameters, and use the skill only when the user accepts Crawlora as the service provider.\n\nRisk: The Crawlora API key could be exposed if it is hardcoded, committed, or passed directly in prompts or commands.\n\nMitigation: Store the key only in CRAWLORA_API_KEY and avoid including it in request parameters, source files, logs, or shared outputs.\n\nRisk: Review and ranking results depend on storefront locale, pagination, and currently available public store data.\n\nMitigation: Specify country, language, page, and pagination settings explicitly, and describe coverage limits when summarizing results.\n\n## Reference(s):\n\n- [Endpoint reference](reference/endpoints.md)\n- [Crawlora](https://crawlora.net)\n- [Crawlora API base](https://api.crawlora.net/api/v1)\n- [ClawHub skill page](https://clawhub.ai/crawlora-org/skills/app-review-mining)\n\n## Skill Output:\n\n**Output Type(s):** [text, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with shell commands and JSON API responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires CRAWLORA_API_KEY; requests are sent to the Crawlora API and results are locale- and pagination-dependent.]\n\n## Skill Version(s):\n\n1.0.16 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.15: 5 files, 8526 bytes\n\nFiles: reference/endpoints.md (13627b), scripts/crawlora.sh (4326b), skill-card.md (2055b), SKILL.md (3555b), _meta.json (137b)\n\nFile v1.0.15:SKILL.md\n\n---\nname: app-review-mining\ndescription: Mines App Store and Google Play data via the Crawlora API — app details, reviews, ratings, store rankings, and similar apps — as clean JSON. Use when the user wants mobile-app reviews, ratings, store charts/rankings, or competitive ASO (app store optimization) research without scraping store pages.\n---\n\n# App review mining & ASO\n\nPull App Store (iOS) and Google Play (Android) app details, reviews, ratings,\nrankings, and similar-app lists as normalized JSON from the Crawlora API.\n\n## When to use this skill\n\n- \"What are the reviews / ratings for <app>?\"\n- \"How is <app> ranked?\" / \"top apps in <category>.\"\n- \"Find apps similar to <app>\" / competitive ASO research.\n- \"Pull this app's details / privacy / version history.\"\n- Building an app-review sentiment or competitor-tracking pipeline.\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\nChoose the store (both have parallel endpoints), then the job:\n\n1. **Find the app** — `/appstore/search?term=...` or `/googleplay/search?q=...`\n   to resolve the app id / bundle id.\n2. **Details** — `/appstore/app`, `/googleplay/app` for metadata, rating summary,\n   description, and developer.\n3. **Reviews** — `/appstore/reviews`, `/googleplay/reviews` (paginate) for the\n   review text, score, and date to mine sentiment and themes.\n4. **Rankings** — `/appstore/list`, `/googleplay/list` for store charts by category.\n5. **Competitors** — `/appstore/similar`, `/googleplay/similar` for similar apps.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Find an app, then pull its reviews (GET, key=value params):\nscripts/crawlora.sh /appstore/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /appstore/reviews id=1232780281 country=us | jq '.data'\n\nscripts/crawlora.sh /googleplay/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /googleplay/reviews app_id=\"notion.id\" | jq '.'\n```\n\nUse `scripts/crawlora.sh` for all requests; it keeps the API key out of command-line arguments.\n\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for every App Store and\nGoogle Play endpoint this skill uses (method, path, params, description).\n\n## Examples\n\n- **Review sentiment:** resolve the app id via search → `/appstore/reviews`\n  (paginate) → classify each review's sentiment and summarize top complaints/praise.\n- **Cross-store compare:** pull `/appstore/app` and `/googleplay/app` for the same\n  product to compare ratings and review volume across platforms.\n- **Category ranking watch:** `/googleplay/list` for a category to track where an\n  app sits in the charts over time.\n\n## Notes & limits\n\n- **Credits / pay-on-success:** billed only on `2xx`; free tier 2,000 credits/mo.\n  Key at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- **Public data only** — public store pages; respect Apple's and Google's terms.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- Reviews are paginated and locale-specific — pass `country`/`page` to widen coverage.\n\nFile v1.0.15:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"app-review-mining\",\n  \"version\": \"1.0.15\",\n  \"publishedAt\": 1789043431755\n}\n\nFile v1.0.15:reference/endpoints.md\n\n# app-review-mining — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**23 endpoints across 2 platform group(s).**\n\n## AppStore (12)\n\n### `appstore_app`\n\n- **HTTP:** `GET /appstore/app`\n- **What:** Retrieve full App Store app details. Returns normalized app metadata from the App Store lookup API. Provide either `id` (numeric track ID) or `app_id` (bundle ID). `id`/`app_id` can identify an iPhone, iPad, or Mac App Store listing.\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag; `platforms` (boolean, optional) — Include the full device-platform compatibility list (adds one extra upstream fetch); `ratings` (boolean, optional) — Include ratings histogram\n\n### `appstore_developer`\n\n- **HTTP:** `GET /appstore/developer/{dev_id}`\n- **What:** Retrieve apps by developer ID. Returns App Store apps associated with a specific developer artist ID.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `dev_id` (string, **required**) — Developer artist ID; `lang` (string, optional) — Result language tag\n\n### `appstore_editorial`\n\n- **HTTP:** `GET /appstore/editorial`\n- **What:** Retrieve an App Store device or Arcade editorial landing page. Returns the curated editorial shelves from one of Apple's per-device App Store landing pages (the same content shown by apps.apple.com's device switcher). `device` enum: `iphone`, `ipad`, `mac`, `vision`, `watch`, `tv`. `section` enum: `main` (the device's Today/Discover/Apps & Games landing page), `arcade` (the device's Apple Arcade landing page). Watch has no Arcade page — `device=watch` with `section=arcade` returns `400`.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `device` (string, **required**) — Apple device catalog; `lang` (string, optional) — Result language tag; `section` (string, optional) — Editorial section within the device\n\n### `appstore_editorial_category`\n\n- **HTTP:** `GET /appstore/editorial/category`\n- **What:** Retrieve an App Store category-scoped editorial page. Returns the curated editorial shelves for one device category page (e.g. \"Entertainment Apps for Vision\"). `category_id` is a numeric, device-specific editorial page ID — not a static enum — discovered from an `appstore_editorial` response for the SAME `device`, in its \"Browse by Category\" shelf items' `destination_id` field. `device` enum: `iphone`, `ipad`, `mac`, `vision`, `watch`, `tv`.\n- **Params:** `category_id` (string, **required**) — Numeric App Store editorial page ID, discovered from appstore_editorial (same device); `country` (string, optional) — Two-letter storefront country code; `device` (string, **required**) — Apple device catalog; `lang` (string, optional) — Result language tag\n\n### `appstore_list`\n\n- **HTTP:** `GET /appstore/list`\n- **What:** Retrieve App Store collection rankings. Returns ranked App Store apps from an iTunes RSS collection, optionally expanded to full lookup details. `collection` enum: `topfreeapplications`, `toppaidapplications`, `topgrossingapplications`, `topfreeipadapplications`, `toppaidipadapplications`, `topgrossingipadapplications`, `topmacapps`, `topfreemacapps`, `topgrossingmacapps`, `toppaidmacapps`, `newapplications`, `newfreeapplications`, `newpaidapplications`. Of the Mac collections, only `topfreemacapps` currently returns ranked apps — `topmacapps`, `topgrossingmacapps`, and `toppaidmacapps` are accepted but Apple's feed for them is currently empty. There is no separate Games `collection` — combine any collection with `category=6014` (or a Games subgenre ID, e.g. `7012` for Puzzle) to get its Games-only equivalent, e.g. Top Free Games. See the endpoint markdown for the full category ID table.\n- **Params:** `category` (integer, optional) — Numeric App Store category ID, see description for the full enum; e.g. 6014 = Games, 7012 = Games/Puzzle; `collection` (string, optional) — Chart collection slug, see description for the full enum; `country` (string, optional) — Two-letter storefront country code; `full_detail` (boolean, optional) — Expand each app via lookup API; `lang` (string, optional) — Result language tag; `num` (integer, optional) — Number of apps to return\n\n### `appstore_privacy`\n\n- **HTTP:** `GET /appstore/privacy/{id}`\n- **What:** Retrieve App Store privacy disclosures. Returns the app privacy cards shown on the App Store page, including data categories and purposes.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n### `appstore_ratings`\n\n- **HTTP:** `GET /appstore/ratings`\n- **What:** Retrieve App Store ratings histogram. Returns total ratings count and the 1-5 star histogram shown on the App Store product page.\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n### `appstore_reviews`\n\n- **HTTP:** `GET /appstore/reviews`\n- **What:** Retrieve App Store reviews. Returns one page of customer reviews for an app. Provide either `id` (numeric track ID) or `app_id` (bundle ID).\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag; `page` (integer, optional) — Review page number (1-10); `sort` (string, optional) — Sort order\n\n### `appstore_search`\n\n- **HTTP:** `GET /appstore/search`\n- **What:** Search the App Store. Returns App Store search results for a term. Set `ids_only=true` to return only app IDs. `platform` enum: `phone`, `pad`, `mac`.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `ids_only` (boolean, optional) — Return only app IDs; `lang` (string, optional) — Result language tag; `num` (integer, optional) — Number of apps per page; `page` (integer, optional) — Search page number (1-based); `platform` (string, optional) — App Store catalog to search: phone, pad, mac; `term` (string, **required**) — Search term\n\n### `appstore_similar`\n\n- **HTTP:** `GET /appstore/similar`\n- **What:** Retrieve \"You Might Also Like\" apps. Returns the related apps shown on the App Store product page. Provide either `id` (numeric track ID) or `app_id` (bundle ID).\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n### `appstore_suggest`\n\n- **HTTP:** `GET /appstore/suggest/{term}`\n- **What:** Retrieve App Store search suggestions. Returns suggested search terms for the given partial keyword.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `term` (string, **required**) — Partial search term\n\n### `appstore_version_history`\n\n- **HTTP:** `GET /appstore/version-history/{id}`\n- **What:** Retrieve App Store version history. Returns the version history entries shown in the App Store \"What's New\" section.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n## GooglePlay (11)\n\n### `googleplay_app`\n\n- **HTTP:** `GET /googleplay/app`\n- **What:** Retrieve full Google Play app details. Returns normalized app metadata from a Google Play details page, including installs, ratings, pricing, version info, developer metadata, media assets, release state, selected user comments, and \"More by this developer\" and \"Similar apps\" recommendation rails. For a per-device (phone/tablet/Chromebook) ratings-and-reviews breakdown, see `/googleplay/ratings`. Defaults: `country=us`, `lang=en`.\n- **Params:** `app_id` (string, **required**) — Google Play package name; `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_categories`\n\n- **HTTP:** `GET /googleplay/categories`\n- **What:** Retrieve Google Play app categories. Returns category ids found in the Google Play apps navigation.\n- **Params:** `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_datasafety`\n\n- **HTTP:** `GET /googleplay/datasafety`\n- **What:** Retrieve Google Play data safety details. Returns the data safety information displayed on Google Play.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_developer`\n\n- **HTTP:** `GET /googleplay/developer/{dev_id}`\n- **What:** Retrieve apps by Google Play developer. Returns apps published by a developer id or developer name.\n- **Params:** `country` (string, optional) — Two-letter country code; `dev_id` (string, **required**) — Developer id or name; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps\n\n### `googleplay_list`\n\n- **HTTP:** `GET /googleplay/list`\n- **What:** Retrieve apps from a Google Play top collection. Returns apps from a Google Play collection and category.\n- **Params:** `age` (string, optional) — Family age range; `category` (string, optional) — Category id; `collection` (string, optional) — Collection: TOP_FREE, TOP_PAID, GROSSING, NEW_FREE, NEW_PAID; `country` (string, optional) — Two-letter country code; `device` (string, optional) — Google Play device tab: phone, tablet, tv, chromebook, watch, xr, car; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps\n\n### `googleplay_permissions`\n\n- **HTTP:** `GET /googleplay/permissions`\n- **What:** Retrieve Google Play app permissions. Returns Google Play permission groups or a short permission name list.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code; `short` (boolean, optional) — Return only permission names\n\n### `googleplay_ratings`\n\n- **HTTP:** `GET /googleplay/ratings`\n- **What:** Get Google Play ratings by device. Returns the ratings-and-reviews breakdown Google Play shows under the details page's device tabs, one entry each for phone, tablet, and Chromebook. Defaults: `country=us`, `lang=en`.\n- **Params:** `app_id` (string, **required**) — Google Play package name; `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_reviews`\n\n- **HTTP:** `GET /googleplay/reviews`\n- **What:** Retrieve Google Play reviews. Returns one or more pages of app reviews. Set `paginate=true` to fetch only the requested page.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code; `next_pagination_token` (string, optional) — Token from a previous response; `num` (integer, optional) — Number of reviews; `paginate` (boolean, optional) — Only fetch the requested page; `sort` (string, optional) — Sort: helpfulness, newest, rating\n\n### `googleplay_search`\n\n- **HTTP:** `GET /googleplay/search`\n- **What:** Search Google Play. Returns Google Play search results for a term.\n- **Params:** `country` (string, optional) — Two-letter country code; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps; `price` (string, optional) — Price filter: all, free, paid; `term` (string, **required**) — Search term\n\n### `googleplay_similar`\n\n- **HTTP:** `GET /googleplay/similar`\n- **What:** Retrieve similar Google Play apps. Returns apps from the \"Similar apps\" cluster on an app details page.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `country` (string, optional) — Two-letter country code; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps\n\n### `googleplay_suggest`\n\n- **HTTP:** `GET /googleplay/suggest/{term}`\n- **What:** Retrieve Google Play query suggestions. Returns up to 10 suggestions for a search term.\n- **Params:** `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code; `term` (string, **required**) — Search term prefix\n\nFile v1.0.15:skill-card.md\n\n## Description:\n\nMines App Store and Google Play data via the Crawlora API - app details, reviews, ratings, store rankings, and similar apps - as clean JSON.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[crawlora-org](https://clawhub.ai/user/crawlora-org)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers, product teams, and ASO researchers use this skill to retrieve public mobile-app metadata, reviews, ratings, rankings, and similar-app lists for app review mining, competitive analysis, and monitoring workflows.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The helper uses a Crawlora API key and sends app-store research queries to Crawlora.\n\nMitigation: Install only for trusted workflows, keep CRAWLORA_API_KEY in the environment, and avoid hardcoding, committing, or passing the key in query parameters.\n\nRisk: Security evidence notes that the helper can make broader authenticated Crawlora API calls than the endpoint reference describes.\n\nMitigation: Review scripts/crawlora.sh before use, prefer documented GET endpoints, and do not let untrusted prompts supply raw paths, -X POST, or request bodies.\n\n## Reference(s):\n\n- [Endpoint reference](reference/endpoints.md)\n- [Crawlora](https://crawlora.net)\n- [ClawHub skill page](https://clawhub.ai/crawlora-org/skills/app-review-mining)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance, JSON]\n\n**Output Format:** [Markdown guidance with shell command examples and JSON API responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires CRAWLORA_API_KEY and returns Crawlora JSON for public App Store and Google Play data.]\n\n## Skill Version(s):\n\n1.0.15 (source: release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.14: 5 files, 8541 bytes\n\nFiles: reference/endpoints.md (13627b), scripts/crawlora.sh (4069b), skill-card.md (2401b), SKILL.md (3555b), _meta.json (137b)\n\nFile v1.0.14:SKILL.md\n\n---\nname: app-review-mining\ndescription: Mines App Store and Google Play data via the Crawlora API — app details, reviews, ratings, store rankings, and similar apps — as clean JSON. Use when the user wants mobile-app reviews, ratings, store charts/rankings, or competitive ASO (app store optimization) research without scraping store pages.\n---\n\n# App review mining & ASO\n\nPull App Store (iOS) and Google Play (Android) app details, reviews, ratings,\nrankings, and similar-app lists as normalized JSON from the Crawlora API.\n\n## When to use this skill\n\n- \"What are the reviews / ratings for <app>?\"\n- \"How is <app> ranked?\" / \"top apps in <category>.\"\n- \"Find apps similar to <app>\" / competitive ASO research.\n- \"Pull this app's details / privacy / version history.\"\n- Building an app-review sentiment or competitor-tracking pipeline.\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\nChoose the store (both have parallel endpoints), then the job:\n\n1. **Find the app** — `/appstore/search?term=...` or `/googleplay/search?q=...`\n   to resolve the app id / bundle id.\n2. **Details** — `/appstore/app`, `/googleplay/app` for metadata, rating summary,\n   description, and developer.\n3. **Reviews** — `/appstore/reviews`, `/googleplay/reviews` (paginate) for the\n   review text, score, and date to mine sentiment and themes.\n4. **Rankings** — `/appstore/list`, `/googleplay/list` for store charts by category.\n5. **Competitors** — `/appstore/similar`, `/googleplay/similar` for similar apps.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Find an app, then pull its reviews (GET, key=value params):\nscripts/crawlora.sh /appstore/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /appstore/reviews id=1232780281 country=us | jq '.data'\n\nscripts/crawlora.sh /googleplay/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /googleplay/reviews app_id=\"notion.id\" | jq '.'\n```\n\nUse `scripts/crawlora.sh` for all requests; it keeps the API key out of command-line arguments.\n\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for every App Store and\nGoogle Play endpoint this skill uses (method, path, params, description).\n\n## Examples\n\n- **Review sentiment:** resolve the app id via search → `/appstore/reviews`\n  (paginate) → classify each review's sentiment and summarize top complaints/praise.\n- **Cross-store compare:** pull `/appstore/app` and `/googleplay/app` for the same\n  product to compare ratings and review volume across platforms.\n- **Category ranking watch:** `/googleplay/list` for a category to track where an\n  app sits in the charts over time.\n\n## Notes & limits\n\n- **Credits / pay-on-success:** billed only on `2xx`; free tier 2,000 credits/mo.\n  Key at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- **Public data only** — public store pages; respect Apple's and Google's terms.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- Reviews are paginated and locale-specific — pass `country`/`page` to widen coverage.\n\nFile v1.0.14:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"app-review-mining\",\n  \"version\": \"1.0.14\",\n  \"publishedAt\": 1789042458519\n}\n\nFile v1.0.14:reference/endpoints.md\n\n# app-review-mining — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**23 endpoints across 2 platform group(s).**\n\n## AppStore (12)\n\n### `appstore_app`\n\n- **HTTP:** `GET /appstore/app`\n- **What:** Retrieve full App Store app details. Returns normalized app metadata from the App Store lookup API. Provide either `id` (numeric track ID) or `app_id` (bundle ID). `id`/`app_id` can identify an iPhone, iPad, or Mac App Store listing.\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag; `platforms` (boolean, optional) — Include the full device-platform compatibility list (adds one extra upstream fetch); `ratings` (boolean, optional) — Include ratings histogram\n\n### `appstore_developer`\n\n- **HTTP:** `GET /appstore/developer/{dev_id}`\n- **What:** Retrieve apps by developer ID. Returns App Store apps associated with a specific developer artist ID.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `dev_id` (string, **required**) — Developer artist ID; `lang` (string, optional) — Result language tag\n\n### `appstore_editorial`\n\n- **HTTP:** `GET /appstore/editorial`\n- **What:** Retrieve an App Store device or Arcade editorial landing page. Returns the curated editorial shelves from one of Apple's per-device App Store landing pages (the same content shown by apps.apple.com's device switcher). `device` enum: `iphone`, `ipad`, `mac`, `vision`, `watch`, `tv`. `section` enum: `main` (the device's Today/Discover/Apps & Games landing page), `arcade` (the device's Apple Arcade landing page). Watch has no Arcade page — `device=watch` with `section=arcade` returns `400`.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `device` (string, **required**) — Apple device catalog; `lang` (string, optional) — Result language tag; `section` (string, optional) — Editorial section within the device\n\n### `appstore_editorial_category`\n\n- **HTTP:** `GET /appstore/editorial/category`\n- **What:** Retrieve an App Store category-scoped editorial page. Returns the curated editorial shelves for one device category page (e.g. \"Entertainment Apps for Vision\"). `category_id` is a numeric, device-specific editorial page ID — not a static enum — discovered from an `appstore_editorial` response for the SAME `device`, in its \"Browse by Category\" shelf items' `destination_id` field. `device` enum: `iphone`, `ipad`, `mac`, `vision`, `watch`, `tv`.\n- **Params:** `category_id` (string, **required**) — Numeric App Store editorial page ID, discovered from appstore_editorial (same device); `country` (string, optional) — Two-letter storefront country code; `device` (string, **required**) — Apple device catalog; `lang` (string, optional) — Result language tag\n\n### `appstore_list`\n\n- **HTTP:** `GET /appstore/list`\n- **What:** Retrieve App Store collection rankings. Returns ranked App Store apps from an iTunes RSS collection, optionally expanded to full lookup details. `collection` enum: `topfreeapplications`, `toppaidapplications`, `topgrossingapplications`, `topfreeipadapplications`, `toppaidipadapplications`, `topgrossingipadapplications`, `topmacapps`, `topfreemacapps`, `topgrossingmacapps`, `toppaidmacapps`, `newapplications`, `newfreeapplications`, `newpaidapplications`. Of the Mac collections, only `topfreemacapps` currently returns ranked apps — `topmacapps`, `topgrossingmacapps`, and `toppaidmacapps` are accepted but Apple's feed for them is currently empty. There is no separate Games `collection` — combine any collection with `category=6014` (or a Games subgenre ID, e.g. `7012` for Puzzle) to get its Games-only equivalent, e.g. Top Free Games. See the endpoint markdown for the full category ID table.\n- **Params:** `category` (integer, optional) — Numeric App Store category ID, see description for the full enum; e.g. 6014 = Games, 7012 = Games/Puzzle; `collection` (string, optional) — Chart collection slug, see description for the full enum; `country` (string, optional) — Two-letter storefront country code; `full_detail` (boolean, optional) — Expand each app via lookup API; `lang` (string, optional) — Result language tag; `num` (integer, optional) — Number of apps to return\n\n### `appstore_privacy`\n\n- **HTTP:** `GET /appstore/privacy/{id}`\n- **What:** Retrieve App Store privacy disclosures. Returns the app privacy cards shown on the App Store page, including data categories and purposes.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n### `appstore_ratings`\n\n- **HTTP:** `GET /appstore/ratings`\n- **What:** Retrieve App Store ratings histogram. Returns total ratings count and the 1-5 star histogram shown on the App Store product page.\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n### `appstore_reviews`\n\n- **HTTP:** `GET /appstore/reviews`\n- **What:** Retrieve App Store reviews. Returns one page of customer reviews for an app. Provide either `id` (numeric track ID) or `app_id` (bundle ID).\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag; `page` (integer, optional) — Review page number (1-10); `sort` (string, optional) — Sort order\n\n### `appstore_search`\n\n- **HTTP:** `GET /appstore/search`\n- **What:** Search the App Store. Returns App Store search results for a term. Set `ids_only=true` to return only app IDs. `platform` enum: `phone`, `pad`, `mac`.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `ids_only` (boolean, optional) — Return only app IDs; `lang` (string, optional) — Result language tag; `num` (integer, optional) — Number of apps per page; `page` (integer, optional) — Search page number (1-based); `platform` (string, optional) — App Store catalog to search: phone, pad, mac; `term` (string, **required**) — Search term\n\n### `appstore_similar`\n\n- **HTTP:** `GET /appstore/similar`\n- **What:** Retrieve \"You Might Also Like\" apps. Returns the related apps shown on the App Store product page. Provide either `id` (numeric track ID) or `app_id` (bundle ID).\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n### `appstore_suggest`\n\n- **HTTP:** `GET /appstore/suggest/{term}`\n- **What:** Retrieve App Store search suggestions. Returns suggested search terms for the given partial keyword.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `term` (string, **required**) — Partial search term\n\n### `appstore_version_history`\n\n- **HTTP:** `GET /appstore/version-history/{id}`\n- **What:** Retrieve App Store version history. Returns the version history entries shown in the App Store \"What's New\" section.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n## GooglePlay (11)\n\n### `googleplay_app`\n\n- **HTTP:** `GET /googleplay/app`\n- **What:** Retrieve full Google Play app details. Returns normalized app metadata from a Google Play details page, including installs, ratings, pricing, version info, developer metadata, media assets, release state, selected user comments, and \"More by this developer\" and \"Similar apps\" recommendation rails. For a per-device (phone/tablet/Chromebook) ratings-and-reviews breakdown, see `/googleplay/ratings`. Defaults: `country=us`, `lang=en`.\n- **Params:** `app_id` (string, **required**) — Google Play package name; `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_categories`\n\n- **HTTP:** `GET /googleplay/categories`\n- **What:** Retrieve Google Play app categories. Returns category ids found in the Google Play apps navigation.\n- **Params:** `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_datasafety`\n\n- **HTTP:** `GET /googleplay/datasafety`\n- **What:** Retrieve Google Play data safety details. Returns the data safety information displayed on Google Play.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_developer`\n\n- **HTTP:** `GET /googleplay/developer/{dev_id}`\n- **What:** Retrieve apps by Google Play developer. Returns apps published by a developer id or developer name.\n- **Params:** `country` (string, optional) — Two-letter country code; `dev_id` (string, **required**) — Developer id or name; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps\n\n### `googleplay_list`\n\n- **HTTP:** `GET /googleplay/list`\n- **What:** Retrieve apps from a Google Play top collection. Returns apps from a Google Play collection and category.\n- **Params:** `age` (string, optional) — Family age range; `category` (string, optional) — Category id; `collection` (string, optional) — Collection: TOP_FREE, TOP_PAID, GROSSING, NEW_FREE, NEW_PAID; `country` (string, optional) — Two-letter country code; `device` (string, optional) — Google Play device tab: phone, tablet, tv, chromebook, watch, xr, car; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps\n\n### `googleplay_permissions`\n\n- **HTTP:** `GET /googleplay/permissions`\n- **What:** Retrieve Google Play app permissions. Returns Google Play permission groups or a short permission name list.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code; `short` (boolean, optional) — Return only permission names\n\n### `googleplay_ratings`\n\n- **HTTP:** `GET /googleplay/ratings`\n- **What:** Get Google Play ratings by device. Returns the ratings-and-reviews breakdown Google Play shows under the details page's device tabs, one entry each for phone, tablet, and Chromebook. Defaults: `country=us`, `lang=en`.\n- **Params:** `app_id` (string, **required**) — Google Play package name; `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_reviews`\n\n- **HTTP:** `GET /googleplay/reviews`\n- **What:** Retrieve Google Play reviews. Returns one or more pages of app reviews. Set `paginate=true` to fetch only the requested page.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code; `next_pagination_token` (string, optional) — Token from a previous response; `num` (integer, optional) — Number of reviews; `paginate` (boolean, optional) — Only fetch the requested page; `sort` (string, optional) — Sort: helpfulness, newest, rating\n\n### `googleplay_search`\n\n- **HTTP:** `GET /googleplay/search`\n- **What:** Search Google Play. Returns Google Play search results for a term.\n- **Params:** `country` (string, optional) — Two-letter country code; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps; `price` (string, optional) — Price filter: all, free, paid; `term` (string, **required**) — Search term\n\n### `googleplay_similar`\n\n- **HTTP:** `GET /googleplay/similar`\n- **What:** Retrieve similar Google Play apps. Returns apps from the \"Similar apps\" cluster on an app details page.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `country` (string, optional) — Two-letter country code; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps\n\n### `googleplay_suggest`\n\n- **HTTP:** `GET /googleplay/suggest/{term}`\n- **What:** Retrieve Google Play query suggestions. Returns up to 10 suggestions for a search term.\n- **Params:** `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code; `term` (string, **required**) — Search term prefix\n\nFile v1.0.14:skill-card.md\n\n## Description:\n\nMines App Store and Google Play data via the Crawlora API for app details, reviews, ratings, store rankings, and similar apps as clean JSON.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[crawlora-org](https://clawhub.ai/user/crawlora-org)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers, analysts, and ASO teams use this skill to retrieve public mobile app metadata, reviews, ratings, rankings, and similar-app data from App Store and Google Play through Crawlora.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: App identifiers, search terms, locale parameters, and POST bodies are sent to Crawlora using the user's Crawlora API key.\n\nMitigation: Use the skill for public app-store research inputs only; do not submit secrets, private customer data, or regulated personal data.\n\nRisk: Locale-specific and paginated review data can be incomplete if country, language, or page parameters are omitted.\n\nMitigation: Pass country, lang, and pagination parameters explicitly when locale coverage or broader review sampling matters.\n\nRisk: API keys can be exposed if copied into prompts, files, URLs, or command arguments outside the helper workflow.\n\nMitigation: Store the key only in CRAWLORA_API_KEY, do not hardcode or commit it, and use the provided helper so the key stays out of command-line arguments.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/crawlora-org/skills/app-review-mining)\n- [Crawlora publisher profile](https://clawhub.ai/user/crawlora-org)\n- [Crawlora](https://crawlora.net)\n- [Crawlora API](https://api.crawlora.net/api/v1)\n- [Endpoint reference](reference/endpoints.md)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with shell commands that return JSON from the Crawlora API.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires CRAWLORA_API_KEY and sends documented API requests to Crawlora for public app-store data.]\n\n## Skill Version(s):\n\n1.0.14 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.13: 5 files, 8195 bytes\n\nFiles: reference/endpoints.md (13627b), scripts/crawlora.sh (3744b), skill-card.md (1950b), SKILL.md (3585b), _meta.json (137b)\n\nFile v1.0.13:SKILL.md\n\n---\nname: app-review-mining\ndescription: Mines App Store and Google Play data via the Crawlora API — app details, reviews, ratings, store rankings, and similar apps — as clean JSON. Use when the user wants mobile-app reviews, ratings, store charts/rankings, or competitive ASO (app store optimization) research without scraping store pages.\n---\n\n# App review mining & ASO\n\nPull App Store (iOS) and Google Play (Android) app details, reviews, ratings,\nrankings, and similar-app lists as normalized JSON from the Crawlora API.\n\n## When to use this skill\n\n- \"What are the reviews / ratings for <app>?\"\n- \"How is <app> ranked?\" / \"top apps in <category>.\"\n- \"Find apps similar to <app>\" / competitive ASO research.\n- \"Pull this app's details / privacy / version history.\"\n- Building an app-review sentiment or competitor-tracking pipeline.\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- All requests: `x-api-key: $CRAWLORA_API_KEY` against\n  `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\nChoose the store (both have parallel endpoints), then the job:\n\n1. **Find the app** — `/appstore/search?term=...` or `/googleplay/search?q=...`\n   to resolve the app id / bundle id.\n2. **Details** — `/appstore/app`, `/googleplay/app` for metadata, rating summary,\n   description, and developer.\n3. **Reviews** — `/appstore/reviews`, `/googleplay/reviews` (paginate) for the\n   review text, score, and date to mine sentiment and themes.\n4. **Rankings** — `/appstore/list`, `/googleplay/list` for store charts by category.\n5. **Competitors** — `/appstore/similar`, `/googleplay/similar` for similar apps.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Find an app, then pull its reviews (GET, key=value params):\nscripts/crawlora.sh /appstore/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /appstore/reviews id=1232780281 country=us | jq '.data'\n\nscripts/crawlora.sh /googleplay/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /googleplay/reviews app_id=\"notion.id\" | jq '.'\n```\n\nRaw `curl` fallback:\n\n```sh\ncurl -fsS -H \"x-api-key: $CRAWLORA_API_KEY\" \\\n  \"https://api.crawlora.net/api/v1/appstore/search?term=notion\" | jq '.'\n```\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for every App Store and\nGoogle Play endpoint this skill uses (method, path, params, description).\n\n## Examples\n\n- **Review sentiment:** resolve the app id via search → `/appstore/reviews`\n  (paginate) → classify each review's sentiment and summarize top complaints/praise.\n- **Cross-store compare:** pull `/appstore/app` and `/googleplay/app` for the same\n  product to compare ratings and review volume across platforms.\n- **Category ranking watch:** `/googleplay/list` for a category to track where an\n  app sits in the charts over time.\n\n## Notes & limits\n\n- **Credits / pay-on-success:** billed only on `2xx`; free tier 2,000 credits/mo.\n  Key at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- **Public data only** — public store pages; respect Apple's and Google's terms.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- Reviews are paginated and locale-specific — pass `country`/`page` to widen coverage.\n\nFile v1.0.13:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"app-review-mining\",\n  \"version\": \"1.0.13\",\n  \"publishedAt\": 1789041885433\n}\n\nFile v1.0.13:reference/endpoints.md\n\n# app-review-mining — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**23 endpoints across 2 platform group(s).**\n\n## AppStore (12)\n\n### `appstore_app`\n\n- **HTTP:** `GET /appstore/app`\n- **What:** Retrieve full App Store app details. Returns normalized app metadata from the App Store lookup API. Provide either `id` (numeric track ID) or `app_id` (bundle ID). `id`/`app_id` can identify an iPhone, iPad, or Mac App Store listing.\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag; `platforms` (boolean, optional) — Include the full device-platform compatibility list (adds one extra upstream fetch); `ratings` (boolean, optional) — Include ratings histogram\n\n### `appstore_developer`\n\n- **HTTP:** `GET /appstore/developer/{dev_id}`\n- **What:** Retrieve apps by developer ID. Returns App Store apps associated with a specific developer artist ID.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `dev_id` (string, **required**) — Developer artist ID; `lang` (string, optional) — Result language tag\n\n### `appstore_editorial`\n\n- **HTTP:** `GET /appstore/editorial`\n- **What:** Retrieve an App Store device or Arcade editorial landing page. Returns the curated editorial shelves from one of Apple's per-device App Store landing pages (the same content shown by apps.apple.com's device switcher). `device` enum: `iphone`, `ipad`, `mac`, `vision`, `watch`, `tv`. `section` enum: `main` (the device's Today/Discover/Apps & Games landing page), `arcade` (the device's Apple Arcade landing page). Watch has no Arcade page — `device=watch` with `section=arcade` returns `400`.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `device` (string, **required**) — Apple device catalog; `lang` (string, optional) — Result language tag; `section` (string, optional) — Editorial section within the device\n\n### `appstore_editorial_category`\n\n- **HTTP:** `GET /appstore/editorial/category`\n- **What:** Retrieve an App Store category-scoped editorial page. Returns the curated editorial shelves for one device category page (e.g. \"Entertainment Apps for Vision\"). `category_id` is a numeric, device-specific editorial page ID — not a static enum — discovered from an `appstore_editorial` response for the SAME `device`, in its \"Browse by Category\" shelf items' `destination_id` field. `device` enum: `iphone`, `ipad`, `mac`, `vision`, `watch`, `tv`.\n- **Params:** `category_id` (string, **required**) — Numeric App Store editorial page ID, discovered from appstore_editorial (same device); `country` (string, optional) — Two-letter storefront country code; `device` (string, **required**) — Apple device catalog; `lang` (string, optional) — Result language tag\n\n### `appstore_list`\n\n- **HTTP:** `GET /appstore/list`\n- **What:** Retrieve App Store collection rankings. Returns ranked App Store apps from an iTunes RSS collection, optionally expanded to full lookup details. `collection` enum: `topfreeapplications`, `toppaidapplications`, `topgrossingapplications`, `topfreeipadapplications`, `toppaidipadapplications`, `topgrossingipadapplications`, `topmacapps`, `topfreemacapps`, `topgrossingmacapps`, `toppaidmacapps`, `newapplications`, `newfreeapplications`, `newpaidapplications`. Of the Mac collections, only `topfreemacapps` currently returns ranked apps — `topmacapps`, `topgrossingmacapps`, and `toppaidmacapps` are accepted but Apple's feed for them is currently empty. There is no separate Games `collection` — combine any collection with `category=6014` (or a Games subgenre ID, e.g. `7012` for Puzzle) to get its Games-only equivalent, e.g. Top Free Games. See the endpoint markdown for the full category ID table.\n- **Params:** `category` (integer, optional) — Numeric App Store category ID, see description for the full enum; e.g. 6014 = Games, 7012 = Games/Puzzle; `collection` (string, optional) — Chart collection slug, see description for the full enum; `country` (string, optional) — Two-letter storefront country code; `full_detail` (boolean, optional) — Expand each app via lookup API; `lang` (string, optional) — Result language tag; `num` (integer, optional) — Number of apps to return\n\n### `appstore_privacy`\n\n- **HTTP:** `GET /appstore/privacy/{id}`\n- **What:** Retrieve App Store privacy disclosures. Returns the app privacy cards shown on the App Store page, including data categories and purposes.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n### `appstore_ratings`\n\n- **HTTP:** `GET /appstore/ratings`\n- **What:** Retrieve App Store ratings histogram. Returns total ratings count and the 1-5 star histogram shown on the App Store product page.\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n### `appstore_reviews`\n\n- **HTTP:** `GET /appstore/reviews`\n- **What:** Retrieve App Store reviews. Returns one page of customer reviews for an app. Provide either `id` (numeric track ID) or `app_id` (bundle ID).\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag; `page` (integer, optional) — Review page number (1-10); `sort` (string, optional) — Sort order\n\n### `appstore_search`\n\n- **HTTP:** `GET /appstore/search`\n- **What:** Search the App Store. Returns App Store search results for a term. Set `ids_only=true` to return only app IDs. `platform` enum: `phone`, `pad`, `mac`.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `ids_only` (boolean, optional) — Return only app IDs; `lang` (string, optional) — Result language tag; `num` (integer, optional) — Number of apps per page; `page` (integer, optional) — Search page number (1-based); `platform` (string, optional) — App Store catalog to search: phone, pad, mac; `term` (string, **required**) — Search term\n\n### `appstore_similar`\n\n- **HTTP:** `GET /appstore/similar`\n- **What:** Retrieve \"You Might Also Like\" apps. Returns the related apps shown on the App Store product page. Provide either `id` (numeric track ID) or `app_id` (bundle ID).\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n### `appstore_suggest`\n\n- **HTTP:** `GET /appstore/suggest/{term}`\n- **What:** Retrieve App Store search suggestions. Returns suggested search terms for the given partial keyword.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `term` (string, **required**) — Partial search term\n\n### `appstore_version_history`\n\n- **HTTP:** `GET /appstore/version-history/{id}`\n- **What:** Retrieve App Store version history. Returns the version history entries shown in the App Store \"What's New\" section.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag\n\n## GooglePlay (11)\n\n### `googleplay_app`\n\n- **HTTP:** `GET /googleplay/app`\n- **What:** Retrieve full Google Play app details. Returns normalized app metadata from a Google Play details page, including installs, ratings, pricing, version info, developer metadata, media assets, release state, selected user comments, and \"More by this developer\" and \"Similar apps\" recommendation rails. For a per-device (phone/tablet/Chromebook) ratings-and-reviews breakdown, see `/googleplay/ratings`. Defaults: `country=us`, `lang=en`.\n- **Params:** `app_id` (string, **required**) — Google Play package name; `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_categories`\n\n- **HTTP:** `GET /googleplay/categories`\n- **What:** Retrieve Google Play app categories. Returns category ids found in the Google Play apps navigation.\n- **Params:** `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_datasafety`\n\n- **HTTP:** `GET /googleplay/datasafety`\n- **What:** Retrieve Google Play data safety details. Returns the data safety information displayed on Google Play.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_developer`\n\n- **HTTP:** `GET /googleplay/developer/{dev_id}`\n- **What:** Retrieve apps by Google Play developer. Returns apps published by a developer id or developer name.\n- **Params:** `country` (string, optional) — Two-letter country code; `dev_id` (string, **required**) — Developer id or name; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps\n\n### `googleplay_list`\n\n- **HTTP:** `GET /googleplay/list`\n- **What:** Retrieve apps from a Google Play top collection. Returns apps from a Google Play collection and category.\n- **Params:** `age` (string, optional) — Family age range; `category` (string, optional) — Category id; `collection` (string, optional) — Collection: TOP_FREE, TOP_PAID, GROSSING, NEW_FREE, NEW_PAID; `country` (string, optional) — Two-letter country code; `device` (string, optional) — Google Play device tab: phone, tablet, tv, chromebook, watch, xr, car; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps\n\n### `googleplay_permissions`\n\n- **HTTP:** `GET /googleplay/permissions`\n- **What:** Retrieve Google Play app permissions. Returns Google Play permission groups or a short permission name list.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code; `short` (boolean, optional) — Return only permission names\n\n### `googleplay_ratings`\n\n- **HTTP:** `GET /googleplay/ratings`\n- **What:** Get Google Play ratings by device. Returns the ratings-and-reviews breakdown Google Play shows under the details page's device tabs, one entry each for phone, tablet, and Chromebook. Defaults: `country=us`, `lang=en`.\n- **Params:** `app_id` (string, **required**) — Google Play package name; `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Two-letter language code\n\n### `googleplay_reviews`\n\n- **HTTP:** `GET /googleplay/reviews`\n- **What:** Retrieve Google Play reviews. Returns one or more pages of app reviews. Set `paginate=true` to fetch only the requested page.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code; `next_pagination_token` (string, optional) — Token from a previous response; `num` (integer, optional) — Number of reviews; `paginate` (boolean, optional) — Only fetch the requested page; `sort` (string, optional) — Sort: helpfulness, newest, rating\n\n### `googleplay_search`\n\n- **HTTP:** `GET /googleplay/search`\n- **What:** Search Google Play. Returns Google Play search results for a term.\n- **Params:** `country` (string, optional) — Two-letter country code; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps; `price` (string, optional) — Price filter: all, free, paid; `term` (string, **required**) — Search term\n\n### `googleplay_similar`\n\n- **HTTP:** `GET /googleplay/similar`\n- **What:** Retrieve similar Google Play apps. Returns apps from the \"Similar apps\" cluster on an app details page.\n- **Params:** `app_id` (string, **required**) — Google Play app id; `country` (string, optional) — Two-letter country code; `full_detail` (boolean, optional) — Resolve each app to full detail; `lang` (string, optional) — Two-letter language code; `num` (integer, optional) — Number of apps\n\n### `googleplay_suggest`\n\n- **HTTP:** `GET /googleplay/suggest/{term}`\n- **What:** Retrieve Google Play query suggestions. Returns up to 10 suggestions for a search term.\n- **Params:** `country` (string, optional) — Two-letter country code; `lang` (string, optional) — Two-letter language code; `term` (string, **required**) — Search term prefix\n\nFile v1.0.13:skill-card.md\n\n## Description:\n\nMines App Store and Google Play data via the Crawlora API for app details, reviews, ratings, store rankings, and similar apps as clean JSON.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[crawlora-org](https://clawhub.ai/user/crawlora-org)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers, analysts, and ASO researchers use this skill to retrieve public App Store and Google Play metadata, reviews, ratings, rankings, and similar-app data for review mining, competitor tracking, and app-store optimization research.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: App-store lookup terms and request parameters are sent to the Crawlora API.\n\nMitigation: Use the skill only for intended public app-store research and avoid sensitive or unrelated data.\n\nRisk: The Crawlora API key could be exposed if it is hardcoded, committed, or passed outside the intended environment variable.\n\nMitigation: Keep CRAWLORA_API_KEY in the environment or a secret manager, and do not hardcode, commit, or send it as a query parameter.\n\n## Reference(s):\n\n- [Endpoint reference](reference/endpoints.md)\n- [Crawlora](https://crawlora.net)\n- [Crawlora API base](https://api.crawlora.net/api/v1)\n\n## Skill Output:\n\n**Output Type(s):** [JSON, Shell commands, Configuration, Guidance]\n\n**Output Format:** [JSON responses with Markdown guidance and shell command examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires CRAWLORA_API_KEY; results depend on Crawlora credits, pagination, locale, and selected store endpoint.]\n\n## Skill Version(s):\n\n1.0.13 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.12: 5 files, 8240 bytes\n\nFiles: reference/endpoints.md (13627b), scripts/crawlora.sh (3444b), skill-card.md (2346b), SKILL.md (3585b), _meta.json (137b)\n\nFile v1.0.12:SKILL.md\n\n---\nname: app-review-mining\ndescription: Mines App Store and Google Play data via the Crawlora API — app details, reviews, ratings, store rankings, and similar apps — as clean JSON. Use when the user wants mobile-app reviews, ratings, store charts/rankings, or competitive ASO (app store optimization) research without scraping store pages.\n---\n\n# App review mining & ASO\n\nPull App Store (iOS) and Google Play (Android) app details, reviews, ratings,\nrankings, and similar-app lists as normalized JSON from the Crawlora API.\n\n## When to use this skill\n\n- \"What are the reviews / ratings for <app>?\"\n- \"How is <app> ranked?\" / \"top apps in <category>.\"\n- \"Find apps similar to <app>\" / competitive ASO research.\n- \"Pull this app's details / privacy / version history.\"\n- Building an app-review sentiment or competitor-tracking pipeline.\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- All requests: `x-api-key: $CRAWLORA_API_KEY` against\n  `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\nChoose the store (both have parallel endpoints), then the job:\n\n1. **Find the app** — `/appstore/search?term=...` or `/googleplay/search?q=...`\n   to resolve the app id / bundle id.\n2. **Details** — `/appstore/app`, `/googleplay/app` for metadata, rating summary,\n   description, and developer.\n3. **Reviews** — `/appstore/reviews`, `/googleplay/reviews` (paginate) for the\n   review text, score, and date to mine sentiment and themes.\n4. **Rankings** — `/appstore/list`, `/googleplay/list` for store charts by category.\n5. **Competitors** — `/appstore/similar`, `/googleplay/similar` for similar apps.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Find an app, then pull its reviews (GET, key=value params):\nscripts/crawlora.sh /appstore/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /appstore/reviews id=1232780281 country=us | jq '.data'\n\nscripts/crawlora.sh /googleplay/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /googleplay/reviews app_id=\"notion.id\" | jq '.'\n```\n\nRaw `curl` fallback:\n\n```sh\ncurl -fsS -H \"x-api-key: $CRAWLORA_API_KEY\" \\\n  \"https://api.crawlora.net/api/v1/appstore/search?term=notion\" | jq '.'\n```\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for every App Store and\nGoogle Play endpoint this skill uses (method, path, params, description).\n\n## Examples\n\n- **Review sentiment:** resolve the app id via search → `/appstore/reviews`\n  (paginate) → classify each review's sentiment and summarize top complaints/praise.\n- **Cross-store compare:** pull `/appstore/app` and `/googleplay/app` for the same\n  product to compare ratings and review volume across platforms.\n- **Category ranking watch:** `/googleplay/list` for a category to track where an\n  app sits in the charts over time.\n\n## Notes & limits\n\n- **Credits / pay-on-success:** billed only on `2xx`; free tier 2,000 credits/mo.\n  Key at [https://crawlor\n\nArchive v1.0.11: 5 files, 8163 bytes\n\nFiles: reference/endpoints.md (13627b), scripts/crawlora.sh (3396b), skill-card.md (2295b), SKILL.md (3585b), _meta.json (137b)\n\nArchive v1.0.10: 5 files, 7457 bytes\n\nFiles: reference/endpoints.md (13627b), scripts/crawlora.sh (2005b), skill-card.md (1753b), SKILL.md (3559b), _meta.json (137b)","readmeExcerpt":"Skill: app-review-mining Owner: crawlora-org Summary: Mines App Store and Google Play data via the Crawlora API — app details, reviews, ratings, store rankings, and similar apps — as clean JSON. Use when the user wants mobile-app reviews, ratings, store charts/rankings, or competitive ASO (app store optimization) research without scraping store pages. Tags: latest:1.0.19 Version history: v1.0.19 | 2026-10-05T01:09:01","codeSnippets":[],"executableExamples":[{"language":"sh","snippet":"# Find an app, then pull its reviews (GET, key=value params):\nscripts/crawlora.sh /appstore/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /appstore/reviews id=1232780281 country=us | jq '.data'\n\nscripts/crawlora.sh /googleplay/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /googleplay/reviews app_id=\"notion.id\" | jq '.'"},{"language":"sh","snippet":"# Find an app, then pull its reviews (GET, key=value params):\nscripts/crawlora.sh /appstore/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /appstore/reviews id=1232780281 country=us | jq '.data'\n\nscripts/crawlora.sh /googleplay/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /googleplay/reviews app_id=\"notion.id\" | jq '.'"},{"language":"sh","snippet":"# Find an app, then pull its reviews (GET, key=value params):\nscripts/crawlora.sh /appstore/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /appstore/reviews id=1232780281 country=us | jq '.data'\n\nscripts/crawlora.sh /googleplay/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /googleplay/reviews app_id=\"notion.id\" | jq '.'"},{"language":"sh","snippet":"# Find an app, then pull its reviews (GET, key=value params):\nscripts/crawlora.sh /appstore/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /appstore/reviews id=1232780281 country=us | jq '.data'\n\nscripts/crawlora.sh /googleplay/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /googleplay/reviews app_id=\"notion.id\" | jq '.'"},{"language":"sh","snippet":"# Find an app, then pull its reviews (GET, key=value params):\nscripts/crawlora.sh /appstore/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /appstore/reviews id=1232780281 country=us | jq '.data'\n\nscripts/crawlora.sh /googleplay/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /googleplay/reviews app_id=\"notion.id\" | jq '.'"},{"language":"sh","snippet":"# Find an app, then pull its reviews (GET, key=value params):\nscripts/crawlora.sh /appstore/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /appstore/reviews id=1232780281 country=us | jq '.data'\n\nscripts/crawlora.sh /googleplay/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /googleplay/reviews app_id=\"notion.id\" | jq '.'"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: app-review-mining\ndescription: Mines App Store and Google Play data via the Crawlora API — app details, reviews, ratings, store rankings, and similar apps — as clean JSON. Use when the user wants mobile-app reviews, ratings, store charts/rankings, or competitive ASO (app store optimization) research without scraping store pages.\n---\n\n# App review mining & ASO\n\nPull App Store (iOS) and Google Play (Android) app details, reviews, ratings,\nrankings, and similar-app lists as normalized JSON from the Crawlora API.\n\n## When to use this skill\n\n- \"What are the reviews / ratings for <app>?\"\n- \"How is <app> ranked?\" / \"top apps in <category>.\"\n- \"Find apps similar to <app>\" / competitive ASO research.\n- \"Pull this app's details / privacy / version history.\"\n- Building an app-review sentiment or competitor-tracking pipeline.\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\nChoose the store (both have parallel endpoints), then the job:\n\n1. **Find the app** — `/appstore/search?term=...` or `/googleplay/search?q=...`\n   to resolve the app id / bundle id.\n2. **Details** — `/appstore/app`, `/googleplay/app` for metadata, rating summary,\n   description, and developer.\n3. **Reviews** — `/appstore/reviews`, `/googleplay/reviews` (paginate) for the\n   review text, score, and date to mine sentiment and themes.\n4. **Rankings** — `/appstore/list`, `/googleplay/list` for store charts by category.\n5. **Competitors** — `/appstore/similar`, `/googleplay/similar` for similar apps.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Find an app, then pull its reviews (GET, key=value params):\nscripts/crawlora.sh /appstore/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /appstore/reviews id=1232780281 country=us | jq '.data'\n\nscripts/crawlora.sh /googleplay/search term=\"notion\" | jq '.'\nscripts/crawlora.sh /googleplay/reviews app_id=\"notion.id\" | jq '.'\n```\n\nUse `scripts/crawlora.sh` for all requests; it keeps the API key out of command-line arguments.\n\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for every App Store and\nGoogle Play endpoint this skill uses (method, path, params, description).\n\n## Examples\n\n- **Review sentiment:** resolve the app id via search → `/appstore/reviews`\n  (paginate) → classify each review's sentiment and summarize top complaints/praise.\n- **Cross-store compare:** pull `/appstore/app` and `/googleplay/app` for the same\n  product to compare ratings and review volume across platforms.\n- **Category ranking watch:** `/googleplay/list` for a category to track where "},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"app-review-mining\",\n  \"version\": \"1.0.19\",\n  \"publishedAt\": 1791162541147\n}"},{"path":"reference/endpoints.md","content":"# app-review-mining — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**26 endpoints across 2 platform group(s).**\n\n## AppStore (15)\n\n### `appstore_app`\n\n- **HTTP:** `GET /appstore/app`\n- **What:** Retrieve full App Store app details. Returns normalized app metadata from the App Store lookup API. Provide either `id` (numeric track ID) or `app_id` (bundle ID). `id`/`app_id` can identify an iPhone, iPad, or Mac App Store listing.\n- **Params:** `app_id` (string, optional) — App Store bundle ID; `country` (string, optional) — Two-letter storefront country code; `id` (string, optional) — App Store numeric track ID (digits only); `lang` (string, optional) — Result language tag; `platforms` (boolean, optional) — Include the full device-platform compatibility list (adds one extra upstream fetch); `ratings` (boolean, optional) — Include ratings histogram\n\n### `appstore_categories`\n\n- **HTTP:** `GET /appstore/categories`\n- **What:** Retrieve App Store chart categories and collections. Returns every category ID and chart collection accepted by `/appstore/list`, including Games and Magazines & Newspapers subgenres with their parent ID. Collections carry their device platform (`phone`, `pad`, `mac`), chart type (`top_free`, `top_paid`, `top_grossing`, `top`, `new`), and whether the feed currently returns entries.\n- **Params:** _none_\n\n### `appstore_collection`\n\n- **HTTP:** `GET /appstore/collection`\n- **What:** Retrieve apps in one App Store collection. Returns app items embedded in an Apple room or EDS collection page. Discover IDs with `appstore_collections`. `platform` enum: `iphone`, `ipad`, `mac`, `vision`, `watch`, `tv`. `collection_id` must be a numeric room ID or `eds.UUID` ID returned by the discovery endpoint.\n- **Params:** `collection_id` (string, **required**) — Room ID or EDS UUID collection ID from appstore_collections; `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Result language tag; `platform` (string, **required**) — Apple device catalog\n\n### `appstore_collections`\n\n- **HTTP:** `GET /appstore/collections`\n- **What:** Discover App Store editorial collections. Returns the room and EDS collection links embedded in Apple's browse page for one device. `platform` enum: `iphone`, `ipad`, `mac`, `vision`, `watch`, `tv`. Pass a returned `id` and the same platform to `appstore_collection` to retrieve the collection's apps.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Result language tag; `platform` (string, **required**) — Apple devic"},{"path":"skill-card.md","content":"## Description:\n\nRetrieves App Store and Google Play app details, reviews, ratings, rankings, and similar apps through the Crawlora API for app-review and ASO research.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[crawlora-org](https://clawhub.ai/user/crawlora-org)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and app researchers use this skill to compare mobile-app ratings, analyze public reviews, monitor store rankings, and discover competing apps.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: App lookup parameters and the API key are sent to Crawlora.\n\nMitigation: Use the skill only when that transfer is acceptable; keep CRAWLORA_API_KEY out of logs, commits, and shared shell history.\n\nRisk: Implicit locale selection can make review and ranking comparisons misleading.\n\nMitigation: Pass country and language explicitly when locale matters, and account for paginated reviews.\n\n## Reference(s):\n\n- [App Store and Google Play endpoint reference](reference/endpoints.md)\n- [Crawlora](https://crawlora.net)\n- [ClawHub skill release](https://clawhub.ai/crawlora-org/skills/app-review-mining)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Analysis]\n\n**Output Format:** [JSON data or Markdown summaries]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Results depend on the selected store, locale, and review pagination.]\n\n## Skill Version(s):\n\n1.0.19 (source: server-resolved release)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1496,"uniquenessScore":41,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T10:19:15.958Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T10:19:15.958Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T14:14:07.409Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}