# App Developer Contact Finder - Google Play Emails (`hllerdgn80/app-developer-contact-finder`) Actor

Developer contact e-mail addresses from Google Play listings, charged only when an address is actually delivered. Google requires every app to publish one, so nearly every app returns a usable contact. Search a keyword or paste app URLs.

- **URL**: https://apify.com/hllerdgn80/app-developer-contact-finder.md
- **Developed by:** [Halil Erdogan](https://apify.com/hllerdgn80) (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

from $50.00 / 1,000 developer contact delivereds

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 Contact Finder

Developer contact e-mail addresses from Google Play listings. **You are charged only when an address is actually delivered.**

### Why the hit rate is high

Google requires every app on Play to publish a developer contact address, and the store renders it as a labelled "Support email" link. This Actor reads that label. It does not guess addresses, does not try permutations against a mail server, and does not touch anything behind a login.

Measured 13 September 2026 on a "habit tracker" search: **six apps checked, six addresses found.** That is the practical difference between this and most lead sources — the address is not optional for the developer, so it is nearly always there.

### What you get per app

| Field | Example |
|---|---|
| `developerEmail` | `habitnow.apps@gmail.com` |
| `appName` | HabitNow Daily Routine Planner |
| `developer` | the publishing account's name |
| `installs` | `5M+` |
| `rating` | 4.7 |
| `ratingCount` | how many reviews |
| `website` | the developer's own site |
| `playUrl` | the listing |
| `emailSource` | `support email`, or `sole mailto on the page` |
| `error` | why a listing produced no address, instead of vanishing |

`installs` is kept exactly as Google prints it — `5M+`, `500K+` — because that is a bucket, not a count, and turning it into a number would invent precision the store does not publish.

### One thing this gets right that a naive scraper does not

A Play listing also renders the e-mail addresses of the **similar apps** shown further down the page. Scanning the HTML for anything that looks like an address therefore hands you a competitor's contact and calls it your lead. Measured: HabitNow's page carries `hello@routinery.app` alongside its own address.

This Actor keys on the labelled support link, and when a page has no label it takes a `mailto:` only if the page carries exactly one. An ambiguous listing reports nothing rather than the wrong developer.

### Two ways to use it

**Find apps by keyword.** Put terms in `searchTerms`, and set `country` and `language` for the storefront you care about.

**Check apps you already have.** Put them in `apps` — Play URLs or bare package names like `com.duolingo`.

### Pricing

**$0.05 per contact delivered**, plus a $0.001 flat fee per run. A listing with no published address is free. A listing that cannot be read is free.

### Notes

Google Play rate-limits, so runs use a datacentre route first and fall back to residential. A listing refused on one route is retried on the next; an app that genuinely does not exist is reported as missing rather than retried pointlessly.

Contact details published by a business for business contact are still personal data in some jurisdictions. Use the output in line with the rules that apply to you, including GDPR and the CAN-SPAM Act, and honour opt-outs.

# Actor input Schema

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

Keywords to search the Play store for, e.g. "habit tracker" or "invoice scanner". Each term is expanded into apps and each listing is read for the developer's contact address.

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

Google Play URLs or bare package names such as com.duolingo. Mixed formats are fine.

## `maxPerSearchTerm` (type: `integer`):

How many apps to take from each search term before moving on.

## `maxApps` (type: `integer`):

A hard stop so a broad search cannot run away.

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

Two-letter country code for the Play catalogue to search, e.g. US, GB, DE, TR.

## `language` (type: `string`):

Two-letter language code for the listing text, e.g. en, de, it.

## `onlyAppsWithEmail` (type: `boolean`):

Off by default so you can see which listings were checked and found to publish nothing. Either way, you are only charged for delivered addresses.

## `concurrency` (type: `integer`):

How many listings to read at the same time. Play rate-limits, so higher is not always faster.

## Actor input object example

```json
{
  "searchTerms": [
    "habit tracker"
  ],
  "maxPerSearchTerm": 25,
  "maxApps": 200,
  "country": "US",
  "language": "en",
  "onlyAppsWithEmail": false,
  "concurrency": 5
}
```

# Actor output Schema

## `apps` (type: `string`):

Dataset with one item per app: appId, appName, developer, developerEmail, emailSource, installs, rating, ratingCount, website, playUrl, error.

## `runStats` (type: `string`):

Key-value store record RUN\_STATS: apps requested, listings read, with a contact, without one, failed and charged.

# API

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

## JavaScript example

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

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

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

// Run the Actor and wait for it to finish
const run = await client.actor("hllerdgn80/app-developer-contact-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 = { "searchTerms": ["habit tracker"] }

# Run the Actor and wait for it to finish
run = client.actor("hllerdgn80/app-developer-contact-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 '{
  "searchTerms": [
    "habit tracker"
  ]
}' |
apify call hllerdgn80/app-developer-contact-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,hllerdgn80/app-developer-contact-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/D3OrgNASQ5ZFJdr0h/builds/wMOxUUBxyV7eL4Zxa/openapi.json
