GET /v1/aso/competitor/:appId/:competitorId
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| appId | string | Yes | Your app’s Apple App ID |
| competitorId | string | Yes | Competitor’s Apple App ID |
Query Parameters
| Name | Type | Default | Description |
|---|---|---|---|
| country | string | us | ISO country code (e.g. us, gb, de) |
Code Examples
curl -X GET "https://api.appeeky.com/v1/aso/competitor/913335252/1157115554?country=us" \
-H "X-API-Key: YOUR_API_KEY"
const response = await fetch(
"https://api.appeeky.com/v1/aso/competitor/913335252/1157115554?country=us",
{
headers: { "X-API-Key": "YOUR_API_KEY" },
}
);
const { data } = await response.json();
console.log(`Your app: ${data.yourApp.title} (${data.yourApp.rating}★)`);
console.log(`Competitor: ${data.competitorApp.title} (${data.competitorApp.rating}★)`);
console.log(`Keyword overlap: ${data.keywordAnalysis.overlapPercent}%`);
console.log(`Gaps to target: ${data.keywordAnalysis.gaps}`);
console.log(`Verdict: ${data.verdict}`);
import requests
response = requests.get(
"https://api.appeeky.com/v1/aso/competitor/913335252/1157115554",
params={"country": "us"},
headers={"X-API-Key": "YOUR_API_KEY"},
)
data = response.json()["data"]
print(f"Your app: {data['yourApp']['title']} ({data['yourApp']['rating']}★)")
print(f"Competitor: {data['competitorApp']['title']} ({data['competitorApp']['rating']}★)")
print(f"Keyword overlap: {data['keywordAnalysis']['overlapPercent']}%")
print(f"\nTop keyword gaps:")
for gap in data["keywordAnalysis"]["topGaps"][:5]:
print(f" {gap['keyword']}: rank #{gap['competitorRank']}, volume {gap['volumeScore']}")
print(f"\nVerdict: {data['verdict']}")
Response
{
"data": {
"appId": "913335252",
"competitorId": "1157115554",
"country": "us",
"yourApp": {
"appId": "913335252",
"title": "Brilliant: Learn by doing",
"developer": "Brilliant.org",
"icon": "https://is1-ssl.mzstatic.com/.../512x512bb.jpg",
"rating": 4.74,
"reviews": 27315,
"category": "Education",
"titleLength": 25,
"descriptionLength": 1250,
"screenshotCount": 6,
"languageCount": 1,
"lastUpdated": "2026-01-26T12:19:36Z"
},
"competitorApp": {
"appId": "1157115554",
"title": "Khan Academy",
"developer": "Khan Academy",
"icon": "https://is1-ssl.mzstatic.com/.../512x512bb.jpg",
"rating": 4.8,
"reviews": 158000,
"category": "Education",
"titleLength": 12,
"descriptionLength": 2100,
"screenshotCount": 8,
"languageCount": 15,
"lastUpdated": "2026-02-10T08:00:00Z"
},
"comparison": {
"ratingDiff": -0.06,
"reviewsDiff": -130685,
"titleLengthDiff": 13,
"descriptionLengthDiff": -850,
"screenshotCountDiff": -2,
"languageCountDiff": -14
},
"keywordAnalysis": {
"shared": 5,
"yourUnique": 3,
"competitorUnique": 8,
"gaps": 2,
"overlapPercent": 31,
"topGaps": [
{ "keyword": "free courses", "competitorRank": 3, "volumeScore": 65 },
{ "keyword": "learn coding", "competitorRank": 5, "volumeScore": 58 },
{ "keyword": "khan academy", "competitorRank": 1, "volumeScore": 82 },
{ "keyword": "online learning", "competitorRank": 8, "volumeScore": 55 },
{ "keyword": "study app", "competitorRank": 12, "volumeScore": 48 }
]
},
"verdict": "Competitor leads in: more reviews, broader keyword coverage. Your strengths: niche keyword positions. Target their 8 unique keywords for quick wins."
}
}
App Profile Fields
Each app profile (yourApp and competitorApp) includes:
| Field | Type | Description |
|---|---|---|
| appId | string | Apple App ID |
| title | string | App name |
| developer | string | Developer name |
| icon | string | App icon URL |
| rating | number | Star rating (0-5) |
| reviews | number | Total review count |
| category | string | Primary category |
| titleLength | number | Title character count |
| descriptionLength | number | Description character count |
| screenshotCount | number | Number of screenshots |
| languageCount | number | Number of supported languages |
| lastUpdated | string | Last update date (ISO 8601) |
Comparison Fields
Difference values: positive = your app is higher, negative = competitor is higher.| Field | Type | Description |
|---|---|---|
| ratingDiff | number | Rating difference (yourRating - competitorRating) |
| reviewsDiff | number | Review count difference |
| titleLengthDiff | number | Title length difference (chars) |
| descriptionLengthDiff | number | Description length difference (chars) |
| screenshotCountDiff | number | Screenshot count difference |
| languageCountDiff | number | Language count difference |
Keyword Analysis Fields
| Field | Type | Description |
|---|---|---|
| shared | number | Keywords both apps rank for |
| yourUnique | number | Keywords only your app ranks for |
| competitorUnique | number | Keywords only the competitor ranks for |
| gaps | number | Keywords where competitor outranks you |
| overlapPercent | number | Percentage of keywords shared (0-100) |
| topGaps | array | Top 10 competitor-unique keywords sorted by volume |
Top Gap Entry
| Field | Type | Description |
|---|---|---|
| keyword | string | The keyword the competitor ranks for |
| competitorRank | number | Competitor’s rank position |
| volumeScore | number | Search volume score (0-100) |
How to use this report:
- Close keyword gaps — Target
topGapskeywords with high volume in your next metadata update - Fix weak areas — If
screenshotCountDifforlanguageCountDiffis negative, improve visuals or add localizations - Leverage strengths — If your
ratingDiffis positive, mention it in marketing. IfyourUniquekeywords are high-value, protect those positions - Read the verdict — The automated summary highlights the most important competitive dynamics
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 | One or both apps not found |

