# App Developer Email Finder: Google Play, App Store, Steam (`datagleaner/app-developer-email-finder`) Actor

Find the public developer email, website, address, phone and privacy policy of any app on Google Play, the Apple App Store, Steam or the Chrome Web Store. Give app URLs or IDs, or a keyword per store. $0.0015 per app with an email; apps without one are free. No login.

- **URL**: https://apify.com/datagleaner/app-developer-email-finder.md
- **Developed by:** [Data Gleaner](https://apify.com/datagleaner) (community)
- **Categories:** Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 app with developer emails

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 Developer Email Finder: Google Play, App Store, Steam and Chrome Web Store

Find an **app developer's email** and contact details on four stores with one tool: **Google Play, the Apple App Store, Steam and the Chrome Web Store**. It answers the searches "app developer email", "app developer contacts", "app store developer contact", "google play developer email", "steam developer email" and "chrome extension developer email". Give it app URLs or IDs, or a keyword per store, and get each developer's **public support email, website, postal address, phone and privacy-policy URL**, plus installs, rating, category and last update. **You pay $0.0015 only for an app whose developer has a public email; an app without one is returned free.** No login, no API key, no CAPTCHA, no browser.

Built for AI agents and lead-generation pipelines as well as people: one row per app, the same fields for every store, and the price tied to the answer you wanted.

### What it finds

Every store asks developers to publish a way to reach them, and this Actor reads it from the store's own data for that app:

| Store | Email | Website | Address and phone | Other |
|---|---|---|---|---|
| Google Play | The listing's developer email, plus the trader email when the developer declared one | Yes | From the trader declaration (most apps) | Privacy policy, installs, rating, category, last update, price |
| Apple App Store | The trader email from the EU storefront's "Provider" panel, then the developer's website | Yes, and the support link | From the trader declaration | Privacy policy, rating, category, release and update dates, price |
| Steam | The game's support email | Yes | No | Developer, publisher, genres, review count, release date, price |
| Chrome Web Store | The developer's contact email | Yes | From the trader declaration, when given | Support page, privacy policy, users, rating, last update |

On Google Play and the Chrome Web Store the contact block is read from the app's own record, never from a scan of the whole page, so the emails of "similar apps" on the same page never leak into a row.

With `followLinks` on (the default), it also visits up to **3 pages of the developer's own site** (the website, its contact page, the support page or the privacy policy) to add emails and the developer's social profiles (X, LinkedIn, Facebook, Instagram, YouTube, GitHub, Discord and more). Only addresses that belong to the developer are kept: the site's own domain, a domain named after the developer, a webmail address, or the domain of an address the store already listed. Hosting, agency and platform addresses on those pages are dropped. A developer with 40 apps has its website read once per run.

### Use cases

- **App-marketing and ASO agencies**: build outreach lists of apps in a niche (`habit tracker`, `meditation`, `budget app`) with the developer's email and install band.
- **User-acquisition and ad networks, SDK and B2B SaaS sales**: find the developers of apps in a category and reach the right company, with its legal name and address.
- **Game publishers and scouts**: list Steam games by keyword with the studio's support email, website and Discord.
- **Chrome extension acquisitions and partnerships**: contact the developers of extensions with a given number of users.
- **An AI agent or enrichment pipeline** that needs "the developer's email" for a list of store links, paying only for hits.

### Input

| Field | Meaning |
|---|---|
| `apps` | Store URLs or IDs from any of the four stores; the store is read from the URL. Google Play `com.duolingo`, App Store `id570060128`, Steam `steam:413150`, Chrome extension ID (32 letters). |
| `searchKeywords` | Find apps by keyword, e.g. `habit tracker`. Each keyword is searched in every store in `stores`. |
| `stores` | Stores to search: `googlePlay` (default), `appStore`, `steam`, `chromeWebStore`. |
| `maxAppsPerKeyword` | Apps taken from each keyword in each store (default 30). Google Play returns at most about 30 per keyword; the App Store up to 200; Steam and the Chrome Web Store page further. |
| `country` | Two-letter storefront (default `us`). Sets the storefront searched and the price currency. |
| `followLinks` | Visit up to 3 pages of the developer's site for more emails and socials (default true). |
| `onlyWithEmail` | Output only apps with a developer email (default false). Apps without one are free either way. |
| `maxConcurrency`, `delaySecs`, `requestTimeoutSecs`, `respectRobotsTxt`, `proxyConfiguration` | Pacing and network options. No proxy by default. |

Leave everything empty to run a sample of 5 Google Play apps for "habit tracker" (about 10 seconds).

```json
{
  "searchKeywords": ["habit tracker", "meditation"],
  "stores": ["googlePlay", "appStore", "chromeWebStore"],
  "maxAppsPerKeyword": 30,
  "onlyWithEmail": true
}
```

```json
{
  "apps": [
    "https://play.google.com/store/apps/details?id=com.duolingo",
    "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
    "https://store.steampowered.com/app/413150/Stardew_Valley/",
    "https://chromewebstore.google.com/detail/grammarly-ai-writing-assi/kbfnbcaeplbcioakkpcpgfkobkghlhen"
  ]
}
```

### Output

One row per app. Fields the store does not publish are `null`, never invented.

```json
{
  "store": "steam",
  "appId": "413150",
  "appName": "Stardew Valley",
  "appUrl": "https://store.steampowered.com/app/413150/",
  "developerName": "ConcernedApe",
  "developerId": null,
  "developerUrl": "https://store.steampowered.com/developer/ConcernedApe",
  "developerEmail": "support@stardewvalley.net",
  "developerWebsite": "http://www.stardewvalley.net",
  "developerAddress": null,
  "developerPhone": null,
  "traderName": null,
  "publisherName": "ConcernedApe",
  "privacyPolicyUrl": null,
  "supportUrl": null,
  "emails": [
    {"email": "support@stardewvalley.net", "source": "store", "foundOn": "https://store.steampowered.com/app/413150/"},
    {"email": "contact@stardewvalley.net", "source": "website", "foundOn": "https://www.stardewvalley.net/contact/"}
  ],
  "socials": {
    "x": "https://x.com/concernedape",
    "facebook": "https://www.facebook.com/StardewValley",
    "reddit": "https://www.reddit.com/r/StardewValley",
    "discord": "https://discord.gg/StardewValley"
  },
  "category": "Indie, RPG, Simulation",
  "installs": null,
  "rating": null,
  "ratingCount": 898702,
  "lastUpdatedAt": null,
  "releasedAt": "2016-02-26",
  "price": 14.99,
  "currency": "USD",
  "hasEmail": true,
  "pagesFollowed": 2,
  "status": "ok",
  "error": null,
  "input": "https://store.steampowered.com/app/413150/Stardew_Valley/",
  "scrapedAt": "2026-10-09T14:38:52+00:00"
}
```

A Google Play row for Duolingo carries `developerEmail: "super-support@duolingo.com"`, the trader email `android@duolingo.com`, `developerAddress: "5900 Penn Ave, Pittsburgh, PA 15206, United States"`, `developerPhone`, `privacyPolicyUrl`, `installs: 500000000` and `rating: 4.74`.

- `developerEmail` is the best email: the store's own support email first, then the trader email, then one from the developer's site.
- `emails[].source` is `store`, `trader`, `website`, `supportPage` or `privacyPolicy`; `foundOn` is the exact page.
- `installs` is the lower bound of Google Play's install band (5000000 for "5M+") and the user count on the Chrome Web Store.
- `rating` is a 0 to 5 star average; Steam has none and gives `ratingCount` as its review count.
- An app that cannot be read gets a row with `status: "error"` and an `error` message, and is not charged.

The dataset has two views: **Developer contacts** (one row per app) and **All emails** (one row per email with where it was found).

### Pricing

Pay per answer, one event:

- **`app-with-email`: $0.0015** for each app whose developer has at least one public email.
- An app with **no email is free**. It is still returned with its website, address and store data, so you can see why.
- An app that cannot be read (`status: "error"`) is free.

**Worked example.** 1,000 Google Play apps, of which about 95% list a developer email: 950 x $0.0015 = **$1.43**. The 50 without an email cost nothing. Turn on `onlyWithEmail` to leave them out of the dataset; the price is the same.

**Compared with other tools.** App-developer contact tools on the Apify Store charge $0.0045 per row whether or not it has an email, or $0.02 to $0.05 per lead, and the popular Google Play scrapers charge $0.002 per app plus a start fee. Here a found email costs $0.0015, with four stores in one run, no start fee, and a miss costs nothing.

Set a maximum total charge on the run and the Actor stops cleanly when it is reached.

### What to expect

Measured on a test run of "habit tracker" across all four stores (62 apps): **59 had a developer email (95%)**. Google Play 16 of 16, App Store 14 of 14, Chrome Web Store 16 of 16, Steam 13 of 16. Google Play lists a developer email for nearly every app. App Store emails come from the EU trader declaration (most apps sold in the EU have one) and otherwise from the developer's website. Some small Steam games publish no support email. A second check, "budget planner" on the App Store, found emails for 3 of 5 apps: apps sold only in the US carry no EU trader panel, so their email depends on the developer's website.

### Limits

- Google Play search returns at most about 30 apps per keyword; use several keywords for more.
- App Store emails need either an EU trader declaration or an email on the developer's own site; apps sold only outside the EU with no email on their site have none.
- Steam pages are paced to stay under Steam's limit of about 200 calls per 5 minutes, so large Steam runs take about 1.6 seconds per game. The iTunes API is likewise paced.
- Developer websites that render entirely with JavaScript may show fewer emails.
- Only public store listings and the developer's own pages are read; social platforms are listed, never scraped.

### Use it from n8n, Make, Zapier or an AI agent

Actor ID: `datagleaner/app-developer-email-finder`

Minimal input:

```
{"apps": ["https://play.google.com/store/apps/details?id=com.duolingo", "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128", "https://store.steampowered.com/app/413150/Stardew_Valley/", "https://chromewebstore.google.com/detail/grammarly-ai-writing-assi/kbfnbcaeplbcioakkpcpgfkobkghlhen"]}
```

Each tool below runs this Actor with your own Apify API token.

- **n8n:** add the **Apify** node (`@apify/n8n-nodes-apify`). On n8n Cloud you install it from the community node registry. Choose **Run an Actor and get dataset**, set Actor to `datagleaner/app-developer-email-finder` and paste the input above.
- **Make:** use the Apify app's **Run an Actor** module, then **Get Dataset Items** to read the results. **Watch Actor Runs** can trigger a scenario when a run finishes.
- **Zapier:** use the Apify action **Run Actor**, then the search **Fetch dataset items**. The trigger **Finished Actor run** starts a Zap when a run ends.
- **AI agents (MCP):** connect to `https://mcp.apify.com?tools=datagleaner/app-developer-email-finder`. Without a token, an agent can still find Actors with the `search-actors` tool, but running this one needs your Apify account. In Claude Code:

  ```
    claude mcp add --transport http apify "https://mcp.apify.com?tools=datagleaner/app-developer-email-finder"
  ```

  Then run `/mcp` to sign in to Apify in your browser. Then ask in plain language, for example: "Find 30 meditation apps on Google Play and the App Store and give me each developer's email, website and address, only for apps with more than 100,000 installs."
- **LangChain (Python):**

```python
## pip install langchain-apify, then set APIFY_TOKEN in your environment
import json
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("datagleaner/app-developer-email-finder")
result = tool.invoke({"run_input": json.loads('{"apps": ["https://play.google.com/store/apps/details?id=com.duolingo", "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128", "https://store.steampowered.com/app/413150/Stardew_Valley/", "https://chromewebstore.google.com/detail/grammarly-ai-writing-assi/kbfnbcaeplbcioakkpcpgfkobkghlhen"]}')})
```

Claude Desktop and other clients that take an `mcpServers` config can run the Apify MCP server locally:

```json
{
  "mcpServers": {
    "actors-mcp-server": {
      "command": "npx",
      "args": ["-y", "@apify/actors-mcp-server"],
      "env": { "APIFY_TOKEN": "YOUR_APIFY_TOKEN" }
    }
  }
}
```

### FAQ

**How do I find an app developer's email?** Paste the app's store link into `apps` (or search a keyword), run it, and read `developerEmail`. Every store link format above is accepted.

**Do I need a Google Play, Apple, Steam or Chrome Web Store account or API key?** No.

**Where does the App Store email come from?** Apple shows the trader's email, phone and address on EU storefronts under the Digital Services Act. The Actor reads the app's page on an EU storefront for that panel, whatever `country` you choose, then falls back to the developer's own website.

**Why is a Steam game's email empty?** The developer left the support email blank on Steam. With `followLinks` on, the Actor still looks on their website.

**Is the address the developer's office?** It is the address the developer declared to the store as a trader. Individual developers sometimes give a home address; treat it with care.

**Can I get more than 30 Google Play results for a keyword?** Google Play itself stops at about 30. Use several related keywords; duplicates across keywords and stores are removed.

### Responsible use

This Actor reads public store listings and the developer's own public pages only. Email addresses, phone numbers and addresses, especially those of individual developers, can be personal data. You are responsible for lawful use, including consent and opt-out rules for outreach (GDPR, CAN-SPAM and local law), and for respecting the stores' terms.

# Actor input Schema

## `apps` (type: `array`):

Store URLs or app IDs, one per line, from any of the four stores; the store is read from the URL. Google Play: `https://play.google.com/store/apps/details?id=com.duolingo` or `com.duolingo`. App Store: `https://apps.apple.com/us/app/duolingo/id570060128` or `id570060128`. Steam: `https://store.steampowered.com/app/413150/` or `steam:413150`. Chrome Web Store: the detail URL or the 32-letter extension ID. Leave this and the keywords empty to run a 5-app sample.

## `searchKeywords` (type: `array`):

Find apps by keyword, for example `habit tracker` or `roguelike`. Each keyword is searched in every store chosen below.

## `stores` (type: `array`):

Which stores the keywords are searched in. App URLs and IDs above are always looked up in their own store.

## `maxAppsPerKeyword` (type: `integer`):

How many apps to take from each keyword search in each store. Google Play returns at most about 30 per keyword; the App Store up to 200; Steam and the Chrome Web Store page further.

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

Two-letter store country (`us`, `gb`, `de`, `jp`). It sets the storefront searched and the currency of prices.

## `followLinks` (type: `boolean`):

Visit up to 3 pages of the developer's own website, support page and privacy policy to find more emails (including for App Store apps outside the EU, where Apple shows no email) and the developer's social profiles. Only addresses that belong to the developer are kept.

## `onlyWithEmail` (type: `boolean`):

Output only apps whose developer has at least one public email. Apps without an email are free either way.

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

How many apps are processed at the same time. Steam and the iTunes API are always paced below their rate limits whatever this is.

## `delaySecs` (type: `integer`):

Each app starts after a random pause of up to this many seconds. Raise it on very large runs to stay polite.

## `respectRobotsTxt` (type: `boolean`):

Skip developer website pages that the site's robots.txt disallows.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for each page before retrying.

## `proxyConfiguration` (type: `object`):

Optional. Defaults to no proxy. Use one if a store starts answering with errors on very large runs.

## Actor input object example

```json
{
  "apps": [
    "https://play.google.com/store/apps/details?id=com.duolingo",
    "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
    "https://store.steampowered.com/app/413150/Stardew_Valley/",
    "https://chromewebstore.google.com/detail/grammarly-ai-writing-assi/kbfnbcaeplbcioakkpcpgfkobkghlhen"
  ],
  "stores": [
    "googlePlay"
  ],
  "maxAppsPerKeyword": 30,
  "country": "us",
  "followLinks": true,
  "onlyWithEmail": false,
  "maxConcurrency": 5,
  "delaySecs": 1,
  "respectRobotsTxt": true,
  "requestTimeoutSecs": 25
}
```

# Actor output Schema

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

No description

# 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 = {
    "apps": [
        "https://play.google.com/store/apps/details?id=com.duolingo",
        "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
        "https://store.steampowered.com/app/413150/Stardew_Valley/",
        "https://chromewebstore.google.com/detail/grammarly-ai-writing-assi/kbfnbcaeplbcioakkpcpgfkobkghlhen"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("datagleaner/app-developer-email-finder").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 = { "apps": [
        "https://play.google.com/store/apps/details?id=com.duolingo",
        "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
        "https://store.steampowered.com/app/413150/Stardew_Valley/",
        "https://chromewebstore.google.com/detail/grammarly-ai-writing-assi/kbfnbcaeplbcioakkpcpgfkobkghlhen",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("datagleaner/app-developer-email-finder").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 '{
  "apps": [
    "https://play.google.com/store/apps/details?id=com.duolingo",
    "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
    "https://store.steampowered.com/app/413150/Stardew_Valley/",
    "https://chromewebstore.google.com/detail/grammarly-ai-writing-assi/kbfnbcaeplbcioakkpcpgfkobkghlhen"
  ]
}' |
apify call datagleaner/app-developer-email-finder --silent --output-dataset

```

## MCP server setup

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

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/gtq3Vf8sAfAqfEiev/builds/pLBUdnVsOSqvoX8Wt/openapi.json
