# Docker Hub Publisher Lead Extractor (`ayeeyee/docker-hub-publisher-lead-extractor`) Actor

Verified DevOps/infra vendor leads from Docker Hub: MX/DNS-verified emails + phones + socials + tech stack from the publisher's OWN declared website, repo traction (pulls/stars), a verified-publisher trust signal, and an A-D org-readiness grade. No API keys, no proxy. Per-result pricing.

- **URL**: https://apify.com/ayeeyee/docker-hub-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

## Docker Hub Publisher Lead Extractor

Turn Docker Hub namespaces and image searches into **verified DevOps / infrastructure vendor sales leads** — MX/DNS-validated business emails, phones, social profiles and tech stack scraped from the publisher's **own declared website**, plus repo traction (pulls, stars, activity), a **verified-publisher trust signal**, and an A–D org-readiness grade. Per-successful-result pricing. No API keys, no proxy.

> **Why it exists.** Docker Hub surfaces thousands of real vendors (Bitnami/VMware, Grafana Labs, NVIDIA, Canonical, Kasm, Elestio…) each declaring their own company website on their org profile. This actor hops from a Docker Hub namespace → the publisher's OWN `profile_url` website and verifies contact there — so you reach the company, not a Docker profile. The fresh-publisher angle (newly-joined orgs) is the AppContactList-style "newly funded" pitch, applied to DevOps vendors.

### What you get (per publisher lead)

- `namespace`, `fullName`, `company`, `location`, `profileUrl` (their OWN declared site)
- `verifiedPublisher` — Docker's `verified_publisher` badge (a real trust signal)
- `dateJoined`, `isActive`, `newlyLaunched` (joined within your rolling window)
- `repoCount`, `totalPulls`, `totalStars`, `newestActivity`, `topRepos` (name/pulls/stars/last-updated)
- `emails` (MX/DNS-verified), `emailVerified`, `phones`, `socials`, `techStack`
- `orgReadiness` (A–D) + `orgLabel` (plain-English pitch-readiness), `leadScore` (A–D), `hasContact`

Contact ALWAYS comes from the publisher's own declared website — Docker Hub user/profile personal data is never mined (ToS-clean, identical to the App-Store `sellerUrl` / Steam `website` pattern).

### Inputs

| Field | Type | Description |
|---|---|---|
| `namespaces` | string\[] | Docker Hub org slugs (`bitnami`), `ns/repo` pairs, or `hub.docker.com` URLs. Official images (`/_/postgres`, `library/...`) are dropped — no vendor to sell to. |
| `searchQueries` | string\[] | Keywords → discover images → resolve publisher namespaces (e.g. `postgres`). Bare official images are dropped. |
| `maxPerQuery` | int | Cap on search results per query (1–100, default 25). |
| `maxReposPerNamespace` | int | Cap on repos inspected for traction per namespace (1–100, default 25). |
| `verifiedPublishersOnly` | bool | Keep only `verified_publisher`-badged orgs (default false). |
| `joinedWithinDays` | int | Flag orgs joined in the trailing N days as `newlyLaunched` (0 = off). |
| `verifyEmails` | bool | MX/DNS-validate the best contact email (default true). |
| `concurrency` | int | Parallel namespaces (1–8, default 3). |
| `proxyConfiguration` | object | Optional — only if you hit rate limits (Docker Hub is keyless). |

### Real-run sample (verified live 2026-07-17)

Input: `{"searchQueries":["redis","nginx"],"maxPerQuery":15}` → 14 publisher leads. Three representative records (exact live output):

