GET /v1/aso/opportunities/:appId
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| appId | string | Yes | App ID — numeric for Apple (913335252), package name for Google (com.spotify.music) |
Query Parameters
| Name | Type | Default | Description |
|---|---|---|---|
| platform | string | apple | apple (default) or google for Google Play — see Platforms |
| country | string | us | ISO country code (e.g. us, gb, de) |
| lang | string | en | Google Play language code (used when platform=google) |
Code Examples
curl -X GET "https://api.appeeky.com/v1/aso/opportunities/913335252?country=us" \
-H "X-API-Key: YOUR_API_KEY"
const response = await fetch(
"https://api.appeeky.com/v1/aso/opportunities/913335252?country=us",
{
headers: { "X-API-Key": "YOUR_API_KEY" },
}
);
const { data } = await response.json();
console.log(`Found ${data.summary.totalOpportunities} opportunities`);
console.log(`High priority: ${data.summary.highPriority}`);
data.opportunities.slice(0, 5).forEach((opp) => {
console.log(` "${opp.keyword}" - Score: ${opp.opportunityScore}, Volume: ${opp.volumeScore}, Difficulty: ${opp.difficulty}`);
});
import requests
response = requests.get(
"https://api.appeeky.com/v1/aso/opportunities/913335252",
params={"country": "us"},
headers={"X-API-Key": "YOUR_API_KEY"},
)
data = response.json()["data"]
print(f"Total opportunities: {data['summary']['totalOpportunities']}")
print(f"High priority: {data['summary']['highPriority']}")
for opp in data["opportunities"][:5]:
print(f" {opp['keyword']}: score={opp['opportunityScore']}, "
f"volume={opp['volumeScore']}, difficulty={opp['difficulty']}, "
f"source={opp['source']}")
Response
{
"data": {
"appId": "913335252",
"country": "us",
"opportunities": [
{
"keyword": "math learning app",
"volumeScore": 58,
"difficulty": 32,
"opportunityScore": 65,
"currentRank": null,
"competitorRank": null,
"source": "suggestion"
},
{
"keyword": "physics simulator",
"volumeScore": 45,
"difficulty": 25,
"opportunityScore": 52,
"currentRank": null,
"competitorRank": null,
"source": "suggestion"
},
{
"keyword": "science quiz",
"volumeScore": 40,
"difficulty": 38,
"opportunityScore": 42,
"currentRank": 22,
"competitorRank": null,
"source": "improvable-rank"
}
],
"summary": {
"totalOpportunities": 18,
"highPriority": 4,
"mediumPriority": 8,
"lowPriority": 6
}
}
}
Opportunity Fields
| Field | Type | Description |
|---|---|---|
| keyword | string | The keyword opportunity |
| volumeScore | number | Search volume score (0-100) |
| difficulty | number | Ranking difficulty (0-100) |
| opportunityScore | number | Composite opportunity score (0-100, higher = better) |
| currentRank | number|null | App’s current rank for this keyword (null = not ranking) |
| competitorRank | number|null | Competitor’s rank if applicable |
| source | string | How the opportunity was found (see below) |
Source Values
| Source | Description |
|---|---|
suggestion | New keyword from Apple autocomplete suggestions — the app doesn’t rank for it yet |
improvable-rank | App already ranks but outside top 10 — has room to improve |
Summary Fields
| Field | Type | Description |
|---|---|---|
| totalOpportunities | number | Total number of opportunities found |
| highPriority | number | Opportunities with score >= 50 |
| mediumPriority | number | Opportunities with score 25-49 |
| lowPriority | number | Opportunities with score < 25 |
How opportunity score is calculated:
opportunityScore = volumeScore × easeScore × rankBoost- easeScore =
100 - difficulty(easier keywords score higher) - rankBoost = multiplier based on current rank:
- Not ranking (null): 0.5 (moderate upside)
- Rank 11-30: 1.0 (sweet spot — close to top 10)
- Rank 31+: 0.7 (ranking but far)
- Top 3: 0.2 (already optimized, low marginal gain)
Best workflow:
- Run ASO Audit to understand your baseline
- Use this endpoint to find opportunities
- Add target keywords to Metadata Suggestions to generate optimized metadata
- Validate the new metadata before submitting
- Track keywords to monitor ranking changes over time
Errors
| Status | Code | When |
|---|---|---|
| 400 | INVALID_APP_ID | Non-numeric or missing app ID |
| 401 | MISSING_API_KEY | No API key in the request |
| 404 | APP_NOT_FOUND | App not found or unavailable |

