# App Developer Lead Scraper | $4/1K | Email & Site (`apivault_labs/app-developer-leads`) Actor

Find app-developer leads at scale from the App Store & Google Play. Pick a category or keyword and a store, and get every app's company name, website, contact email, rating, category and store link. Built for B2B outreach to app publishers. No login or API key. Bulk, parallel. $0.004 per lead.

- **URL**: https://apify.com/apivault\_labs/app-developer-leads.md
- **Developed by:** [Apivault Labs](https://apify.com/apivault_labs) (community)
- **Categories:** Lead generation, Business, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 leads

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## App Developer Lead Scraper — 6 app stores

**Find the companies behind apps — with their website, email and phone — so you
can reach out to them.** Covers Google Play, the Apple App Store, the Chrome Web
Store, Firefox Add-ons, the Microsoft Store and the VS Code Marketplace. No
login, no API key, no coding.

**$0.004 per lead ($4 / 1,000).**

### Not just another email scraper

Most "app email scrapers" do one store and dump a list of addresses. This one
is a full prospecting pipeline across **six** stores, with lead scoring and
CRM-ready exports built in.

| | Typical email scraper | **App Developer Lead Scraper** |
|---|:---:|:---:|
| Stores covered | Google Play only | **Google Play + App Store + Chrome + Firefox + Microsoft Store + VS Code** |
| Company + website | sometimes | ✅ every lead |
| Email | raw list | ✅ + `bestEmail`, corporate vs free, **named vs role**, MX-verified |
| Phone | ❌ | ✅ where published |
| Lead score / priority | ❌ | ✅ `leadScore` 0–100 + hot/warm/cool/cold, sorted hottest-first |
| App activity signal | ❌ | ✅ active / aging / abandoned (skip dead apps) |
| Dedupe by company | ❌ | ✅ one row per company, apps grouped, across stores |
| Quality filters | ❌ | ✅ installs, rating, dev size, has-email, no-website |
| Tech stack + socials | ❌ | ✅ Premium (Shopify, Stripe, LinkedIn, X, …) |
| Ready outreach line | ❌ | ✅ `outreachIcebreaker` |
| CRM export | CSV dump | ✅ flat CSV + **Contacts** dataset view |

If you sell to app makers — SDKs, dev tools, design/marketing agencies,
monetization, QA, localization — this finds and qualifies them in one run.

### How to use it (3 steps)

1. **Pick a store** — Google Play, App Store, Chrome Web Store, Firefox Add-ons,
   Microsoft Store, VS Code Marketplace, both mobile stores, or all of them.
   *(Google Play and Firefox publish the most emails directly.)*
2. **Type what apps you want** — words like `meditation`, `crm`, `invoicing`.
   Add as many as you like.
3. **Choose how many** apps per word, then click **Start**.

That's it. You get a clean list: company, website, email, phone, rating,
installs and more — ready to download as Excel, CSV or JSON.

#### Example

```json
{
  "store": "all",
  "keywords": ["meditation", "habit tracker"],
  "maxAppsPerQuery": 50
}
````

Everything else is optional — the defaults work out of the box.

### What you get for each company

Company name, website, email(s), phone, app rating, install count, category,
ads / in-app-purchase signals, last-updated date, a LinkedIn search link, and
the store page link. If a company makes several apps, they're grouped into one
row.

### Lead qualifiers & enrichment

On top of the core contact fields, the Actor can add:

- **`leadScore` (0–100) + `leadTier`** (hot/warm/cool/cold) + reasons — results
  are sorted hottest-first so sales can work the best prospects first.
- **`emailType`** (corporate vs free) and **`emailValid`** (MX-verified domain).
- **`emailRole`** (personal named mailbox vs generic role like `info@`) and
  **`bestEmail`** — the single best contact to import into a CRM.
- **`activityStatus`** (active / aging / abandoned) + `monthsSinceUpdate` — how
  actively the app is maintained. Active developers reply more; filter with
  `onlyActiveApps`.
- **`outreachIcebreaker`** (optional) — a ready, personalized opening line for
  cold email/DM, built from the app name, installs and rating.
- **`companySize`** (indie / small / mid / large / enterprise) from installs.
- **`installs` / `installsInt`** — Google Play install count.
- **`phone`** — developer phone from the Google Play contact block.
- **`containsAds` / `hasInAppPurchases`** — monetization signals.
- **`developerAppCount`** — how many apps the studio has published.
- **`techStack`** — tech / marketing tools on the developer's site.
- **`socials`** (premium) — LinkedIn/Twitter/Facebook/Instagram/etc.
- **`linkedinSearchUrl`** — one-click LinkedIn company lookup.

#### Filters (only pay for leads that match)

`minInstalls`, `minRating`, `minDeveloperApps`, `companySize`, `requireEmail`,
`onlyWithoutWebsite`. Skipped leads are never charged.

#### More reach

`countries` (multi-country discovery) and `includeSimilarApps` pull more unique
companies from a single keyword. `dedupeAcrossRuns` remembers what you already
got so daily runs never repeat a company.

### Plans

| | Basic — **$4 / 1,000** | Premium — **$8 / 1,000** |
|---|---|---|
| Company, website, email, phone | ✅ | ✅ |
| Installs, rating, category | ✅ | ✅ |
| Ads / in-app-purchase signals | ✅ | ✅ |
| Website **tech stack** (Shopify, Next.js, Stripe…) | — | ✅ |
| **Social profiles** (LinkedIn, Twitter/X, Facebook, Instagram, YouTube, TikTok, GitHub) | — | ✅ |
| **Extra emails** scraped from the website | — | ✅ |
| **Developer app count** (studio size) | — | ✅ |
| LinkedIn company link | ✅ | ✅ |

Set `"tier": "premium"` to turn it on. Premium auto-enables all enrichment, so
you don't need to toggle the advanced options yourself.

### Inputs

| Field | Description |
|---|---|
| `store` | `googleplay`, `appstore`, `chrome`, `firefox`, `msstore`, `vscode`, `both` (mobile), or `all` (every store) |
| `keywords` | Words describing the apps you want |
| `maxAppsPerQuery` | How many apps per word (start at 50, up to 1000) |
| `discoverBy` | `keyword` (default) or `category` |
| `keywords` | Search terms (keyword mode) |
| `categories` | Category names (category mode): games, finance, productivity, business, health-fitness, social-networking, … |
| `country` | Two-letter store code (`us`, `gb`, `de`, …) |
| `maxAppsPerQuery` | Target apps to collect per keyword/category (1–1000). For keywords, the Actor expands the term and multiplexes across store countries to get well past the store's ~30/query search cap (one keyword can yield ~900 apps). |
| `requireEmail` | Skip apps with no discoverable email (not charged) |
| `onlyWithoutWebsite` | Keep only app makers **without a website** — ideal if you sell web design and want prospects who still need a site |
| `outputFields` | `all`, `contacts` (email/phone/socials), `email` only, or `phone` only |
| `flatOutput` | Flatten nested data into simple columns for clean CSV/Excel |
| `dedupeByCompany` | One row per company, no duplicate rows (default on) |
| `dedupeByCompany` | Merge all apps from one developer into a single lead with an `apps[]` array (cleaner for CRM). Default on. |
| `addLinkedin` | Add a `linkedinSearchUrl` (company search by domain) |
| `developerAppCount` | Count the developer's other apps (studio-size signal) |
| `detectTech` | Visit the developer's site and detect its tech / marketing stack |
| `appStoreFindEmail` | Auto-find a contact email for **App Store** apps from their website (default on). Apple doesn't publish emails directly. |
| `includeWebsiteEmails` | Also scrape the developer's site for emails (slower, more coverage) |
| `maxConcurrency` | Parallel requests |

### Lead qualifiers & enrichment

On top of the core contact fields, the Actor can add:

- **`installs` / `installsInt`** — Google Play install count (lead size).
- **`phone`** — developer phone from the Google Play contact block.
- **`containsAds` / `hasInAppPurchases`** — monetization signals.
- **`developerAppCount`** — how many apps the studio has published.
- **`techStack`** — tech / marketing tools on the developer's site
  (e.g. Shopify, Next.js, React, HubSpot, Stripe, Segment, GA, FB Pixel).
- **`linkedinSearchUrl`** — one-click LinkedIn company lookup.
- **One lead per company** (default) — apps from the same developer are merged
  into one record with `apps[]`, `appCount`, `stores[]`, `totalInstalls`.

### Output (one row per app/developer)

```json
{
  "store": "googleplay",
  "appId": "com.getsomeheadspace.android",
  "appName": "Headspace: Sleep & Meditate",
  "company": "Headspace for Meditation, Mindfulness",
  "website": "https://headspace.com",
  "websiteDomain": "headspace.com",
  "email": "help@headspace.com",
  "emails": ["help@headspace.com"],
  "phone": "+1 415-237-1054",
  "installs": "50,000,000+",
  "installsInt": 50000000,
  "rating": 4.3,
  "ratingCount": 310245,
  "category": "Health & Fitness",
  "containsAds": false,
  "hasInAppPurchases": true,
  "lastUpdated": "Jun 2, 2026",
  "storeUrl": "https://play.google.com/store/apps/details?id=com.getsomeheadspace.android"
}
```

**Fields per lead:**

- **Contact** — company, website, websiteDomain, email, emails\[], phone
- **Scale / qualifiers** — installs (Google Play), rating, ratingCount,
  containsAds, hasInAppPurchases, price/isFree
- **Listing** — category, lastUpdated, storeUrl, developer page
- App Store adds: contentRating, minOsVersion, languages, releaseDate

> Install counts and developer phone are available on Google Play. For the App
> Store, the Actor automatically visits each app's website to find a contact
> email (`appStoreFindEmail`, on by default). Some large brands hide email
> behind contact forms, so App Store email coverage is lower than Google Play.

### Where the data comes from

- **Google Play** publishes a developer **contact email** on every listing —
  the strongest source for emails, plus install counts and phone.
- **Firefox Add-ons** publish the developer **homepage and support email**
  directly in the listing — excellent email coverage, no website visit needed.
- **Chrome Web Store** shows a developer **contact email** (and often a website)
  on each extension's page.
- **VS Code Marketplace** exposes the publisher **name, verified website domain
  and a GitHub link**; email is found from the publisher's website. Great for
  reaching developer-tool companies.
- **Apple App Store** and **Microsoft Store** expose the developer **company
  name and website** but not an email, so the Actor visits the developer's
  website to find one automatically (`appStoreFindEmail`, on by default). Some
  large brands hide email behind contact forms, so coverage there is lower.

### Use cases

- **B2B outreach to app & extension publishers** — SDK, API, analytics,
  monetization, push/notification, A/B-testing and crash-reporting vendors
  selling to mobile and browser-extension developers.
- **Agency prospecting** — ASO, user-acquisition, mobile design, QA/testing and
  localization agencies building a pipeline of app-maker clients.
- **Developer-tool go-to-market** — reach Chrome/Firefox extension publishers
  and VS Code Marketplace authors (a clean ICP of software companies).
- **Market mapping** — list every company in a category or keyword across all
  six stores, with installs, ratings and tech stack.
- **Partnership & competitive research** — find who builds what, and how to
  contact them.

### FAQ

**How is this different from a Google Play email scraper?**
It covers six stores (Google Play, Apple App Store, Chrome Web Store, Firefox
Add-ons, Microsoft Store, VS Code Marketplace), not one — and it scores and
de-duplicates leads, finds the best contact email, flags abandoned apps, and
exports CRM-ready rows, instead of dumping a raw address list.

**Can I get Chrome extension or VS Code developer contacts?**
Yes. Set `store` to `chrome`, `firefox`, `vscode`, or `all`. Extension and
dev-tool publishers are a high-value B2B audience that single-store scrapers miss.

**Do I get emails for App Store / Microsoft Store apps?**
Apple and Microsoft don't publish a developer email, only the website. The Actor
visits that website to find a contact email automatically (`appStoreFindEmail`).

**Can I import the results straight into a CRM?**
Yes — use the **Contacts** dataset view or `flatOutput` for a clean CSV ready
for HubSpot, Pipedrive, Salesforce, Lemlist, Instantly, etc.

**Is there an API / Python SDK?**
Yes — see the [Python SDK on GitHub](https://github.com/apivault-labs/app-developer-leads-python).

### Notes

- You are charged per lead returned; skipped/failed apps are not billed.
- Public data only. Use lawfully and in line with each store's terms,
  anti-spam laws (CAN-SPAM, GDPR, CASL) and the recipient's preferences.

# Actor input Schema

## `store` (type: `string`):

Where to look for apps. Google Play and Firefox give the most emails directly; App Store, Microsoft Store, Chrome and VS Code emails are found from the developer's website.

## `keywords` (type: `array`):

Type words that describe the apps, like "meditation", "crm", or "invoicing". Add as many as you want — one per line.

## `maxAppsPerQuery` (type: `integer`):

How many apps to collect for each word above. Start small (50) to try it out, raise it later for bigger lists (up to 10000).

## `tier` (type: `string`):

Basic = company, website, email, phone, installs, rating. Premium = everything in Basic PLUS website tech stack, social media links (LinkedIn/Twitter/Facebook/Instagram/etc.), extra emails scraped from the website, developer app count, and a LinkedIn company link.

## `discoverBy` (type: `string`):

Keep "By keywords" unless you want the top-ranked apps in a whole category instead.

## `categories` (type: `array`):

Only used if Search method = "By category". Examples: games, finance, productivity, business, health-fitness, all.

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

Two-letter country code for the store (us, gb, de, …).

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

Optional. Search across several store countries at once for more unique apps. Leave empty to use the single Country above.

## `minInstalls` (type: `integer`):

Keep only apps with at least this many installs. 0 = no limit. E.g. 100000 to focus on serious developers.

## `minRating` (type: `integer`):

Keep only apps rated at least this (0–5). 0 = no limit.

## `minDeveloperApps` (type: `integer`):

Keep only developers who publish at least this many apps (bigger studios). 0 = no limit.

## `companySize` (type: `string`):

Filter by developer size (based on install volume).

## `verifyEmail` (type: `boolean`):

Check that the email's domain can receive mail (DNS MX lookup — no email is sent). Adds an emailValid flag.

## `includeSimilarApps` (type: `boolean`):

For each Google Play app, also pull its 'similar apps' to find more leads from one keyword. Slower, more results.

## `dedupeAcrossRuns` (type: `boolean`):

Remember companies already delivered in previous runs (in this Actor's storage) and skip them next time. Great for daily prospecting.

## `requireEmail` (type: `boolean`):

Skip apps where no email was found (you are not charged for skipped apps).

## `appStoreFindEmail` (type: `boolean`):

Apple doesn't publish developer emails, only the company website. Turn this on to automatically visit each App Store app's website and pull a contact email. Recommended when scraping the App Store. (Google Play already gives emails directly.)

## `onlyWithoutWebsite` (type: `boolean`):

Keep only app makers that have no website (great if you sell web design / development and want prospects who still need a site).

## `onlyActiveApps` (type: `boolean`):

Skip apps that look abandoned (not updated in ~18+ months). Active developers have a live budget and reply more — better leads. Skipped apps are not charged.

## `outputFields` (type: `string`):

Choose how much detail to return per lead.

## `flatOutput` (type: `boolean`):

Flatten nested data (apps, socials, lists) into simple columns. Turn on for clean CSV/Excel exports; leave off for full nested JSON.

## `dedupeByCompany` (type: `boolean`):

If a company makes several apps, show it once with all its apps grouped together — no duplicate rows. Turn off to get one row per app.

## `addLinkedin` (type: `boolean`):

Adds a ready link to look the company up on LinkedIn.

## `addIcebreaker` (type: `boolean`):

Generates a personalized first line for cold email/DM per lead (mentions their app, installs or rating). Saves writing an opener for every prospect. No AI key needed.

## `includeWebsiteEmails` (type: `boolean`):

Visits each company's website to find extra emails. Finds more contacts but is slower.

## `detectTech` (type: `boolean`):

Checks the company website for tools it uses (Shopify, WordPress, Stripe, etc.). Slower.

## `developerAppCount` (type: `boolean`):

Shows the company's total number of apps (a sign of how big they are). Slower.

## `maxConcurrency` (type: `integer`):

Higher is faster but hits the stores harder. 8 is a good balance; raise toward 15 for big runs.

## `runBudgetSecs` (type: `integer`):

Safety limit for the whole run. When reached, the Actor stops collecting more leads and returns what it has — so a huge search can never run up a big compute bill. Default 600 (10 min). Set 0 to disable.

## Actor input object example

```json
{
  "store": "googleplay",
  "keywords": [
    "meditation",
    "habit tracker"
  ],
  "maxAppsPerQuery": 50,
  "tier": "basic",
  "discoverBy": "keyword",
  "categories": [
    "productivity"
  ],
  "country": "us",
  "minInstalls": 0,
  "minRating": 0,
  "minDeveloperApps": 0,
  "companySize": "any",
  "verifyEmail": false,
  "includeSimilarApps": false,
  "dedupeAcrossRuns": false,
  "requireEmail": false,
  "appStoreFindEmail": true,
  "onlyWithoutWebsite": false,
  "onlyActiveApps": false,
  "outputFields": "all",
  "flatOutput": false,
  "dedupeByCompany": true,
  "addLinkedin": true,
  "addIcebreaker": false,
  "includeWebsiteEmails": false,
  "detectTech": false,
  "developerAppCount": false,
  "maxConcurrency": 8,
  "runBudgetSecs": 600
}
```

# 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 = {
    "keywords": [
        "meditation",
        "habit tracker"
    ],
    "categories": [
        "productivity"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("apivault_labs/app-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 = {
    "keywords": [
        "meditation",
        "habit tracker",
    ],
    "categories": ["productivity"],
}

# Run the Actor and wait for it to finish
run = client.actor("apivault_labs/app-developer-leads").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "keywords": [
    "meditation",
    "habit tracker"
  ],
  "categories": [
    "productivity"
  ]
}' |
apify call apivault_labs/app-developer-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=apivault_labs/app-developer-leads",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "App Developer Lead Scraper | $4/1K | Email & Site",
        "description": "Find app-developer leads at scale from the App Store & Google Play. Pick a category or keyword and a store, and get every app's company name, website, contact email, rating, category and store link. Built for B2B outreach to app publishers. No login or API key. Bulk, parallel. $0.004 per lead.",
        "version": "1.16",
        "x-build-id": "e1ZdncKeLxI7dbEO3"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/apivault_labs~app-developer-leads/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-apivault_labs-app-developer-leads",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/apivault_labs~app-developer-leads/runs": {
            "post": {
                "operationId": "runs-sync-apivault_labs-app-developer-leads",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/apivault_labs~app-developer-leads/run-sync": {
            "post": {
                "operationId": "run-sync-apivault_labs-app-developer-leads",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "store"
                ],
                "properties": {
                    "store": {
                        "title": "1. Which store?",
                        "enum": [
                            "googleplay",
                            "appstore",
                            "chrome",
                            "firefox",
                            "msstore",
                            "vscode",
                            "both",
                            "all"
                        ],
                        "type": "string",
                        "description": "Where to look for apps. Google Play and Firefox give the most emails directly; App Store, Microsoft Store, Chrome and VS Code emails are found from the developer's website.",
                        "default": "googleplay"
                    },
                    "keywords": {
                        "title": "2. What apps are you looking for?",
                        "type": "array",
                        "description": "Type words that describe the apps, like \"meditation\", \"crm\", or \"invoicing\". Add as many as you want — one per line.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxAppsPerQuery": {
                        "title": "3. How many apps per word?",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "How many apps to collect for each word above. Start small (50) to try it out, raise it later for bigger lists (up to 10000).",
                        "default": 50
                    },
                    "tier": {
                        "title": "4. Plan",
                        "enum": [
                            "basic",
                            "premium"
                        ],
                        "type": "string",
                        "description": "Basic = company, website, email, phone, installs, rating. Premium = everything in Basic PLUS website tech stack, social media links (LinkedIn/Twitter/Facebook/Instagram/etc.), extra emails scraped from the website, developer app count, and a LinkedIn company link.",
                        "default": "basic"
                    },
                    "discoverBy": {
                        "title": "Search method",
                        "enum": [
                            "keyword",
                            "category"
                        ],
                        "type": "string",
                        "description": "Keep \"By keywords\" unless you want the top-ranked apps in a whole category instead.",
                        "default": "keyword"
                    },
                    "categories": {
                        "title": "Categories",
                        "type": "array",
                        "description": "Only used if Search method = \"By category\". Examples: games, finance, productivity, business, health-fitness, all.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "country": {
                        "title": "Country",
                        "type": "string",
                        "description": "Two-letter country code for the store (us, gb, de, …).",
                        "default": "us"
                    },
                    "countries": {
                        "title": "Countries (multi)",
                        "type": "array",
                        "description": "Optional. Search across several store countries at once for more unique apps. Leave empty to use the single Country above.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "minInstalls": {
                        "title": "Minimum installs (Google Play)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Keep only apps with at least this many installs. 0 = no limit. E.g. 100000 to focus on serious developers.",
                        "default": 0
                    },
                    "minRating": {
                        "title": "Minimum rating",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Keep only apps rated at least this (0–5). 0 = no limit.",
                        "default": 0
                    },
                    "minDeveloperApps": {
                        "title": "Minimum apps by developer",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Keep only developers who publish at least this many apps (bigger studios). 0 = no limit.",
                        "default": 0
                    },
                    "companySize": {
                        "title": "Company size",
                        "enum": [
                            "any",
                            "indie",
                            "large"
                        ],
                        "type": "string",
                        "description": "Filter by developer size (based on install volume).",
                        "default": "any"
                    },
                    "verifyEmail": {
                        "title": "Verify email domain (MX check)",
                        "type": "boolean",
                        "description": "Check that the email's domain can receive mail (DNS MX lookup — no email is sent). Adds an emailValid flag.",
                        "default": false
                    },
                    "includeSimilarApps": {
                        "title": "Also scrape 'similar apps'",
                        "type": "boolean",
                        "description": "For each Google Play app, also pull its 'similar apps' to find more leads from one keyword. Slower, more results.",
                        "default": false
                    },
                    "dedupeAcrossRuns": {
                        "title": "Don't repeat leads from past runs",
                        "type": "boolean",
                        "description": "Remember companies already delivered in previous runs (in this Actor's storage) and skip them next time. Great for daily prospecting.",
                        "default": false
                    },
                    "requireEmail": {
                        "title": "Only keep apps that have an email",
                        "type": "boolean",
                        "description": "Skip apps where no email was found (you are not charged for skipped apps).",
                        "default": false
                    },
                    "appStoreFindEmail": {
                        "title": "Find emails for App Store apps (from their website)",
                        "type": "boolean",
                        "description": "Apple doesn't publish developer emails, only the company website. Turn this on to automatically visit each App Store app's website and pull a contact email. Recommended when scraping the App Store. (Google Play already gives emails directly.)",
                        "default": true
                    },
                    "onlyWithoutWebsite": {
                        "title": "Only apps WITHOUT a website",
                        "type": "boolean",
                        "description": "Keep only app makers that have no website (great if you sell web design / development and want prospects who still need a site).",
                        "default": false
                    },
                    "onlyActiveApps": {
                        "title": "Only actively-maintained apps",
                        "type": "boolean",
                        "description": "Skip apps that look abandoned (not updated in ~18+ months). Active developers have a live budget and reply more — better leads. Skipped apps are not charged.",
                        "default": false
                    },
                    "outputFields": {
                        "title": "What to output",
                        "enum": [
                            "all",
                            "contacts",
                            "email",
                            "phone"
                        ],
                        "type": "string",
                        "description": "Choose how much detail to return per lead.",
                        "default": "all"
                    },
                    "flatOutput": {
                        "title": "Flat rows (best for CSV / Excel)",
                        "type": "boolean",
                        "description": "Flatten nested data (apps, socials, lists) into simple columns. Turn on for clean CSV/Excel exports; leave off for full nested JSON.",
                        "default": false
                    },
                    "dedupeByCompany": {
                        "title": "One row per company (remove duplicates)",
                        "type": "boolean",
                        "description": "If a company makes several apps, show it once with all its apps grouped together — no duplicate rows. Turn off to get one row per app.",
                        "default": true
                    },
                    "addLinkedin": {
                        "title": "Add a LinkedIn search link",
                        "type": "boolean",
                        "description": "Adds a ready link to look the company up on LinkedIn.",
                        "default": true
                    },
                    "addIcebreaker": {
                        "title": "Add a ready outreach opening line",
                        "type": "boolean",
                        "description": "Generates a personalized first line for cold email/DM per lead (mentions their app, installs or rating). Saves writing an opener for every prospect. No AI key needed.",
                        "default": false
                    },
                    "includeWebsiteEmails": {
                        "title": "Look for more emails on the company website",
                        "type": "boolean",
                        "description": "Visits each company's website to find extra emails. Finds more contacts but is slower.",
                        "default": false
                    },
                    "detectTech": {
                        "title": "Detect what the website is built with",
                        "type": "boolean",
                        "description": "Checks the company website for tools it uses (Shopify, WordPress, Stripe, etc.). Slower.",
                        "default": false
                    },
                    "developerAppCount": {
                        "title": "Count how many apps the company has",
                        "type": "boolean",
                        "description": "Shows the company's total number of apps (a sign of how big they are). Slower.",
                        "default": false
                    },
                    "maxConcurrency": {
                        "title": "Speed (parallel requests)",
                        "minimum": 1,
                        "maximum": 15,
                        "type": "integer",
                        "description": "Higher is faster but hits the stores harder. 8 is a good balance; raise toward 15 for big runs.",
                        "default": 8
                    },
                    "runBudgetSecs": {
                        "title": "Max run time (seconds)",
                        "minimum": 0,
                        "maximum": 3600,
                        "type": "integer",
                        "description": "Safety limit for the whole run. When reached, the Actor stops collecting more leads and returns what it has — so a huge search can never run up a big compute bill. Default 600 (10 min). Set 0 to disable.",
                        "default": 600
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
