# App & Play Store Publisher Lead Extractor (`ayeeyee/app-publisher-lead-extractor`) Actor

Turn iOS app names, IDs, URLs, or keyword searches into publisher sales leads: MX/DNS-verified emails, phones, socials, and tech stack from the publisher's OWN website (iTunes sellerUrl), an A-D lead score, the app catalog, and a newly-launched publisher-readiness signal. No keys, no proxy.

- **URL**: https://apify.com/ayeeyee/app-publisher-lead-extractor.md
- **Developed by:** [Virtual Footprint LLC](https://apify.com/ayeeyee) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 publisher lead with contacts

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/platform/actors/running/actors-in-store#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 & Play Store Publisher Lead Extractor

Turn iOS app names, Apple App IDs, app URLs, or niche keyword searches into **publisher sales leads**: MX/DNS-verified contact emails + phones + socials + tech stack pulled from the publisher's **own website** (the Apple iTunes `sellerUrl` — *not* the App Store support email), an A–D lead score, the publisher's app catalog, and a publisher-readiness signal with a **newly-launched** flag.

This is the value proposition AppContactList.com charges **$199/month** for — a feed of app publishers with a verified business contact — delivered here per-*verified*-result, MCP-ready ("find publishers of newly launched apps in category X with a verified contact email").

### Why this actor

- **Verified contact from the publisher's own site.** App-store scrapers dump metadata; none bundle a *verified* publisher contact. We hop from the app to the developer's own website (Apple's keyless iTunes `sellerUrl`) and run MX/DNS email verification — the same enrichment layer behind our Website Contact, ATS, Shopify, Podcast, and Hugging Face lead extractors.
- **Newly-launched signal.** A rolling `launchedWithinDays` window flags publishers whose apps just launched — peak outreach timing for agencies/SDK vendors hunting early-stage app makers.
- **Per-success pricing.** You pay only for publishers that return a real contact signal — no flat feed, no per-run charge for empty results.
- **No keys, no proxy, no anti-bot, no compose cost.** Apple's iTunes Search/Lookup API is public and keyless; the publisher's website is public HTML. Margin-positive from day one.

### Input

| Field | Type | Description |
|---|---|---|
| `apps` | string\[] | Apple App Store URLs (`https://apps.apple.com/.../id<ID>`) or bare numeric App IDs. |
| `searchQueries` | string\[] | Keywords to discover apps via Apple's iTunes Search API (e.g. `"habit tracker"`). |
| `maxPerQuery` | int (1–200) | Apps returned per search query. Default `15`. |
| `country` | string | iTunes storefront (default `us`). |
| `category` | string | Optional genre filter (e.g. `"Finance"`). Case-insensitive substring. |
| `launchedWithinDays` | int | Rolling window (days) to flag newly-launched apps. `0` = disabled (default). |
| `verifyEmails` | bool | MX/DNS-validate the best contact email. Default `true`. |
| `concurrency` | int (1–10) | Publishers processed in parallel. Default `5`. |
| `proxyConfiguration` | object | Optional; only if you hit rate limits. The actor works without a proxy. |

Provide `apps` and/or `searchQueries`. Unrecognized references are dropped gracefully (never billed).

### Output

One record per **publisher** (apps rolled up by Apple developer id, falling back to the `sellerUrl` host). Example shape (a real record — see the verified sample below):

```json
{
  "publisherName": "Notion Labs, Incorporated",
  "sellerUrl": "https://notion.com",
  "developerId": "1232780280",
  "developerUrl": "https://apps.apple.com/us/developer/notion-labs-incorporated/id1232780280?uo=4",
  "appCount": 4,
  "apps": [
    {
      "appId": "6759811964",
      "title": "Notion Agents",
      "category": "Productivity",
      "releaseDate": "2026-07-07T07:00:00+00:00",
      "version": "1.0.1",
      "rating": 4.67,
      "ratingCount": 3,
      "newlyLaunched": true
    }
  ],
  "newestReleaseDate": "2026-07-07T07:00:00+00:00",
  "newlyLaunched": true,
  "emails": [],
  "emailVerified": false,
  "phones": ["215 523 2070"],
  "socials": {
    "instagram": "https://www.instagram.com/notionhq/",
    "twitter": "https://twitter.com/NotionHQ",
    "linkedin": "https://www.linkedin.com/company/notionhq/",
    "facebook": "https://www.facebook.com/NotionHQ/",
    "youtube": "https://www.youtube.com/channel/UCoSvlWS5XcwaSzIcbuJ-Ysg"
  },
  "techStack": ["Cloudflare", "HubSpot", "React"],
  "totalRatingCount": 95314,
  "publisherReadiness": "A",
  "publisherLabel": "Prime target — recently launched app(s), strong ratings, reachable contact.",
  "leadScore": "B",
  "hasContact": true
}
```

Note the truthfulness: Notion's website does not expose a contact email in scraped HTML, so `emails: []` is returned honestly — not fabricated — while the phone, five socials, and tech stack it *does* expose are captured, so the lead still bills (`hasContact: true`). When a publisher's site does expose an email, it is MX/DNS-verified (see the Zipo record below).

### Real-run sample

A live run on Apify with `{"searchQueries": ["notion"], "launchedWithinDays": 30}` resolved 11 publisher records. Two illustrate the value:

**Notion Labs, Incorporated** (`developerId` 1232780280) — 4 apps rolled up, `newlyLaunched: true` (Notion Agents launched 2026-07-07), `publisherReadiness: A`, `leadScore: B`, `hasContact: true` (phone + 5 socials + tech stack; `emails: []` because notion.com hides its contact email in JS).

**Zipo Apps Ltd.** (`developerId` 1671444635, 1 app) — `info@zipoapps.com` extracted from the publisher's own site and **MX/DNS-verified** (`emailVerified: true`), `leadScore: B`, `hasContact: true`:

```json
{
  "publisherName": "Zipo Apps Ltd.",
  "sellerUrl": "https://zipoapps.com/taskfornotionios/",
  "developerId": "1671444635",
  "appCount": 1,
  "apps": [
    {
      "title": "To-Do List & Tasks for Notion",
      "category": "Productivity",
      "releaseDate": "2022-01-05T08:00:00+00:00",
      "rating": 4.33,
      "ratingCount": 757,
      "newlyLaunched": false
    }
  ],
  "newlyLaunched": false,
  "emails": ["info@zipoapps.com"],
  "emailVerified": true,
  "socials": {},
  "techStack": ["Google Analytics", "Google Tag Manager"],
  "totalRatingCount": 757,
  "publisherReadiness": "C",
  "leadScore": "B",
  "hasContact": true
}
```

A second live run, `{"apps": ["https://apps.apple.com/us/app/spotify-new-music/id324684580"]}`, resolved 1 publisher (Spotify, 40.9M ratings, `publisherReadiness: B`, `hasContact: false` — Spotify's site hides contacts, so it is **not billed**). A third, `{"searchQueries": ["habit tracker"]}`, resolved 11 small-publisher leads including HabitKit (socials) and Habitify-style indie devs. All three runs returned real, deduped, correctly-typed data with no placeholders or junk.

### Pricing (pay-per-event, all above cost)

| Event | Price | When charged |
|---|---|---|
| **Publisher Lead with Contact** (primary) | **$0.008** | Once per publisher returning a real contact signal + app catalog. |
| Verified Publisher Email | $0.003 | When a publisher yields an MX/DNS-validated email. |
| Newly-Launched App Signal | $0.001 | When a publisher has ≥1 app launched within the chosen window. |
| Actor Start | $0.0001 | One-time per run. |

Zero upstream compose cost (self-contained: keyless iTunes API + the publisher's own public website), so the primary event is comfortably above per-run compute.

### Troubleshooting

- **No results / "No apps resolved"** — the iTunes Search API only returns iOS apps; confirm `country` matches a real storefront and that your query is app-relevant (not a raw company name only).
- **`emails: []`** — the publisher has no `sellerUrl` on file, or their website exposes no contact email in scraped HTML. The actor returns the lead honestly with `hasContact: false` (not billed) rather than fabricating an address.
- **`newlyLaunched` false everywhere** — raise `launchedWithinDays` (it's a rolling window, default off).
- **Duplicate publishers** — apps roll up by Apple developer id; apps with no developer page roll up by the `sellerUrl` host, so the same company's apps collapse into one lead.

### Notes & scope

- **iOS-first.** Google Play publisher discovery (Play Developer ID → developer website) is a fast-follow; this actor ships the iOS path, which is fully keyless.
- **Contact always from the publisher's own site.** Apple's `sellerUrl` points at the developer's company website — we never mine App Store support emails or personal seller addresses for outreach.
- **`newlyLaunched` is a stateless rolling window**, not a cross-run cursor: a run with `launchedWithinDays=30` flags every app launched in the trailing 30 days, including ones a prior run already surfaced.

# Actor input Schema

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

Apple App Store URLs (https://apps.apple.com/.../id<ID>) or bare numeric App IDs. The publisher of each app is resolved via Apple's keyless iTunes Lookup API.

## `searchQueries` (type: `array`):

Keywords to discover apps (and thus publishers) via Apple's keyless iTunes Search API (e.g. 'habit tracker', 'expense tracker'). Each query returns up to `maxPerQuery` apps.

## `maxPerQuery` (type: `integer`):

Cap on apps returned per search query (1-200).

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

Two-letter ISO country code for Apple's storefront (default us).

## `category` (type: `string`):

Keep only apps whose primary genre or genres contain this string (e.g. 'Productivity', 'Finance'). Case-insensitive. Empty = no filter.

## `launchedWithinDays` (type: `integer`):

Flag apps launched within the trailing N days as `newlyLaunched` (rolling window, 0 = disabled). This is a stateless window filter, not a cross-run cursor.

## `verifyEmails` (type: `boolean`):

Validate the best contact email's domain against live MX/DNS records.

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

Publishers processed in parallel (1-10).

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

Optional. Only needed if you hit rate limits; the Actor works without a proxy (Apple's keyless iTunes API).

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/notion-notes-tasks-ai/id1232780281",
    "1232780281"
  ],
  "searchQueries": [
    "habit tracker",
    "expense tracker"
  ],
  "maxPerQuery": 15,
  "country": "us",
  "category": "",
  "launchedWithinDays": 0,
  "verifyEmails": true,
  "concurrency": 5,
  "proxyConfiguration": {}
}
```

# 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://apps.apple.com/us/app/notion-notes-tasks-ai/id1232780281"
    ],
    "searchQueries": [
        "habit tracker"
    ],
    "proxyConfiguration": {}
};

// Run the Actor and wait for it to finish
const run = await client.actor("ayeeyee/app-publisher-lead-extractor").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://apps.apple.com/us/app/notion-notes-tasks-ai/id1232780281"],
    "searchQueries": ["habit tracker"],
    "proxyConfiguration": {},
}

# Run the Actor and wait for it to finish
run = client.actor("ayeeyee/app-publisher-lead-extractor").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://apps.apple.com/us/app/notion-notes-tasks-ai/id1232780281"
  ],
  "searchQueries": [
    "habit tracker"
  ],
  "proxyConfiguration": {}
}' |
apify call ayeeyee/app-publisher-lead-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ayeeyee/app-publisher-lead-extractor"
        }
    }
}

```

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/Xrr0OKkD9bThaQlPS/builds/BqTJOc0AXzgQV30Dv/openapi.json