```json
[
  {
    "namespace": "cleanstart",
    "fullName": "CleanStart",
    "company": "CleanStart",
    "location": "USA",
    "profileUrl": "https://www.cleanstart.com/",
    "verifiedPublisher": true,
    "dateJoined": "2024-06-05T17:41:41.070258Z",
    "repoCount": 25,
    "totalPulls": 1310447,
    "totalStars": 4,
    "newestActivity": "2026-07-17T01:47:20.241454+00:00",
    "topRepos": [{ "name": "openldap", "pullCount": 69089, "starCount": 0, "lastUpdated": "2026-07-17T00:46:54.849337Z" }],
    "emails": ["careers@cleanstart.com"],
    "emailVerified": true,
    "socials": { "linkedin": "https://www.linkedin.com/groups/18324021/", "twitter": "https://x.com/CleanStartX", "youtube": "https://www.youtube.com/@CleanStartOfficial" },
    "techStack": ["Google Analytics", "React"],
    "orgReadiness": "A",
    "orgLabel": "Prime target — strong pull traction, active catalog, reachable contact.",
    "leadScore": "A",
    "hasContact": true
  },
  {
    "namespace": "elestio",
    "company": "Elestio",
    "location": "Dublin, Ireland",
    "profileUrl": "https://elest.io",
    "verifiedPublisher": true,
    "dateJoined": "2020-08-13T10:53:22.192761Z",
    "repoCount": 25,
    "totalPulls": 1194925,
    "totalStars": 80,
    "newestActivity": "2026-07-17T02:52:52.543394+00:00",
    "topRepos": [{ "name": "postgres", "pullCount": 201903, "starCount": 2, "lastUpdated": "2026-07-16T19:17:10.944735Z" }],
    "emails": ["support@elest.io"],
    "emailVerified": true,
    "socials": { "linkedin": "https://www.linkedin.com/company/elestio", "youtube": "https://www.youtube.com/@elestio", "twitter": "https://twitter.com/elest_io" },
    "techStack": ["Calendly", "Cloudflare", "Google Analytics", "Google Tag Manager"],
    "orgReadiness": "A",
    "leadScore": "A",
    "hasContact": true
  },
  {
    "namespace": "nginx",
    "fullName": "NGINX Inc.",
    "company": "NGINX Inc.",
    "location": "San Francisco",
    "profileUrl": "https://www.nginx.com/",
    "verifiedPublisher": true,
    "dateJoined": "2014-05-06T20:52:50Z",
    "repoCount": 8,
    "totalPulls": 1189375191,
    "totalStars": 245,
    "newestActivity": "2026-07-16T15:47:48.177555+00:00",
    "topRepos": [{ "name": "nginx-ingress", "pullCount": 1086177378, "starCount": 121, "lastUpdated": "2026-07-16T15:47:48.177555Z" }],
    "emails": [],
    "emailVerified": false,
    "socials": { "twitter": "https://x.com/F5", "linkedin": "https://www.linkedin.com/company/f5/", "facebook": "https://www.facebook.com/f5incorporated", "instagram": "https://www.instagram.com/f5.global/", "youtube": "https://www.youtube.com/user/f5networksinc" },
    "techStack": ["React"],
    "orgReadiness": "A",
    "leadScore": "C",
    "hasContact": true
  }
]
```

