FunnelHound / Guides / iTunes Search API
iTunes Search API: look up any app's App Store ID, ratings and metadata in one request
Short version: GET https://itunes.apple.com/lookup?id=6793297146&country=us returns the public listing of any App Store app as JSON: name, bundle ID, developer, price, rating and rating count, version, release notes, screenshot URLs, icon. No key, no login. Swap lookup?id= for search?term= to find apps by name, add &country= to pick the storefront, and stay under about twenty calls a minute.
Two endpoints
| Endpoint | Use it when | Key parameters |
|---|---|---|
| https://itunes.apple.com/search | You know a name or a keyword, not an ID | term (URL-encoded), country, entity=software, limit (up to 200), lang |
| https://itunes.apple.com/lookup | You have an App Store ID, a bundle ID or a developer ID | id (comma-separated list allowed), bundleId, country, entity |
- entity narrows the media type: software for iPhone apps, iPadSoftware, macSoftware, tvSoftware. Without it, a search for "notes" returns albums and podcasts too.
- country is the two-letter storefront code. It changes availability, price, currency, ratings and release notes. Omit it and you get the US store, which is how a European app ends up reported as "not found".
- id takes several values at once: lookup?id=6793297146,284882215 returns both apps in one call, which is the cheap way to track a list of competitors against the rate limit.
- lookup?id=<artistId>&entity=software lists every app from one developer.
The fields worth keeping
| Field | What it is | Why you want it |
|---|---|---|
| trackId | App Store ID, the ten digits after id in store links | Attribution SDKs, review prompts, every "enter your app ID" box |
| bundleId | Reverse-DNS identifier of the binary | Matching store data to your own builds and crash reports |
| trackName, sellerName, artistId | App name, developer name, developer ID | Competitor lists, developer portfolios |
| averageUserRating, userRatingCount | Star average and rating count for the storefront | Logged daily, this is a free rating-velocity tracker |
| averageUserRatingForCurrentVersion, userRatingCountForCurrentVersion | Same, since the latest release | Did the update land badly |
| version, currentVersionReleaseDate, releaseNotes | Latest version, when, and the What's New text | Release cadence of competitors, without opening the store |
| price, currency, formattedPrice | Upfront price in the storefront's currency | Pricing surveys; in-app prices are not included |
| primaryGenreName, genres | Category and secondary categories | Which category peers actually chose |
| screenshotUrls, ipadScreenshotUrls | Arrays of screenshot URLs | Competitor product page archives |
| artworkUrl512, artworkUrl100 | Icon URLs | Dashboards; edit the size segment in the URL for other sizes |
| minimumOsVersion, fileSizeBytes, supportedDevices, languageCodesISO2A | Requirements and localizations | Localization coverage of the field |
| trackViewUrl | Canonical store link | Links that survive name changes |
What the API does not return: download counts, revenue, keyword rankings, in-app purchase prices, or anything from App Store Connect. Those are private to the developer and come from the Analytics Reports API with a signed token.
Recipes
# Any app's ID and bundle ID from its name, German storefront
curl -s "https://itunes.apple.com/search?term=fahrtenbuch&country=de&entity=software&limit=5" \
| jq -r '.results[] | "\(.trackId)\t\(.bundleId)\t\(.trackName)"'
# One app by bundle ID, US storefront
curl -s "https://itunes.apple.com/lookup?bundleId=no.self.FunnelHound&country=us" \
| jq '.results[0] | {trackId, version, averageUserRating, userRatingCount}'
# Several competitors in one call
curl -s "https://itunes.apple.com/lookup?id=6793297146,284882215,310633997&country=us" \
| jq -r '.results[] | "\(.trackName)\t\(.userRatingCount)\t\(.version)"'
import requests, datetime
IDS = ["6793297146", "284882215"]
r = requests.get("https://itunes.apple.com/lookup",
params={"id": ",".join(IDS), "country": "us"}, timeout=20).json()
today = datetime.date.today().isoformat()
for app in r["results"]:
print(today, app["trackId"], app["trackName"], app["userRatingCount"], app["version"])
Run the Python version from a daily cron and append the lines to a file, and you have a rating-count and release-date history for any set of apps, which no console gives you for apps you do not own.
Limits and quirks
- About 20 calls per minute per IP. Apple's own figure, loosely enforced. Over it you get 403s for a while. Batch IDs with commas and cache results for a day; nothing in the response changes faster.
- Cached responses. Apple's CDN serves the same JSON for a period, so a price change or a new version can take hours to appear. Do not use the API to confirm a release went live; use App Store Connect.
- No browser guarantee. Call it from a server, a script or a native app. The old callback= parameter still returns JSONP for pages that must call it client-side.
- Term matching is fuzzy. search returns what the store's search would, roughly, which means brand-name searches work and generic ones return whatever ranks that day. Good for finding an app, bad as a ranking tracker.
- Unlisted and removed apps return an empty results array with resultCount: 0, the same as a wrong ID. Check the country before concluding an app is gone.
- Icon sizes. artworkUrl512 is the largest Apple hands you directly; the size segment at the end of the URL (512x512bb) can be edited to other sizes for most apps.
Where FunnelHound uses it
FunnelHound reads your private numbers through the App Store Connect API, but it fetches your apps' icons through this public lookup, asking your own storefront first and a handful of large ones after, one request per app, cached on the device. Public data for the picture, private data for the funnel. If you are hunting for your own app's ID rather than a competitor's, the App Store ID guide is shorter, and the identifiers overview sorts trackId from the other nine IDs Apple hands you.
Public for the icon, private for the funnel
FunnelHound signs the App Store Connect API on your iPhone for impressions, installs, deletions and proceeds, and uses the public lookup only for artwork. Every app on your account, one funnel each.
Get FunnelHoundData notes: endpoints, parameters and the approximate 20 calls per minute guidance per Apple's iTunes Search API documentation as of 2026. Field names and the example values (bundle ID no.self.FunnelHound, version 1.11.2, one rating at the time of writing) come from a live lookup of FunnelHound (6793297146) on 3 Nov 2026; Apple adds and renames fields without notice, so read the keys of your own first response. The second and third IDs in the examples are illustrative.