Search Apps
curl --request GET \
--url https://scrapebadger.com/v1/app-store/search \
--header 'X-API-Key: <x-api-key>'import requests
url = "https://scrapebadger.com/v1/app-store/search"
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/search', 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/search",
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/search"
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/search")
.header("X-API-Key", "<x-api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://scrapebadger.com/v1/app-store/search")
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{
"query": "<string>",
"country": "<string>",
"entity": "<string>",
"result_count": 123,
"apps": [
{
"app_id": 123,
"bundle_id": "<string>",
"name": "<string>",
"url": "<string>",
"developer_id": 123,
"developer_name": "<string>",
"price": 123,
"currency": "<string>",
"formatted_price": "<string>",
"rating": 123,
"rating_count": 123,
"version": "<string>",
"minimum_os_version": "<string>",
"file_size_bytes": 123,
"genres": [
"<string>"
],
"genre_ids": [
123
],
"content_rating": "<string>",
"icon_url": "<string>",
"screenshot_urls": [
"<string>"
],
"release_date_at": "<string>",
"current_version_release_date_at": "<string>"
}
]
}Endpoints
Search Apps
Full-text search across the App Store — every hit carries the complete iTunes record, not a thin card.
GET
/
v1
/
app-store
/
search
Search Apps
curl --request GET \
--url https://scrapebadger.com/v1/app-store/search \
--header 'X-API-Key: <x-api-key>'import requests
url = "https://scrapebadger.com/v1/app-store/search"
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/search', 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/search",
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/search"
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/search")
.header("X-API-Key", "<x-api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://scrapebadger.com/v1/app-store/search")
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{
"query": "<string>",
"country": "<string>",
"entity": "<string>",
"result_count": 123,
"apps": [
{
"app_id": 123,
"bundle_id": "<string>",
"name": "<string>",
"url": "<string>",
"developer_id": 123,
"developer_name": "<string>",
"price": 123,
"currency": "<string>",
"formatted_price": "<string>",
"rating": 123,
"rating_count": 123,
"version": "<string>",
"minimum_os_version": "<string>",
"file_size_bytes": 123,
"genres": [
"<string>"
],
"genre_ids": [
123
],
"content_rating": "<string>",
"icon_url": "<string>",
"screenshot_urls": [
"<string>"
],
"release_date_at": "<string>",
"current_version_release_date_at": "<string>"
}
]
}Full-text search across the App Store. Every hit carries the same ~40 fields the
detail endpoint returns, so a search result rarely needs a follow-up lookup.
Credits: 5
Authorization
string
required
Your ScrapeBadger API key.
Query Parameters
string
required
Search term, e.g.
slack.string
default:"software"
Which catalogue to search:
software (iPhone), iPadSoftware or
macSoftware. These are separate catalogues, not filters — a Mac-only app
is absent from software entirely.integer
default:"50"
Results to return,
1–200.integer
default:"0"
Results to skip,
0–199. Applied by this service, not by Apple — the
Search API 403s its own offset parameter, so paging is a slice of one
200-result response and offset + limit is capped at 200.string
Result language, e.g.
en_us or de_de. Defaults to the storefront’s.Response
string
Echo of the requested term.
string
Storefront searched.
string
Catalogue searched.
integer
Apps returned in this page.
App[]
Matching apps, in Apple’s relevance order. Same shape as
app detail minus
extras.Show App (key fields)
Show App (key fields)
Example
curl "https://scrapebadger.com/v1/app-store/search?query=slack&country=us&limit=25" \
-H "X-API-Key: YOUR_API_KEY"
const res = await fetch(
"https://scrapebadger.com/v1/app-store/search?" +
new URLSearchParams({ query: "slack", country: "us", limit: "25" }),
{ headers: { "X-API-Key": process.env.SCRAPEBADGER_API_KEY } },
);
const { apps } = await res.json();
import requests
res = requests.get(
"https://scrapebadger.com/v1/app-store/search",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"query": "slack", "country": "us", "limit": 25},
)
apps = res.json()["apps"]
Response
{
"query": "slack",
"country": "us",
"entity": "software",
"result_count": 25,
"apps": [
{
"app_id": 618783545,
"bundle_id": "com.tinyspeck.chatlyio",
"name": "Slack",
"kind": "software",
"url": "https://apps.apple.com/us/app/slack/id618783545",
"developer_id": 618783544,
"developer_name": "Slack Technologies, Inc.",
"developer_url": "https://apps.apple.com/us/developer/slack-technologies-inc/id618783544",
"seller_name": "Slack Technologies, Inc.",
"price": 0.0,
"currency": "USD",
"formatted_price": "Free",
"rating": 4.8,
"rating_count": 216114,
"rating_current_version": 4.8,
"rating_count_current_version": 3891,
"description": "Slack brings team communication and collaboration into one place...",
"release_notes": "We fixed a handful of bugs to keep things running smoothly.",
"version": "26.08.10",
"minimum_os_version": "16.0",
"file_size_bytes": 194837504,
"content_rating": "4+",
"advisories": [],
"genres": ["Business", "Productivity"],
"genre_ids": [6000, 6007],
"primary_genre": "Business",
"primary_genre_id": 6000,
"language_codes": ["EN", "DE", "FR", "JA"],
"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": 1367280000.0,
"release_date_at": "2013-04-30T00:00:00Z",
"current_version_release_date_utc": 1754870400.0,
"current_version_release_date_at": "2026-08-11T00:00:00Z",
"extras": null
}
]
}
Apple caps this catalogue at 200 results per query and offers no deep
paging.
offset + limit above 200 returns fewer results rather than an error.⌘I

