| name | appstoreprice-hub |
| description | Skill for querying App Store prices across global regions, fetching data via appstoreprice.org. Uses Minis built-in browser (minis-browser-use CLI) to directly call the website's native signing functions in page context, no API Key needed, no need to implement signing algorithm. Supports: search apps by name, query prices for a single App across all regions, get cheapest region rankings, paginated app list browsing. Triggers when user mentions "App Store price", "cheapest region", "Turkey price", "appstoreprice", "app comparison", "App Store low-price region", "best subscription region", or any scenario requiring cross-region iOS/macOS App price comparison. |
appstoreprice-hub
Query App Store global price data from appstoreprice.org.
Data source: appstoreprice.org, unofficial comparison site maintained by @qingnianxiaozhe, real-time fetching and comparison of App Store prices across global regions. Not Apple official data, prices updated daily.
How It Works
Site uses Next.js App Router, accesses data via two methods:
- REST API (search/list): requires FNV-1a signature headers
X-Timestamp + X-Signature
- RSC page stream (price details):
fetch(url, { headers: { RSC: '1' } }) direct parsing
Signing function is embedded in page webpack module 52661, reused directly in website page context, no need to implement yourself.
Execution Method: minis-browser-use CLI
Always use minis-browser-use CLI + shell script, don't use browser_use tool call.
Benefit: JS code is read from file and passed directly to process, doesn't consume agent context.
Standard Template
minis-browser-use navigate --url "https://appstoreprice.org/zh/apps"
minis-browser-use wait_for_dom_stable --timeout 8
SCRIPT=$(cat /var/minis/skills/appstoreprice-hub/scripts/api.js; cat << 'LOGIC'
// --- Business Logic ---
const asp = AppStorePriceAPI();
const result = await asp.search('Notion');
return result.apps.map(a => ({ name: a.name, id: a.appStoreId }));
LOGIC
)
minis-browser-use execute_js --script "$SCRIPT"
cat api.js; cat << 'LOGIC' ... LOGIC is the standard concatenation approach, api.js content doesn't enter agent context.
API Reference
AppStorePriceAPI() returns { search, list, prices }:
| Method | Parameters | Returns |
|---|
search(query, page=1, limit=20) | Keyword | { apps, hasMore, total } |
list(page=1, limit=20) | Page/Limit | { apps, hasMore, total } |
prices(appStoreId, locale='zh') | App Store ID | Price array, sorted by priceUsd ascending |
prices returns each item: { region, regionName, currency, price, priceUsd, priceCny }
Common region codes: US United States, TR Turkey, NG Nigeria, PK Pakistan, EG Egypt, AR Argentina, VN Vietnam, JP Japan, KR South Korea, CN China, HK Hong Kong
Typical Business Logic
Cheapest Top N
const asp = AppStorePriceAPI();
const sr = await asp.search('ChatGPT');
const app = sr.apps[0];
const all = await asp.prices(app.appStoreId);
const topN = all.sort((a, b) => a.priceUsd - b.priceUsd).slice(0, 10);
const usPrice = all.find(p => p.region === 'US')?.priceUsd;
return { appName: app.name, topN: topN.map(p => ({
...p, saveVsUS: usPrice ? Math.round((1 - p.priceUsd / usPrice) * 100) + '%' : 'N/A'
}))};
Price by Region
const asp = AppStorePriceAPI();
const sr = await asp.search('Notion');
const all = await asp.prices(sr.apps[0].appStoreId);
return all.find(p => p.region === 'TR');
Result Display Specification
Display with Markdown table including: Region (flag emoji + name), Currency, Original Price, USD Equivalent, CNY Equivalent.
When comparing, mark discount vs US region: savings = (1 - priceUsd / usPrice) * 100.
Troubleshooting
Signing module not loaded: confirm navigated to /apps page and wait_for_dom_stable.
HTTP 403 signature failed: module ID may have changed with version update, run following command to re-locate:
minis-browser-use execute_js --script "
self.webpackChunk_N_E.forEach(([,m]) => { if (!m) return;
Object.keys(m).forEach(k => { try {
const e = {}; m[k]({exports:e},e,{d:(t,d)=>{}});
if (typeof e.Z5==='function') console.log('sig module:', k);
} catch(e){} }); });
return 'check console';
"
After finding new ID, update 52661 in scripts/api.js.