# App Store Apps: Search, Details and Top Charts (`pistachio_implementation/app-store-apps`) Actor

Search the Apple App Store by keyword, look up apps by id or bundle id, or pull the top free, paid and grossing charts by country and genre. Returns ratings, rating counts, price, version, release dates, size, genres and developer for every app, through Apple's public APIs.

- **URL**: https://apify.com/pistachio\_implementation/app-store-apps.md
- **Developed by:** [Hay Equipos](https://apify.com/pistachio_implementation) (community)
- **Categories:** Marketing, Developer tools, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 app row saveds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## App Store Apps: Search, Details and Top Charts

Get clean data on any iPhone, iPad or Mac app in the Apple App Store. Search by keyword and see which apps rank for it, look up apps by id, App Store link or bundle id, or pull Apple's top free, paid and grossing charts for any country and genre. Every row has the app name, developer, rating, number of ratings, price, version, last update date, size, genres, languages, content rating, icon, screenshots and App Store link.

The actor reads Apple's own public iTunes Search and Lookup API and Apple's public top charts feeds. No login, no API key, no browser, no proxies, so runs are fast, cheap and steady.

### What you can use it for

- **App store optimization (ASO):** see which apps rank for your keywords, in order, and track your position over time.
- **Competitor tracking:** watch rating, rating count, version and release notes of a list of competitor apps every day or week.
- **Market research:** pull the top grossing Finance or Games apps in the US, UK, Germany or Japan and compare them.
- **Lead lists for app agencies:** find developers in a genre with their seller name and website.
- **AI agents:** one clear job with simple inputs, so an agent can answer "what are the top paid productivity apps in Canada right now?"

### Input

| Field | What it does | Default |
|---|---|---|
| Search terms | Keywords to search, one per line. Results keep Apple's order, so `position` is the search rank | none |
| App ids, App Store URLs or bundle ids | Apps to look up directly: `389801252`, `https://apps.apple.com/us/app/instagram/id389801252` or `com.burbn.instagram` | none |
| Top charts | Top free, paid or grossing for iPhone, iPad or Mac | none |
| Chart genre id | Narrow the charts to one genre, for example `6000` Business, `6014` Games, `6015` Finance | all apps |
| Country | Two letter App Store country code | `us` |
| Results per search term | Up to 200 | 50 |
| Apps per chart | Up to 100 | 100 |
| Include description and release notes | Turn off for smaller rows | on |
| Maximum app rows | Stop after this many rows in total | 1,000 |

You can combine searches, lookups and charts in one run.

Example input:

```json
{
  "searchTerms": ["habit tracker", "budget app"],
  "appIds": ["com.spotify.client", "https://apps.apple.com/us/app/notion/id1232780281"],
  "charts": ["top-grossing-iphone"],
  "chartGenreId": "6015",
  "country": "us",
  "maxResultsPerSearch": 25
}
```

### Output

One row per app. Download as JSON, CSV, Excel or HTML, or read it through the API.

```json
{
  "source": "search",
  "query": "habit tracker",
  "rank": null,
  "position": 1,
  "country": "us",
  "appId": 1438388363,
  "bundleId": "com.davetech.habit",
  "name": "Habit Tracker",
  "developer": "InnerGrow",
  "developerId": 1828382777,
  "developerUrl": "https://apps.apple.com/us/developer/innergrow/id1828382777",
  "sellerName": "Inner Grow Limited",
  "price": 0,
  "currency": "USD",
  "formattedPrice": "Free",
  "rating": 4.79206,
  "ratingCount": 147284,
  "contentRating": "4+",
  "primaryGenre": "Productivity",
  "genres": ["Productivity", "Health & Fitness"],
  "version": "2.14.23",
  "releaseDate": "2019-01-31T09:10:14Z",
  "currentVersionReleaseDate": "2026-08-15T15:18:18Z",
  "fileSizeBytes": 339836928,
  "minimumOsVersion": "15.0",
  "languages": ["EN", "FR", "DE", "IT", "JA", "PT", "RU", "ZH", "ES"],
  "iconUrl": "https://is1-ssl.mzstatic.com/image/thumb/.../512x512bb.jpg",
  "appStoreUrl": "https://apps.apple.com/us/app/habit-tracker/id1438388363",
  "scrapedAt": "2026-09-27T08:02:11.000Z"
}
```

Chart rows have `source: "chart"`, the chart name in `query` and the chart position in `rank`. Lookup rows have `source: "lookup"`. Inputs that return nothing (an unknown id, a chart that is empty for a genre) are listed in `RUN_SUMMARY` in the run's key value store and cost nothing.

### Pricing

Pay per event, no subscription, no charge for platform usage on top.

| Event | Price |
|---|---|
| App row saved | $0.001 (one dollar per 1,000 apps) |

Examples: the top 100 grossing iPhone apps cost $0.10. Tracking 50 competitor apps every day for a month costs about $1.50. Set a maximum charge per run in Apify and the actor stops cleanly when it is reached. Errors and apps that are not found are never charged.

### Limits

- Apple publishes at most 100 apps per top chart and returns at most 200 apps per search term.
- Apple allows about 20 requests a minute from one address, so the actor spaces its calls about 3 seconds apart. A search or a batch of 100 looked up apps is one call; a chart is two. Large runs take minutes, not seconds.
- Search results follow Apple's search API, which is close to but not always identical to what the App Store app shows on a phone.
- Ratings are the country store's ratings, as Apple reports them. Reviews text is not included (use a reviews actor for that).
- Google Play is not covered.

### FAQ

**Do I need an Apple developer account or an API key?** No. The actor uses Apple's public search, lookup and charts endpoints that need no sign in.

**Which countries work?** Any App Store country with a two letter code, such as us, gb, ca, au, de, fr, es, it, br, mx, jp, kr, in.

**How do I find a genre id?** Common ones: 6000 Business, 6001 Weather, 6002 Utilities, 6003 Travel, 6004 Sports, 6005 Social Networking, 6007 Productivity, 6008 Photo and Video, 6011 Music, 6012 Lifestyle, 6013 Health and Fitness, 6014 Games, 6015 Finance, 6016 Entertainment, 6017 Education, 6018 Books, 6020 Medical, 6023 Food and Drink, 6024 Shopping.

**Can I track ranking changes over time?** Yes. Schedule the actor daily in Apify with the same input and compare `position` or `rank` across runs.

**Is this affiliated with Apple?** No. It is an independent tool that reads Apple's public App Store data.

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords to search the App Store for, one per line, for example "habit tracker" or "budget app". Results keep Apple's order, so the position column is the search rank.

## `appIds` (type: `array`):

Apps to look up directly. Accepts numeric ids (389801252), App Store links (https://apps.apple.com/us/app/instagram/id389801252) or bundle ids (com.burbn.instagram).

## `charts` (type: `array`):

Apple top charts to read, up to 100 apps each, with rank.

## `chartGenreId` (type: `string`):

Optional App Store genre id to narrow the charts, for example 6000 Business, 6014 Games, 6015 Finance, 6013 Health and Fitness, 6017 Education, 6007 Productivity, 6016 Entertainment, 6005 Social Networking. Empty means all apps.

## `country` (type: `string`):

Two letter App Store country code, for example us, gb, de, fr, jp, br.

## `maxResultsPerSearch` (type: `integer`):

How many apps to keep for each search term (Apple returns at most 200).

## `maxResultsPerChart` (type: `integer`):

How many ranked apps to keep for each chart (Apple publishes at most 100).

## `includeDescription` (type: `boolean`):

Turn off for smaller rows when you only need numbers.

## `maxItems` (type: `integer`):

Stop after saving this many rows in total.

## Actor input object example

```json
{
  "searchTerms": [
    "habit tracker"
  ],
  "country": "us",
  "maxResultsPerSearch": 50,
  "maxResultsPerChart": 100,
  "includeDescription": true,
  "maxItems": 1000
}
```

# Actor output Schema

## `results` (type: `string`):

All rows the run saved to the default dataset.

## `summary` (type: `string`):

The RUN\_SUMMARY record: counts and problems for the whole run.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchTerms": [
        "habit tracker"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("pistachio_implementation/app-store-apps").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "searchTerms": ["habit tracker"] }

# Run the Actor and wait for it to finish
run = client.actor("pistachio_implementation/app-store-apps").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "habit tracker"
  ]
}' |
apify call pistachio_implementation/app-store-apps --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,pistachio_implementation/app-store-apps"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/1ZydTkn1tFwSsAd6F/builds/BQwvS8Dqw2k4vSY1n/openapi.json
