Get App Detail
curl --request GET \
--url https://scrapebadger.com/v1/app-store/apps/{app_id} \
--header 'X-API-Key: <x-api-key>'import requests
url = "https://scrapebadger.com/v1/app-store/apps/{app_id}"
headers = {"X-API-Key": "<x-api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<x-api-key>'}};
fetch('https://scrapebadger.com/v1/app-store/apps/{app_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://scrapebadger.com/v1/app-store/apps/{app_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <x-api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://scrapebadger.com/v1/app-store/apps/{app_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<x-api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://scrapebadger.com/v1/app-store/apps/{app_id}")
.header("X-API-Key", "<x-api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://scrapebadger.com/v1/app-store/apps/{app_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<x-api-key>'
response = http.request(request)
puts response.read_body{
"extras": {
"rating_histogram": {},
"has_in_app_purchases": true,
"in_app_purchases": [
{}
],
"iphone_screenshots": [
{}
],
"ipad_screenshots": [
{}
],
"whats_new": "<string>",
"whats_new_version": "<string>",
"description": "<string>",
"chart_position": 123,
"chart_category": "<string>",
"is_editors_choice": true,
"privacy_types": [
{}
],
"information": {}
}
}Endpoints
Get App Detail
Full App Store app detail by track id or bundle id, enriched with the star histogram, in-app-purchase list, full-resolution screenshots and App Privacy label.
GET
/
v1
/
app-store
/
apps
/
{app_id}
Get App Detail
curl --request GET \
--url https://scrapebadger.com/v1/app-store/apps/{app_id} \
--header 'X-API-Key: <x-api-key>'import requests
url = "https://scrapebadger.com/v1/app-store/apps/{app_id}"
headers = {"X-API-Key": "<x-api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<x-api-key>'}};
fetch('https://scrapebadger.com/v1/app-store/apps/{app_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://scrapebadger.com/v1/app-store/apps/{app_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <x-api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://scrapebadger.com/v1/app-store/apps/{app_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<x-api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://scrapebadger.com/v1/app-store/apps/{app_id}")
.header("X-API-Key", "<x-api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://scrapebadger.com/v1/app-store/apps/{app_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<x-api-key>'
response = http.request(request)
puts response.read_body{
"extras": {
"rating_histogram": {},
"has_in_app_purchases": true,
"in_app_purchases": [
{}
],
"iphone_screenshots": [
{}
],
"ipad_screenshots": [
{}
],
"whats_new": "<string>",
"whats_new_version": "<string>",
"description": "<string>",
"chart_position": 123,
"chart_category": "<string>",
"is_editors_choice": true,
"privacy_types": [
{}
],
"information": {}
}
}Full detail for one app. Merges two sources: Apple’s iTunes lookup (the core
fields, always present) and the storefront product page (
extras, best-effort —
a storefront failure degrades the response rather than failing it).
Credits: 5
Authorization
string
required
Your ScrapeBadger API key.
Path Parameters
string
required
Numeric track id (e.g.
310633997) or bundle id (e.g. com.whatsapp).
A value containing a dot is treated as a bundle id.Query Parameters
string
default:"us"
Storefront code, lowercase ISO 3166-1 alpha-2 — sets pricing, availability
and the localised copy.
string
Result language, e.g.
en_us. Defaults to the storefront’s.boolean
default:"true"
Fetch the storefront page for the rating histogram, in-app-purchase list,
full-resolution screenshots and App Privacy detail. Set
false to skip that
second fetch when only the core iTunes fields are needed.Response
Every field from search, plus:AppExtras
Storefront enrichment.
null when include_extras=false or when the
storefront fetch failed.Show AppExtras
Show AppExtras
RatingHistogram
average, total, one_star … five_star. Apple’s storefront total
can differ slightly from rating_count — the two are computed on
different schedules, and both are surfaced rather than reconciled.boolean
InAppPurchase[]
name, price — the localised display price; Apple exposes no
numeric/currency split on the page.Screenshot[]
url, width, height at native resolution.Screenshot[]
string
string
string
The storefront’s copy of the description.
integer
string
boolean
PrivacyType[]
App Privacy “nutrition label” groups —
identifier, title, detail, categories[].object
The page’s raw Information rows (Seller, Size, Category, Compatibility,
Languages, Age Rating, Copyright …) as a flat string map — Apple adds and
renames rows per app type, so nothing is dropped.
Example
curl "https://scrapebadger.com/v1/app-store/apps/310633997?country=us" \
-H "X-API-Key: YOUR_API_KEY"
const res = await fetch(
"https://scrapebadger.com/v1/app-store/apps/com.whatsapp?country=us",
{ headers: { "X-API-Key": process.env.SCRAPEBADGER_API_KEY } },
);
const app = await res.json();
import requests
res = requests.get(
"https://scrapebadger.com/v1/app-store/apps/310633997",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"country": "us", "include_extras": "true"},
)
app = res.json()
Response
{
"app_id": 310633997,
"bundle_id": "net.whatsapp.WhatsApp",
"name": "WhatsApp Messenger",
"kind": "software",
"url": "https://apps.apple.com/us/app/whatsapp-messenger/id310633997",
"developer_id": 310634000,
"developer_name": "WhatsApp Inc.",
"seller_name": "WhatsApp Inc.",
"price": 0.0,
"currency": "USD",
"formatted_price": "Free",
"rating": 4.7,
"rating_count": 15216441,
"rating_current_version": 4.7,
"rating_count_current_version": 21883,
"description": "WhatsApp from Meta is a FREE messaging and video calling app...",
"release_notes": "Bug fixes and performance improvements.",
"version": "26.16.72",
"minimum_os_version": "15.1",
"file_size_bytes": 246718464,
"content_rating": "12+",
"advisories": ["Infrequent/Mild Profanity or Crude Humor"],
"genres": ["Social Networking", "Utilities"],
"genre_ids": [6005, 6002],
"primary_genre": "Social Networking",
"primary_genre_id": 6005,
"language_codes": ["EN", "DE", "ES", "FR", "PT"],
"icon_url": "https://is1-ssl.mzstatic.com/image/thumb/example/512x512bb.jpg",
"screenshot_urls": ["https://is1-ssl.mzstatic.com/image/thumb/shot1/392x696bb.png"],
"release_date_utc": 1241740800.0,
"release_date_at": "2009-05-08T00:00:00Z",
"current_version_release_date_utc": 1754870400.0,
"current_version_release_date_at": "2026-08-11T00:00:00Z",
"extras": {
"rating_histogram": {
"average": 4.7,
"total": 15216441,
"one_star": 486926,
"two_star": 152164,
"three_star": 304328,
"four_star": 1673808,
"five_star": 12599215
},
"has_in_app_purchases": false,
"in_app_purchases": [],
"iphone_screenshots": [
{ "url": "https://is1-ssl.mzstatic.com/image/thumb/shot1/1290x2796bb.png", "width": 1290, "height": 2796 }
],
"ipad_screenshots": [],
"whats_new": "Bug fixes and performance improvements.",
"whats_new_version": "26.16.72",
"chart_position": 4,
"chart_category": "Social Networking",
"is_editors_choice": false,
"privacy_types": [
{
"identifier": "DATA_LINKED_TO_YOU",
"title": "Data Linked to You",
"detail": "The following data, which may be collected and linked to your identity, may be used for the following purposes:",
"categories": ["Contact Info", "User Content", "Identifiers", "Usage Data", "Diagnostics"]
}
],
"information": {
"Seller": "WhatsApp Inc.",
"Size": "235.3 MB",
"Category": "Social Networking",
"Compatibility": "iPhone — Requires iOS 15.1 or later.",
"Languages": "English and 59 more",
"Age Rating": "12+",
"Copyright": "© 2026 WhatsApp LLC"
}
}
}
A numeric id runs both fetches concurrently, so enrichment usually costs
no extra latency. A bundle id costs one extra round trip: the storefront
page is addressable by numeric id only, so the lookup has to resolve first.
Errors
| Status | Meaning |
|---|---|
400 | Malformed country code. |
404 | No such app in that storefront (Apple answers 200 with an empty result; the absence is detected so you are not billed for an empty success). |
429 | Apple is throttling — retry shortly. |
502 | Unexpected upstream failure — not billed. |
⌘I

