# HubSpot Marketplace · Unique Partner Emails | $2 / 1k (`corent1robert/hubspot-marketplace-app-partners`) Actor

Export unique HubSpot Marketplace app partners for co-sell and outreach. Named BD/marketing contacts, support email, website, phone, HubSpot hubs, tier and installs — one vendor per row, not per app. Keyword, listing URL, category, or full catalog. No login. No API key.

- **URL**: https://apify.com/corent1robert/hubspot-marketplace-app-partners.md
- **Developed by:** [Corentin Robert](https://apify.com/corent1robert) (community)
- **Categories:** Lead generation, E-commerce, Integrations
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 unique app partners

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

### What does HubSpot Marketplace App Partners do?

This Actor builds a **co-sell / partnership file** from the public [HubSpot Marketplace](https://ecosystem.hubspot.com/marketplace/apps). **One row per unique vendor** — not one row per app.

You are not here to dump 2,500 listings. You want the companies that already sell into HubSpot: **who to email**, **which Hub they plug into**, **whether they scale** (Premier / installs / years on the Marketplace).

Each row is that file, when HubSpot publishes it:

- **Named person + role** (BD, marketing, product) — not only `support@`
- **Support inbox, website, phone, meetings / chat / form**
- **Partner tier, install totals, years on Marketplace, starting USD/month**
- **HubSpot hubs they integrate** (Deals, Calling, Ticketing…) plus other tools (Salesforce, Slack…)

Empty fields mean the partner did not publish that data — not a failed scrape. Two apps under the same partner portal stay **one lead**.

**No login. No HubSpot API key. No partner-portal access.**

### Who is this for?

| You are… | Typical goal | Suggested setup |
|---|---|---|
| Partnership / alliances at a SaaS | Unique publishers to pitch for co-sell, not duplicate listings | Search your niche (`sms`, `crm`) then sort by `partnerTier` / `totalInstalls` |
| HubSpot agency | Vendors already in your clients’ Hub | Category (SMS, E-Commerce, Live Chat) + **Require public email = Yes** |
| SaaS wanting a HubSpot badge | See who already ships in your category and who to talk to | Same; use **Partners — Overview** (hubs + price + tenure) |
| Outbound / SDR | CRM-ready named inbox and role | **Partners — Outreach** view, CSV |
| Market research | Who scales on the Marketplace | Paid **Full catalog**, raise Max partners |

**What you get by default:** unique vendor, named outreach contact when listed, support email, HubSpot hubs, public starting price, tier, installs, tenure — **only fields the listing already shows**. HubSpot-built apps (Gmail, Calendar) are skipped unless you turn that filter off.

**Typical fill (public SMS slice, Aug 2026):** every exported Premier row had a support inbox and at least one named contact (e.g. Aircall BD `hami@aircall.io`). Starting price and hubs are present on most mature listings; meetings URLs are often empty.

### How to scrape HubSpot Marketplace app partners

1. Open this Actor in Apify Console.
2. **Step 1 — Mode:** leave **Search** (a niche) or switch to **Full catalog** (every unique app vendor, paid). Catalog ignores keyword and category.
3. **Step 2 — Search** (Search mode only): keep `sms`, or paste `https://ecosystem.hubspot.com/marketplace/listing/proposify`. Optionally pick a category.
4. Leave **Max partners** at 20 for a first run, then raise it. Full catalog: raise toward 5,000.
5. Click **Start**. Download JSON / CSV / Excel. Use **Partners — Outreach** for the person to email; **Overview** for who scales.

In Search mode, query **or** category is required. Full catalog is paid Apify plans only. Search uses HubSpot’s public keyword ranking (paginated, no duplicate pages) then listing details — it is **not** a full census of a category. For every unique vendor, use Full catalog.

See the **Input** tab for the visible options (proxy is optional and hidden).

### Ready-made examples (published tasks)

| Example | What you get |
|---|---|
| [Find HubSpot SMS app partners with public emails](https://apify.com/corent1robert/hubspot-marketplace-app-partners/examples/sms-app-partners-emails) | Unique SMS vendors, named inbox, CRM-ready |
| [Export HubSpot e-commerce app vendors for CRM](https://apify.com/corent1robert/hubspot-marketplace-app-partners/examples/ecommerce-hubspot-app-vendors) | E-commerce category, one partner per row |
| [Refresh HubSpot partner contacts from a listing URL](https://apify.com/corent1robert/hubspot-marketplace-app-partners/examples/listing-url-proposify-refresh) | Paste a listing URL, get the vendor file |
| [HubSpot CRM app partners for cold outreach](https://apify.com/corent1robert/hubspot-marketplace-app-partners/examples/crm-app-partners-outreach) | CRM niche, outreach view |

### What data can this HubSpot Marketplace scraper extract?

| Field | Why it matters for ICP |
|---|---|
| `outreachName`, `outreachRole`, `developerEmail` | Person to email (BD / marketing / product preferred over `support@`) |
| `supportEmail`, `phone`, `meetingsUrl`, `liveChatUrl`, `contactFormUrl` | Other public ways in |
| `developerWebsite`, `developerDomain` | Company site + clean host for CRM match |
| `partnerTier`, `totalInstalls`, `yearsOnMarketplace` | Who already scales |
| `hubspotFeatures`, `toolIntegrations`, `sharedObjects` | What they plug into HubSpot — co-sell map |
| `startingPriceUsd`, `startingPlanName`, `hasFreeTrial`, `pricingPlansUrl` | Agency / packaging conversation |
| `appCount`, `appSlugs`, `sampleAppTitle`, `listingUrl` | Portfolio in this run + sample listing |
| `sourceQuery`, `scrapedAt` | Run metadata |

Not extracted (and not invented): private HubSpot CRM contacts, guessed emails from the marketing site, LinkedIn (HubSpot does not publish it on the listing), Solutions Partner / services listings (apps only).

### How much does it cost to scrape HubSpot Marketplace partners?

This Actor uses **pay-per-event** pricing. **Actor start is $0.00005** (Apify default — first 5 seconds of compute included). You only pay per **unique partner written to the dataset**. You are not charged per app listing. Paid Apify plans get a lower price per partner.

**Free plan:** a run stops at **20 partners** — enough to test. Keyword / category: paid plans can raise Max partners up to **2,000**. **Full catalog** (paid only) goes up to **5,000** unique vendors.

| | Free | Bronze | Silver | Gold | Platinum | Diamond |
|---|---|---|---|---|---|---|
| Per unique partner | $0.002 | $0.0018 | $0.0016 | $0.0014 | $0.0012 | $0.001 |
| 20 partners (Try) | **$0.04** | $0.04 | $0.03 | $0.03 | $0.02 | $0.02 |
| 1,000 partners | **$2.00** | $1.80 | $1.60 | $1.40 | $1.20 | $1.00 |
| Full catalog (~1,900 vendors) | **~$3.80** | $3.42 | $3.04 | $2.66 | $2.28 | $1.90 |

Totals include the $0.00005 start. HubSpot Marketplace scrapers on Apify charge **per listing** (~$1.30–$15 / 1k apps, duplicates included). Here two apps from the same vendor are **one charge**, with a named outreach inbox when HubSpot publishes it. Full catalog ≈ **$3.80** vs ~$3.75 for 2,500 listings at $1.50/1k — same budget, unique vendors, better inbox.

Set **Max partners** and, on Apify, a **max total charge** so a run cannot exceed your budget. A row with an empty email still counts if **Require public email** is **No** — HubSpot did not publish that field; the partner was still scraped.

Default memory is **512 MB** (HTTP only, no browser).

### Is it legal to scrape HubSpot Marketplace?

This Actor only accesses data that HubSpot makes **publicly available** on [ecosystem.hubspot.com](https://ecosystem.hubspot.com) listing pages (support email, named contacts the partner chose to show). As with any data containing personal information, ensure your use complies with GDPR and relevant regulations. Do not scrape personal data unless you have a legitimate reason to do so.

### Input

See the **Input** tab for full configuration options.

Visible Console fields:

| Field | Default | Notes |
|---|---|---|
| `coverage` | Search | **Search** = keyword/URL and/or category. **Full catalog** = paid, English listing sitemap. Catalog ignores query and category. |
| `query` | `sms` | Search mode. Keyword or `https://ecosystem.hubspot.com/marketplace/listing/{slug}`. Ignored in Full catalog. |
| `category` | None | Search mode, optional. Ignored in Full catalog. |
| `maxPartners` | 20 | Unique vendors (1–2000 Search, 1–5000 catalog). Free plan: 20 / run |
| `requireEmail` | `yes` | **Yes** (default) skips vendors with no public email. **No** keeps them |
| `excludeHubspotBuilt` | `yes` | **Yes** (default) drops HubSpot-built listings |
| `minInstalls` | 0 | Skip vendors whose merged install sum is below this floor |

Proxy, delay, and retries are hidden. Direct HTTP usually works. API-only keys: `proxyConfiguration`, `minDelayMs` (default 250), `maxRequestRetries` (default 5), `verboseLogs` (default false — Marketplace status codes and per-listing skip reasons).

Example:

```json
{
  "coverage": "search",
  "query": "sms",
  "category": "",
  "maxPartners": 20,
  "requireEmail": "yes",
  "excludeHubspotBuilt": "yes",
  "minInstalls": 0
}
```

### Output

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

```json
{
  "developerName": "Aircall",
  "partnerPortalId": 2150317,
  "developerWebsite": "https://aircall.io",
  "developerDomain": "aircall.io",
  "developerEmail": "hami@aircall.io",
  "outreachEmail": "hami@aircall.io",
  "outreachName": "Hami Neisari",
  "outreachRole": "Business Development",
  "supportEmail": "support@aircall.io",
  "phone": "+1 888 240 6923",
  "partnerTier": "Premier",
  "partnerTierLabel": "Premier",
  "tagline": "Customer Communications, Evolved. Where intelligent automation meets human connection.",
  "hubspotFeatures": ["Company records", "Calling", "Deals", "Ticketing"],
  "toolIntegrations": ["Gong", "Salesforce.com", "Shopify"],
  "startingPriceUsd": 40,
  "startingPlanName": "Essentials",
  "hasFreeTrial": false,
  "yearsOnMarketplace": 9.8,
  "firstPublishedAt": "2016-10-26T00:00:00.000Z",
  "totalInstalls": 15815,
  "appCount": 1,
  "appSlugs": ["aircall"],
  "sampleAppTitle": "Aircall : AI-powered calling and SMS",
  "listingUrl": "https://ecosystem.hubspot.com/marketplace/listing/aircall",
  "sourceQuery": "sms",
  "scrapedAt": "2026-08-17T08:00:00.000Z"
}
```

Console views: **Partners — Overview** (who scales), **Partners — Outreach** (person + inbox), **Partners — Publisher file** (hubs + pricing).

### Tips

- A HubSpot **category is not the full catalog**. Search pages HubSpot’s keyword index (40 cards per page, no overlap) then filters the category on the listing. For every unique vendor, set **Mode** to **Full catalog**.
- Rows are ranked by **merged install count** in the run, so a 20-partner SMS run surfaces Aircall / RingCentral first — not a random page-1 tourist list.
- Locale is locked to **English**.
- Empty `developerEmail` / `meetingsUrl` means HubSpot did not show them on that listing.
- `appCount` is how many of that vendor’s apps appeared **in this run’s listing pool** — not a guaranteed full HubSpot portfolio.

### Local development

```bash
cd hubspot-marketplace-app-partners
npm install
apify run
```

Default Try input is Search `sms`, 20 partners. That writes `storage/datasets/default/` **and** `./output.csv` (Excel-ready).

**Full catalog (every unique vendor on the English sitemap):**

```bash
npm run start:catalog
```

That uses root `input.json` (`coverage: catalog`, `maxPartners: 5000`, email filter off). `apify run` otherwise validates `storage/key_value_stores/default/INPUT.json` — pass `--input-file=./input.json` so the catalog file wins. Do not use `npm start` for a simulated Actor run.

Engine tests (query detect + live Marketplace):

```bash
npm test
```

### Related Actors

These Actors cover the same job or the next step in the workflow. Apify’s automatic recommendations stay inside one category — this list is the rest of the toolkit.

| Actor | Use it when |
|---|---|
| [Shopify App Store Developer Contacts · Emails & Address](https://apify.com/corent1robert/shopify-app-developer-contacts) | Same unique-publisher model on the Shopify App Store |
| [Google Play Developer Contacts · Emails & Legal Address](https://apify.com/corent1robert/google-play-developer-contacts) | Google Play publisher emails — unique developers, not per app |
| [Chrome Web Store Developer Contacts](https://apify.com/corent1robert/chrome-web-store-developer-contacts) | Chrome Web Store publisher emails |
| [Google Workspace Marketplace Vendors](https://apify.com/corent1robert/google-workspace-marketplace-vendors) | Google Workspace Marketplace unique vendors |
| [Shopify Product Scraper · Full Catalog Export by Store URL](https://apify.com/corent1robert/shopify-products-scraper) | Full product catalog of a Shopify merchant store |
| [SW Website Rankings Scraper](https://apify.com/corent1robert/similarweb-scraper) | Rank the website / domain after you have the URL |

### FAQ, disclaimers, and support

#### Is there a HubSpot Marketplace partner email API?

No official public one for this job. This Actor is a **HubSpot Marketplace partner email API alternative**: it reads the public listing HubSpot already shows.

#### How do I find HubSpot app partner emails?

Run a **keyword** (`sms`) or a **category** (SMS, E-Commerce). Leave **Require public email** on **Yes**. Download the **Outreach** view — you get the named BD/marketing person when HubSpot lists one, not only `support@`.

#### Do you also scrape Shopify / Play / Chrome developers?

Yes. See **Related Actors** — same unique-publisher model on those stores.

#### How is this different from a HubSpot Marketplace app scraper?

Catalog scrapers dump **one row per app** (screenshots, reviews, ASO). This Actor dumps a **co-sell file**: unique vendors with a named person, HubSpot hubs, public price, tier and installs. Same publisher, one row.

#### Can I scrape the whole HubSpot Marketplace?

**Paid plans:** set **Mode** to **Full catalog** and **Max partners** to 5,000. That walks the English **app listing** sitemap (~2,500 listings → unique publishers). It is not 2,500 app rows — two apps from the same partner stay one lead.

**Free plan:** no. Full catalog is rejected; keyword / category runs stop at 20 partners.

#### Does this scrape private emails?

No. It only reads fields the partner published on the HubSpot Marketplace listing. It does not crawl the partner’s marketing site to guess extra inboxes.

#### Why do two apps become one row?

Rows are unique by HubSpot **partner portal id** (then website host / company name). Several apps from the same publisher share one contact file.

#### Why did I get fewer rows than Max partners?

The Marketplace ran out of publicly listed apps in that query/category, or **Require public email** is **Yes** and some vendors have no email. On the **Free plan**, each run is also capped at **20 partners**. Check `OUTPUT` and `RUN_LOG`.

#### Why is an email empty?

Empty fields mean HubSpot did not show them on that listing — not a failed scrape.

#### Do I pay an Actor-start fee?

Almost nothing: **$0.00005** per run (Apify default, first 5 seconds of compute included). The bill is the partners written to the dataset.

#### Do I pay per app?

No. Two apps from the same partner = **one** portal id = **one** charge. Pricing is per unique vendor, not per listing.

#### Do I pay for rows with an empty email?

Only if **Require public email** is **No**. Pricing is **per partner scraped**, not per filled field.

#### Is a proxy required?

No. Enable Apify Proxy only if you get blocked.

Our Actors are ethical and do not extract private user data. They only extract what the partner has chosen to publish on the HubSpot Marketplace listing (public email, named contacts, website). We therefore believe that our Actors, when used for ethical purposes by Apify users, are safe. However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you are unsure, consult your lawyers.

Use the **Issues** tab for bugs and feature requests. Use the **API** tab to run the Actor programmatically. Custom needs: corentin@outreacher.fr

*Keywords: HubSpot Marketplace scraper, HubSpot app partner email, HubSpot Marketplace leads, HubSpot ISV contacts, HubSpot Marketplace developer leads API.*

# Actor input Schema

## `coverage` (type: `string`):

**Search (default):** use Step 2 (keyword and/or category).

**Full catalog (paid):** walks ~2,500 app listings into unique vendors. Leave Step 2 empty — it is ignored. Set Max partners to how many vendors you will pay for. Free Apify plans cannot use Full catalog.

## `query` (type: `string`):

Examples: `sms` · `proposify` · `https://ecosystem.hubspot.com/marketplace/listing/proposify`

Leave empty if you only pick a category. **Ignored** when Mode is Full catalog.

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

Optional, Search mode only. Leave **None** if you already typed a query. Listings outside this category are skipped after HubSpot returns them. **Ignored** when Mode is Full catalog.

## `maxPartners` (type: `integer`):

**Global** cap of unique vendor rows (one company, many apps). Default **20** keeps first runs cheap. Keyword mode: up to **2,000**. Full catalog (paid): up to **5,000**.

## `requireEmail` (type: `string`):

**Yes (default):** skip vendors with no public support or named-contact email. **No:** also keep vendors with only a website.

## `excludeHubspotBuilt` (type: `string`):

**Yes (default):** keep independent app partners only (Gmail / Calendar by HubSpot are dropped). **No:** include HubSpot-built listings.

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

Skip vendors whose apps total fewer installs than this. **0** = no floor.

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

Optional. Direct HTTP is enough for the public marketplace. Enable Apify Proxy only if you get blocked.

## `minDelayMs` (type: `integer`):

Minimum pause between every HTTP request.

## `maxRequestRetries` (type: `integer`):

Retries on block / 5xx, rotating the proxy session when a proxy is configured.

## Actor input object example

```json
{
  "coverage": "search",
  "query": "sms",
  "category": "",
  "maxPartners": 20,
  "requireEmail": "yes",
  "excludeHubspotBuilt": "yes",
  "minInstalls": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "minDelayMs": 250,
  "maxRequestRetries": 5
}
```

# Actor output Schema

## `overview` (type: `string`):

Who scales: outreach person, tier, installs, HubSpot hubs

## `outreach` (type: `string`):

Named person and inbox for a first co-sell email

## `publisher` (type: `string`):

Tier, tenure, HubSpot objects and public pricing

## `dataset` (type: `string`):

All partner rows

## `output` (type: `string`):

Partners scraped, listings fetched, filters

## `runLog` (type: `string`):

Live progress

# 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 = {
    "query": "sms"
};

// Run the Actor and wait for it to finish
const run = await client.actor("corent1robert/hubspot-marketplace-app-partners").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 = { "query": "sms" }

# Run the Actor and wait for it to finish
run = client.actor("corent1robert/hubspot-marketplace-app-partners").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 '{
  "query": "sms"
}' |
apify call corent1robert/hubspot-marketplace-app-partners --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,corent1robert/hubspot-marketplace-app-partners"
        }
    }
}

```

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/C5B26fz0wAuPjO4R5/builds/M8T73nR2kAaPnL1fp/openapi.json