Honesty notes reflected in the data: NGINX carries huge traction and five real social profiles (now F5-owned) but no verifiable email on its site — it is still billed once (`publisher_lead`) for the social contact, and `verified_email` is honestly false. CleanStart (joined 2024-06) and Elestio both returned MX/DNS-verified emails. A namespace with no org profile or no contact signal is returned honestly and **not billed** (e.g. `redislabs`/`vmware` surfaced with traction but `hasContact:false`). Enrichment can vary by fetch origin (some publisher sites expose different contact surface to Apify's datacenter IPs); each field is reported exactly as found, never fabricated.

### Pricing (pay-per-event)

| Event | Price | Charged when |
|---|---|---|
| `publisher_lead` (primary) | $0.008 | once per publisher org that returns ≥1 real contact signal (email/phone/social) + repo traction |
| `verified_email` | $0.003 | the org yields ≥1 MX/DNS-validated contact email from its own site |
| `publisher_signal` | $0.001 | the org joined Docker Hub within your rolling window (fresh-vendor pitch) |
| `apify-actor-start` | $0.0001 | run start (one-time) |

Per-verified-contact economics, not a flat database fee. Priced well above per-run compute cost — zero upstream compose cost (self-contained: Docker Hub keyless org/search/repositories APIs + the publisher's own public site).

### Performance & cost

- \~25 namespaces/run in a few seconds (concurrency 3, no proxy).
- A no-contact org (no org profile, or no email/phone/social on its site) is returned honestly and **not billed** — you only pay for leads with a real contact signal.
- `verifiedPublishersOnly` + `joinedWithinDays` narrow to the highest-trust, freshest vendors.

### Troubleshooting

- **"No org profile (skipped, not billed)"** — the namespace resolved from search but `/v2/orgs/{ns}` returned 404 (often an individual user, not an org, or a typo). Drop it or use an org slug.
- **`emails: []`** — the publisher's own site didn't expose a contact email (many vendors route via forms/socials). Their socials/tech are still real; the lead is billed once for the social contact.
- **Official images dropped** — `postgres` (bare) and `/_/postgres` are Docker-curated, not a third-party vendor; there is no company to sell to. Use a real namespace like `bitnami/postgresql`.
- **Rate limits (HTTP 429)** — rare on Docker Hub's keyless APIs; lower `concurrency` or add a `proxyConfiguration`.

### Output schema

One row per publisher org (`namespace` is the dedupe key). Fields as documented above. Output available at the run's default dataset URL (JSON/CSV).

***

Built on the same self-contained, keyless, margin-positive pattern as our Website Contact & Company Extractor, ATS Hiring-Intent Lead Finder, Shopify / Podcast / Hugging Face / App & Play Store / Steam / Substack lead extractors. No API keys, no proxy, no compose cost — contact always from the publisher's own declared site.

# Actor input Schema

## `namespaces` (type: `array`):

Docker Hub org slugs (e.g. 'bitnami', 'grafana'), 'ns/repo' pairs, or hub.docker.com URLs (https://hub.docker.com/u/<ns> or https://hub.docker.com/r/<ns>\[/<repo>]). Official images (hub.docker.com/\_/<repo>, 'library/...') have no vendor and are dropped.

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

Keywords to discover Docker images (and thus publishers) via Docker Hub's keyless search endpoint (e.g. 'postgres', 'nginx'). Bare official images are dropped; third-party 'ns/repo' results resolve to their publisher namespace. Each query returns up to `maxPerQuery` results.

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

Cap on search results returned per query (1-100).

## `maxReposPerNamespace` (type: `integer`):

Cap on repos inspected for traction per namespace (1-100). Larger namespaces are capped to their most recent repos.

## `verifiedPublishersOnly` (type: `boolean`):

Keep only orgs carrying Docker's verified\_publisher badge (a real trust signal — live-verified 2026-07-17).

## `joinedWithinDays` (type: `integer`):

Flag orgs that joined Docker Hub 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`):

Namespaces processed in parallel (1-8). Docker Hub's keyless APIs tolerate moderate concurrency.

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

Optional. Only needed if you hit rate limits; the Actor works without a proxy (Docker Hub's keyless APIs).

## Actor input object example

```json
{
  "namespaces": [
    "bitnami",
    "grafana",
    "https://hub.docker.com/u/nvidia"
  ],
  "searchQueries": [
    "postgres",
    "redis",
    "nginx"
  ],
  "maxPerQuery": 25,
  "maxReposPerNamespace": 25,
  "verifiedPublishersOnly": false,
  "joinedWithinDays": 0,
  "verifyEmails": true,
  "concurrency": 3,
  "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 = {
    "namespaces": [
        "bitnami"
    ],
    "searchQueries": [
        "postgres"
    ],
    "proxyConfiguration": {}
};

// Run the Actor and wait for it to finish
const run = await client.actor("ayeeyee/docker-hub-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 = {
    "namespaces": ["bitnami"],
    "searchQueries": ["postgres"],
    "proxyConfiguration": {},
}

# Run the Actor and wait for it to finish
run = client.actor("ayeeyee/docker-hub-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 '{
  "namespaces": [
    "bitnami"
  ],
  "searchQueries": [
    "postgres"
  ],
  "proxyConfiguration": {}
}' |
apify call ayeeyee/docker-hub-publisher-lead-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ayeeyee/docker-hub-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/b669yphDMS64RYztL/builds/ibNwQh4pWP5uH7poh/openapi.json
