# Klaviyo Partners · Agency Emails from Their Sites (`corent1robert/klaviyo-partner-directory-agency-contacts`) Actor

Export unique Klaviyo partner agencies with a public email from their website. One agency per row: inbox, phone, site, partner tier, HQ. Klaviyo does not list emails on the profile — we read the company site when they publish them. No login.

- **URL**: https://apify.com/corent1robert/klaviyo-partner-directory-agency-contacts.md
- **Developed by:** [Corentin Robert](https://apify.com/corent1robert) (community)
- **Categories:** Lead generation, E-commerce, Marketing
- **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 klaviyo partner agencies

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/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

## Klaviyo Partners · Agency Emails from Their Sites

Export **unique Klaviyo partner agencies** with a **public email and phone from their company website** — **one agency per row**, not one row per badge.

**No login. No Klaviyo API key. No partner dashboard.**

### What does Klaviyo Partner Emails do?

This Actor builds an **outreach / partnership file** from the public [Klaviyo Partner Directory](https://connect.klaviyo.com). You are not here to dump every filter tag. You want the agencies already listed as Klaviyo partners: **who to email**, **which site they run**, **which partner tier**.

Klaviyo **does not list agency emails** on the profile (`supportEmail` is almost always empty). Each row is that file when the agency publishes it on **their own site**:

- **Public inbox** (`mailto:` or email in the page) from the homepage and contact / legal pages
- **Phone** when they publish a `tel:` link
- **Website, domain, partner tier, HQ, directory URL, ecommerce platforms**

Empty `developerEmail` means the agency did not publish an inbox (form / chat only) or the site refused the visit — not a guessed `john@agency.com`. Two directory URLs for the same company stay **one lead**.

### Who is this for?

| You are… | Typical goal | Suggested setup |
|----------|--------------|-----------------|
| Shopify / Klaviyo app founder | Agencies that already sell Klaviyo | Search `shopify`, Find public emails **On** |
| Email/SMS SaaS SDR | Partner-tier agencies in the US | Country **United States**, cap 20, **Outreach** view |
| Agency recruiter / roll-up | Platinum / Elite shops | Partner tier **Platinum** |
| Outbound / Clay ops | Domain + inbox for CRM | Filter `contactStatus` = `email` |
| Market research | Full public directory | Mode **Full directory** (paid); emails Off if you only need domains |

**What you get by default:** unique agency, **public email when the company site lists one**, phone when listed, website, partner tier, HQ. Keep Find public emails **On**.

**Typical fill (public directory slice, 8 agencies, Aug 2026):** **6 / 8** rows had a public inbox from the site (e.g. `hello@2xcd.com`, `hello@1r.agency`, `info@58clicks.com`); **3 / 8** had a phone; **0 / 8** had a directory inbox. Two sites refused the visit (`crawl_failed`). Filter on `contactStatus` = `email` before you import a sequencer.

`website_only` only appears when Find public emails is **Off**. After a site visit with no mailbox the status is `no_contact`, not `website_only`.

### How to use

1. Open this Actor in Apify Console.
2. **Step 1 — Mode:** leave **Search** (a niche or a pasted partner URL) or switch to **Full directory** (every unique agency, paid).
3. **Step 2 — Search:** type `shopify`, pick a country / tier, or paste a partner URL from connect.klaviyo.com.
4. Keep **Find public emails** **On**. Leave **Max agencies** at 20 for a first run, then raise it (Search up to 2,000; Full directory up to 5,000).
5. Click **Start**. Download JSON / CSV / Excel. **Outreach** = first email. **Overview** = email + HQ + website. **Qualify** = tier, platforms, clients.

In Search mode you can start with empty filters: the Actor takes the next agencies from the public directory, still capped. Full directory is a paid-scale job (~600 public partner profiles).

### Ready-made Console tasks

| Example | Best for |
|---------|----------|
| [Unique US Klaviyo partner agencies with emails](https://console.apify.com/actors/tasks/eFY1Kg9i1ZdEzmWgP) | US country filter, Outreach view |
| [Shopify Klaviyo partner agencies](https://console.apify.com/actors/tasks/oII3D022842bZxnDw) | Keyword `shopify`, Overview view |
| [Platinum Klaviyo partner agencies](https://console.apify.com/actors/tasks/xYshcpcwRy7Ls7a9K) | Platinum badge, Qualify view |
| [Refresh one partner from a URL](https://console.apify.com/actors/tasks/PlEuNLkFpgZcet4Bb) | Paste one partner URL |

When this Actor is Store-public, the same four tasks can land on the **Examples** tab.

### What it extracts

| Field | Why it matters |
|-------|----------------|
| `developerEmail`, `emails`, `emailSource` | Public inbox from the **company site** (`publisher-website`). Directory inbox (`directory-profile`) when Klaviyo actually lists one — rare. |
| `phone`, `phones` | Public `tel:` on the agency site |
| `contactStatus` | Filter: `email` / `email_and_phone` vs `no_contact` vs `crawl_failed`. `website_only` = Find public emails Off |
| `publisherName`, `website`, `websiteDomain`, `hqLocation`, `country` | Company + clean host + HQ for CRM match |
| `partnerTierLabel`, `platformsLabel`, `badgesLabel`, `clients` | Partner badge + ecommerce platforms (Shopify, Magento, …) |
| `listingUrl`, `contactUrl`, `websiteFetchUrl`, `scrapedAt` | Directory page + which site page produced an inbox |

Not extracted (and not invented): Klaviyo login emails, guessed `firstname@domain` patterns, partner-dashboard contacts, review text, or every directory filter tag (region / GMV / industry). `platformsLabel` is ecommerce platforms only.

### How it works

1. Read unique partner agencies from the public directory (name, website, tier, HQ).
2. Klaviyo almost never lists an inbox on the profile.
3. If Find public emails is On, open the company site (homepage + contact pages).
4. Write unique agencies as they become complete — inbox when they published one.

### Input

```json
{
  "coverage": "search",
  "query": "shopify",
  "country": "United States",
  "minTier": "",
  "maxPartners": 20,
  "websiteEnrichment": "yes"
}
```

Partner URL:

```json
{
  "coverage": "search",
  "query": "https://connect.klaviyo.com/partner/fuel-made",
  "maxPartners": 1,
  "websiteEnrichment": "yes"
}
```

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `coverage` | String | `search` | `search` or `catalog` (full directory, paid) |
| `query` | String | — | Keyword or partner URL from the directory |
| `country` | String | Any | Directory location filter |
| `minTier` | String | Any | `platinum` · `elite` · `gold` |
| `maxPartners` | Integer | `20` | Unique agency cap. `0` = no extra cap (timeout and listing breadth still apply) |
| `websiteEnrichment` | String | `yes` | **On:** public inbox from the company website. **Off:** directory fields only |
| `websiteEmailMaxPages` | Integer | `5` | API-only. Homepage plus same-origin contact pages (1–8) |
| `verboseLogs` | Boolean | `false` | API-only. Extra debug lines in the run log |
| `proxyConfiguration` | Object | platform default | API-only. Cloud runs use Apify datacenter proxy when omitted |

### Output example

Transformed values from a public run (Find public emails **On**). Inbox came from the company site, not the Klaviyo profile.

```json
{
  "publisherName": "2x Conversion Design",
  "website": "https://2xcd.com",
  "websiteDomain": "2xcd.com",
  "developerEmail": "hello@2xcd.com",
  "phone": null,
  "contactStatus": "email",
  "emailSource": "publisher-website",
  "websiteFetchUrl": "https://2x.agency/",
  "partnerTierLabel": "Silver Master",
  "country": "Canada",
  "hqLocation": "Vancouver, British Columbia, Canada",
  "platformsLabel": "Shopify, BigCommerce, WooCommerce",
  "listingUrl": "https://connect.klaviyo.com/partner/2x-conversion-design"
}
```

Download in JSON, CSV, Excel, or HTML from the Dataset tab.

### How much does it cost to scrape Klaviyo partners?

Pay-per-event on unique **agencies**, not directory badges. HTTP-only — no browser. **Actor start is $0.00005**. You pay one **partner-row** per unique agency written. When Find public emails is On **and** the directory inbox or phone is missing (almost always), you also pay one **website-crawl** per site fetched.

**Free plan:** a run is meant for a **20-agency try**. Search: paid plans can raise Max agencies up to **2,000**. **Full directory** (paid) walks every public partner (~600 unique agencies).

| | Free | Bronze | Silver | Gold | Platinum | Diamond |
|--|------|--------|--------|------|----------|---------|
| Per unique agency | $0.002 | $0.0018 | $0.0016 | $0.0014 | $0.0012 | $0.001 |
| Per website crawl (inbox or phone missing) | $0.0015 | $0.0014 | $0.0013 | $0.0012 | $0.0011 | $0.001 |
| 20 agencies, directory only | **$0.04** | $0.04 | $0.03 | $0.03 | $0.02 | $0.02 |
| 20 agencies + 20 site fetches | **$0.07** | $0.06 | $0.06 | $0.05 | $0.05 | $0.04 |
| 1,000 agencies, directory only | **$2.00** | $1.80 | $1.60 | $1.40 | $1.20 | $1.00 |
| 1,000 agencies + 1,000 site fetches | **$3.50** | $3.20 | $2.90 | $2.60 | $2.30 | $2.00 |

Totals include the $0.00005 start. Two URLs for the same agency are **one charge**. A row with an empty email still counts — the agency was scraped; they did not publish an inbox.

Compute stays low (512 MB HTTP). No residential proxy required for directory profiles.

### Is scraping the Klaviyo Partner Directory free?

A 20-agency try on the Free plan is a few cents (pay-per-event). Compute is HTTP-only. Full directory plus website crawl is billed per unique agency and per site fetch, as in the table above — not “unlimited free export.”

### Is it legal to scrape the Klaviyo Partner Directory?

This Actor only accesses data that Klaviyo makes publicly available on [connect.klaviyo.com](https://connect.klaviyo.com) (name, website, tier, HQ) and, when Find public emails is On, data the **agency chose to show** on their own public website. As with any file that contains personal or business contact data, make sure your use complies with GDPR and similar rules. See [Apify on the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Limitations

- Directory native email coverage is near **zero**. The inbox comes from the **company website**, same as the Zapier publisher Actor.
- Placeholder and demo inboxes (e.g. `you@yourstore.com`) are discarded.
- Not every site publishes an email: form-only → `no_contact`; blocked host → `crawl_failed`.
- Dataset order may follow completion order when website crawl runs in parallel.
- The public listing size can change; Full directory is bounded by what Klaviyo publishes, plus your max agencies / timeout.

### FAQ

**Do I get one row per badge or service tag?** No. One agency = one row.

**Where do emails come from?** Almost never the Klaviyo profile. With Find public emails **On**, from the company website (`emailSource` = `publisher-website`) when they publish a public inbox. Same pattern as [Zapier App Directory · Developer Contacts](https://apify.com/corent1robert/zapier-app-directory-developer-contacts).

**Does Full directory work on the free Apify plan?** No. Use Search with a keyword, country, or partner URL.

### Local development

```bash
npm install
cp .actor/INPUT.json storage/key_value_stores/default/INPUT.json
apify run --purge
```

`apify run` validates `storage/key_value_stores/default/INPUT.json` against the input schema. Use `--input-file=./input.json` to force the repo-root preset (CLI input overwrites overlapping keys if you merge in code). Local `storage/` is not uploaded to Apify Console.

```bash
npm test
```

### Also available

**[Zapier App Directory · Developer Contacts](https://apify.com/corent1robert/zapier-app-directory-developer-contacts)** — unique Zapier publishers; inbox from the company site.\
**[Atlassian Marketplace · Unique Vendor Emails](https://apify.com/corent1robert/atlassian-marketplace-vendor-contacts)** — unique publishers with native Marketplace email.\
**[Salesforce AppExchange · Partner Emails](https://apify.com/corent1robert/salesforce-appexchange-vendor-contacts)** — unique ISVs, listing email then company website.\
**[Slack Marketplace · Developer Emails](https://apify.com/corent1robert/slack-app-directory-developer-contacts)** — unique Slack app publishers.

### Support

Questions, custom directory slices, or CRM mapping: <corentin@outreacher.fr> or the Issues tab on the Actor page.

Ready? Mode **Search**, Find public emails **On**, click **Start**.

# Actor input Schema

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

**Search (default):** optional keyword, partner URL, country and/or tier. Stops at Max agencies.

**Full directory (paid):** walks every public partner profile. Leave the keyword empty — country and tier still apply. Free Apify plans cannot use Full directory.

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

Examples: `shopify` · `retention` · paste `https://connect.klaviyo.com/partner/fuel-made`.

Leave empty to take the next agencies from the public directory (still capped). **Ignored** for keywords when Mode is Full directory — a pasted partner URL still works.

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

Optional. Keep agencies that list this country on the directory profile.

## `minTier` (type: `string`):

Optional. Keep agencies whose public badge includes this word (Platinum, Elite, Gold).

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

**Global** cap of unique agency rows. Default **20**. Search: up to **2,000**. Full directory (paid): up to **5,000**. **0** = no extra cap besides your paid plan.

## `websiteEnrichment` (type: `string`):

**On (recommended):** open the company website for a public inbox / phone. Klaviyo partner profiles almost never list an email.

**Off:** directory fields only (name, site, tier, HQ) — cheaper if you already enrich domains in Clay.

## `websiteEmailMaxPages` (type: `integer`):

Homepage plus same-origin contact/legal pages when Find public emails is On.

## `verboseLogs` (type: `boolean`):

Add debug lines to the run log.

## Actor input object example

```json
{
  "coverage": "search",
  "country": "",
  "minTier": "",
  "maxPartners": 20,
  "websiteEnrichment": "yes",
  "websiteEmailMaxPages": 5,
  "verboseLogs": false
}
```

# Actor output Schema

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

Inbox (usually from the company site), phone, website, HQ, partner tier

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

First public inbox from the agency website plus listing URL

## `qualify` (type: `string`):

Partner tier, platforms, location, featured

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

All agency rows

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

Agencies scraped and 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("corent1robert/klaviyo-partner-directory-agency-contacts").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("corent1robert/klaviyo-partner-directory-agency-contacts").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 '{}' |
apify call corent1robert/klaviyo-partner-directory-agency-contacts --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,corent1robert/klaviyo-partner-directory-agency-contacts"
        }
    }
}

```

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/v3o1YXfEnL68yxr7h/builds/V1Dg2jdWlwlUFgQdw/openapi.json
