# App Store Developer Leads - iOS Developers, Emails & Sites (`tiger19935/app-store-developer-leads`) Actor

Find iOS app developers by keyword, genre or top charts: apps, ratings, update activity, website, emails and social links published on their own site, plus a lead score. One row per developer. Pay only per developer.

- **URL**: https://apify.com/tiger19935/app-store-developer-leads.md
- **Developed by:** [Andrew Boiko](https://apify.com/tiger19935) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.40 / 1,000 developer leads

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Developer Leads - iOS Developers, Websites & Public Emails

Find the companies and indie developers behind iOS apps. Search the App Store by keyword or genre, or read Apple's top charts, and get **one row per developer**: their apps, ratings, update activity, website and - when published on the developer's own site - emails and social links, plus a transparent lead score.

Built on Apple's public iTunes Search API and Apple's marketing RSS charts. It covers the **Apple App Store only** (no Google Play) and does not guess email addresses.

### Who is it for

- **Agencies and freelancers** selling app marketing, ASO, design, development or QA to teams that already ship an iOS product.
- **SaaS and SDK vendors** (analytics, payments, subscriptions, push, crash reporting) building prospect lists of active app makers.
- **Investors and market researchers** mapping who is building in a niche (for example habit trackers or invoicing) and how much traction they have.
- **Recruiters** looking for small studios and mobile teams in a niche.

### What you get

For every developer (grouped by Apple's developer id):

- Developer name, App Store developer page, website (the seller URL the developer lists)
- Number of apps found, top 5 apps with rating, rating count, price, version and last update
- Genres, average rating (weighted by rating count), total ratings, first and last release dates
- Storefront countries and search terms where they were found
- Emails found on their own website (MX-checked), social links (LinkedIn, X/Twitter, Facebook, Instagram, YouTube, GitHub, TikTok), support and privacy URLs when Apple provides them
- A lead score from 0 to 100 with its components

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` (keywords/genres) or `top-charts` (Apple top 100) |
| `searchTerms` | array | empty | Keywords to search, e.g. `fitness`, `invoice`. Required in search mode unless genres are given |
| `genres` | array | empty | Genre names or ids (`Health & Fitness`, `6013`, `Games`...) used as a filter |
| `countries` | array | `["us"]` | 2-letter storefront codes. Terms are searched in each country |
| `chartType` | string | `top-free` | `top-free` or `top-paid` in top-charts mode |
| `maxDevelopers` | integer | 50 | 1-1000. Highest lead scores are kept |
| `minRatingCount` | integer | 0 | Minimum total ratings across the developer's apps |
| `appsUpdatedWithinDays` | integer | 0 | Ignore apps not updated in the last N days (0 = off) |
| `findEmails` | boolean | true | Read the developer's own website for emails and social links |
| `includeFailed` | boolean | false | Add free `type: "error"` rows for failed Apple requests |

Example:

```json
{
  "mode": "search",
  "searchTerms": ["habit tracker", "meditation"],
  "genres": ["Health & Fitness"],
  "countries": ["us", "gb"],
  "maxDevelopers": 100,
  "minRatingCount": 1000,
  "appsUpdatedWithinDays": 180,
  "findEmails": true
}
```

### Output example

```json
{
  "type": "developer",
  "id": "appstore-dev:1001",
  "developerId": "1001",
  "developerName": "Zen Apps Ltd",
  "developerUrl": "https://apps.apple.com/us/developer/zen-apps-ltd/id1001",
  "website": "https://zenapps.example/",
  "websiteStatus": "ok",
  "appCount": 3,
  "topApps": [
    { "name": "Zen Timer", "id": "111", "url": "https://apps.apple.com/us/app/zen-timer/id111", "genre": "Health & Fitness", "rating": 4.8, "ratingCount": 25000, "price": 0, "currency": "USD", "version": "3.2.1", "lastUpdate": "2026-10-09T10:00:00.000Z" }
  ],
  "genres": ["Health & Fitness", "Lifestyle"],
  "primaryGenre": "Health & Fitness",
  "avgRating": 4.77,
  "totalRatingCount": 29500,
  "lastReleaseDate": "2026-10-09T10:00:00.000Z",
  "firstReleaseDate": "2019-03-01T08:00:00.000Z",
  "foundInCountries": ["us"],
  "matchedTerms": ["meditation"],
  "primaryEmail": "hello@zenapps.example",
  "emails": ["hello@zenapps.example", "support@zenapps.example"],
  "emailStatus": "verified_mx",
  "emailSource": "developer-website",
  "linkedin": "https://www.linkedin.com/company/zen-apps",
  "twitter": "https://twitter.com/zenapps",
  "facebook": null, "instagram": null, "youtube": null, "github": null, "tiktok": null,
  "supportUrl": null, "privacyUrl": null,
  "leadScore": 95,
  "leadScoreParts": { "traction": 36, "rating": 10, "activity": 30, "breadth": 9, "reachability": 10 },
  "attribution": "App data: Apple iTunes Search API / Apple Marketing Tools RSS. Emails and social links: developer's own public website. Not affiliated with Apple.",
  "source": "apple-app-store",
  "scrapedAt": "2026-10-14T09:00:00.000Z"
}
```

`emailStatus` is `verified_mx` (the email's domain has mail servers), `unverified` (domain did not resolve to mail servers or the lookup failed) or `none`. `websiteStatus` is one of `ok`, `no_website`, `unreachable`, `blocked_by_robots`, `social_or_store_page`, `blocked_host`, `invalid_url`, `not_checked`.

A run also stores `OUTPUT` (counts, per-query status, skipped reasons, charged events, `stoppedReason`) and `RESULTS_MD` in the key-value store.

### Lead score

The score is a plain formula, so you can recompute it or weigh it differently:

| Component | Max | Rule |
|---|---|---|
| traction | 40 | 8 x log10(1 + total ratings), capped (10,000 ratings = 32) |
| rating | 10 | average rating / 5 x 10 |
| activity | 30 | latest release within 30 days 30, 90 days 22, 180 days 14, 365 days 6, older 0 |
| breadth | 10 | 3 points per app found |
| reachability | 10 | 5 for a listed website, 5 more when an email was found |

It describes how established and active a developer looks. It is not a prediction that they will buy anything.

### Pricing

**Pay only for developers delivered: $0.003 per developer** ($3 per 1,000) (`developer` event), so 100 developers cost $0.30 before any Apify plan discount. Emails and social links are included at no extra charge. You are never charged for failed requests, empty results, developers filtered out or rows beyond your "maximum cost per run" - the run stops softly when the budget is reached and keeps what it has. Free-plan users can try it with their free monthly credits; the default 5-developer test run costs about one and a half cents. Platform usage (compute) is included in the price.

### How it works

1. **Search mode**: every term x country is searched with the iTunes Search API (up to 200 apps per search). **Top-charts mode**: Apple's top-100 RSS chart is read per country and the apps are looked up through the iTunes Lookup API to get ratings and websites.
2. Apps are merged across queries, filtered (genre, update recency), grouped by developer id and ranked by lead score; the best `maxDevelopers` are kept.
3. With `findEmails`, each developer's own website is fetched: homepage plus up to two contact/support/about pages, checking `robots.txt` first, with timeouts and a clear User-Agent. Emails written as `name [at] domain` are recognised; their domains get an MX lookup.
4. Each delivered developer is charged once. Progress is saved so that a migrated or restarted run does not re-charge developers it already delivered.

### Limits and honest caveats

- **Apple App Store only.** Google Play is not covered.
- Emails are returned only when the developer publishes them on the website listed in the App Store. Many developers list no website, a social page, or a site with only a contact form, so expect a share of rows without emails. Email addresses are never guessed or invented.
- `verified_mx` means the domain can receive mail; it does not prove the mailbox exists.
- Apple's search API returns at most 200 apps per query and throttles heavy use (roughly 20 requests per minute); the actor spaces requests and waits when Apple answers with a throttle error, so large keyword x country combinations take minutes.
- Search results are Apple's relevance ranking for the term, not a complete census of a category. Use several related terms and countries for broader coverage.
- Ratings and rating counts are per storefront and can differ by country; `totalRatingCount` adds each app's highest count seen across the storefronts searched.
- Developer grouping uses Apple's developer id. Studios publishing under several developer accounts appear as several rows.

### Legal and ethical notes

App data comes from Apple's public APIs and feeds; use is subject to Apple's terms for those services, and this actor is not affiliated with Apple. Emails and social links are read only from the developer's own public website, respecting `robots.txt`. A business email on a company site is personal data under GDPR when it identifies a person: have a lawful basis, identify yourself, offer an easy opt-out, and follow the e-mail marketing rules (PECR, CAN-SPAM, ePrivacy) of the recipient's country. Do not use the data for spam. You are responsible for your use of the results.

### FAQ

**Is this a Google Play scraper?** No, Apple App Store only.

**Why is `primaryEmail` empty for some developers?** The developer lists no website, the site is a social page or app-store page, robots.txt forbids fetching, the site is down, or no email is published. See `websiteStatus`.

**Will it find the personal email of the founder?** Only if it is published on the developer's own site. The actor does not guess addresses or scrape LinkedIn.

**How many developers can I get?** Each search term returns up to 200 apps, which typically means 60-150 distinct developers. Add related terms and more countries for more.

**What is the difference between search and top-charts?** Search finds apps matching your keywords. Top charts lists the 100 most downloaded free or paid apps of a country, so it favours big publishers.

**Can I get only active developers?** Set `appsUpdatedWithinDays` (for example 180) and `minRatingCount`.

**Does it charge for developers I already got in the same run?** No. Each developer is charged once, and a restarted run skips developers it already delivered.

### Use via API

Replace `YOUR_TOKEN` with your Apify API token.

```bash
curl -X POST "https://api.apify.com/v2/acts/tiger19935~app-store-developer-leads/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms":["meditation"],"countries":["us"],"maxDevelopers":5,"findEmails":true}'
```

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('tiger19935/app-store-developer-leads').call({
    searchTerms: ['invoice', 'expense tracker'], countries: ['us', 'gb'], maxDevelopers: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((d) => d.primaryEmail).length, 'developers with an email');
```

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("tiger19935/app-store-developer-leads").call(
    run_input={"mode": "top-charts", "countries": ["us"], "chartType": "top-free", "findEmails": False}
)
for dev in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(dev["developerName"], dev["leadScore"], dev["website"])
```

### Integrations

Start the actor from Make, n8n or Zapier on a schedule, then send developers with a `primaryEmail` to your CRM (HubSpot, Pipedrive, Airtable) or to a Google Sheet through the Apify Google Sheets integration. You can also download the dataset as CSV or Excel. A typical flow: weekly run with `appsUpdatedWithinDays: 90`, filter `leadScore >= 60`, push new developer ids into your CRM.

### More tools by the same author

- [Website Contact Extractor](https://apify.com/tiger19935/website-contact-extractor): Emails, phones and social links from any list of websites
- [B2B Email Verifier](https://apify.com/tiger19935/b2b-email-verifier): Verify business emails and guess address patterns
- [Decision-Maker Contacts](https://apify.com/tiger19935/decision-maker-contacts): Founders, CEOs and department heads from company websites
- [Domain to Company Enrichment](https://apify.com/tiger19935/domain-company-enrichment): Turn domains into company profiles

# Actor input Schema

## `mode` (type: `string`):

'search' looks up apps for your search terms / genres through the iTunes Search API. 'top-charts' reads Apple's top 100 chart for each country and then looks up those apps.

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

Keywords used as App Store searches, one per row, e.g. fitness, meditation, invoice, crypto wallet. Each term is searched in each country and returns up to 200 apps. Required in 'search' mode unless you pick genres. Ignored in 'top-charts' mode.

## `genres` (type: `array`):

Keep only apps in these App Store genres: names such as Health & Fitness, Productivity, Games, Finance, Education or numeric ids such as 6013. If you give genres but no search terms, the genre names are used as search terms.

## `countries` (type: `array`):

Two-letter storefront codes, e.g. us, gb, de, fr, ua, br, jp. Every term is searched in every country, which multiplies the number of requests (Apple allows roughly 20 searches per minute, so big combinations take minutes).

## `chartType` (type: `string`):

Which Apple chart to read in 'top-charts' mode.

## `maxDevelopers` (type: `integer`):

Maximum number of developers to deliver (and pay for), 1-1000. When more developers match, the highest lead scores are kept. The run also stops softly when your maximum cost per run is reached.

## `minRatingCount` (type: `integer`):

Keep only developers whose apps together have at least this many ratings in the storefront(s) searched. A quick proxy for traction. 0 = no minimum.

## `appsUpdatedWithinDays` (type: `integer`):

Ignore apps whose current version was released more than N days ago (finds actively maintained products). Developers with no remaining app are dropped, and appCount only counts the remaining apps. 0 = no recency filter.

## `findEmails` (type: `boolean`):

Visit each developer's own website (the seller URL listed in the App Store): the homepage plus up to 2 contact/support/about pages, obeying robots.txt. Extracts published emails (MX-checked) and LinkedIn/X/Facebook/Instagram/YouTube/GitHub/TikTok links. No emails are guessed. Slower, but no extra charge.

## `includeFailed` (type: `boolean`):

Push one extra row (type 'error', never charged) for every Apple request that failed. The run summary in the OUTPUT record always lists the status of every query.

## Actor input object example

```json
{
  "mode": "search",
  "searchTerms": [
    "meditation"
  ],
  "genres": [],
  "countries": [
    "us"
  ],
  "chartType": "top-free",
  "maxDevelopers": 5,
  "minRatingCount": 0,
  "appsUpdatedWithinDays": 0,
  "findEmails": true,
  "includeFailed": false
}
```

# Actor output Schema

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

All result rows.

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

Counts, charged events and warnings.

# 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": [
        "meditation"
    ],
    "countries": [
        "us"
    ],
    "maxDevelopers": 5,
    "findEmails": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("tiger19935/app-store-developer-leads").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": ["meditation"],
    "countries": ["us"],
    "maxDevelopers": 5,
    "findEmails": True,
}

# Run the Actor and wait for it to finish
run = client.actor("tiger19935/app-store-developer-leads").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": [
    "meditation"
  ],
  "countries": [
    "us"
  ],
  "maxDevelopers": 5,
  "findEmails": true
}' |
apify call tiger19935/app-store-developer-leads --silent --output-dataset

```

## MCP server setup

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

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/UKaC5OtHyoWsuKakS/builds/a2Ri2fX7Mb9Nz4IMf/openapi.json
