# Company Contact Details Extractor - Emails and Phone (`mambalabs/company-contact-details-extractor`) Actor

Finds a company contact page from its domain and returns role email addresses, a main phone number and a postal address in one flat row. Role addresses only, never a named individual. Clay ready, one row per company.

- **URL**: https://apify.com/mambalabs/company-contact-details-extractor.md
- **Developed by:** [Mamba Labs](https://apify.com/mambalabs) (community)
- **Categories:** Lead generation, Automation, SEO tools
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.45 / 1,000 company checkeds

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

### 🔎 What can Company Contact Details Extractor do?

Give it a company domain. It finds that company's contact page, then returns the role email addresses on it, a main phone number and a postal address, in one flat row per company.

Role addresses only: `info@`, `support@`, `sales@`, `privacy@` and their equivalents. A named individual's address is never extracted, by design and not by accident.

| 📦 What you get | ⚙️ Features and integrations |
|---|---|
| 📧 **Role email addresses**, never a named individual<br>☎️ **Main phone number** and postal address when published<br>🔗 **Contact page URL** and how it was found<br>🧾 **25 flat fields**, `snake_case`, one row per company | 🛡️ **Role addresses only by construction**, a privacy safe default<br>🧮 **Rejection accounting**, `emails_rejected_reasons` says what was dropped and why<br>📊 **Coverage per row**, so a thin read is visible<br>⬇️ **Export** to JSON, CSV, Excel, HTML or XML |

Bought by outbound teams that need a deliverable role inbox, procurement and vendor onboarding teams, and anyone building a supplier contact sheet from a domain list.

> 🚫 **This is not a people finder and it never returns a personal email address.** It returns role mailboxes such as `info@`, `sales@` and `support@`. If you need a named person's work email, that is the Work Email Waterfall Finder, and it is a different product with different obligations.

### 💡 Why use Company Contact Details Extractor?

**Every address is checked against your domain.** A contact page carries the company's addresses and also its hosting provider's, its cookie vendor's and, on a badly built site, its web agency's. A generic email scraper hands you all of them and you clean the list. This one keeps only addresses whose domain is the company's, and tells you on the row how many it dropped and why.

**The addresses are classified, not piled up.** `email_sales` and `email_support` are separate columns, so a sequence that should go to sales does not go to the support desk.

**It finds the page properly.** Most contact extractors guess `/contact` and give up. The page location here reads the company's own link graph first and guesses last, in that order, because guessing is what produces most of the misses.

**Named individuals are never returned.** If you need people, that is a different actor with a different consent posture. This one returns company contact points.

#### 🧭 Four routes to the contact page, strongest first

1. **The homepage link graph.** The company's own navigation, in eleven languages, so `Kontakt` and `Contatti` are found as readily as `Contact`.
2. **The footer specifically**, which is where contact, legal and imprint links conventionally live.
3. **The sitemap**, matched on the URL slug.
4. **Three conventional paths**, last, and scored as the weak method it is.

The row records which route answered in `contact_page_method` and how much that route is worth in `contact_page_confidence`. Confidence is set per method and never blended, so a 0.55 and a 0.88 mean two genuinely different things rather than one averaged one.

### 📋 What data can Company Contact Details Extractor extract?

Every row carries **25 flat fields**. These are the ones a buyer
actually filters and sorts on.

| Field | Type | Meaning |
|---|---|---|
| `degraded` | boolean | True when this row could not be produced normally, for example the company site was unreachable and no discovery could run. A degraded row is never charged. |
| `degradation_reason` | string | null | Why the row is degraded, in plain words. Null on a normal row. |
| `company_domain` | string | null | The company domain this row is about, normalized. Null when only a handle or a name was supplied. This is the join key across the whole Mamba Labs fleet. |
| `company_name` | string | null | The company name as supplied or derived. Improves search accuracy and is what the identity gate matches against. |
| `contact_page_url` | string | null | The located contact page. Null when the site has no contact page reachable from its own link graph, its sitemap or the three conventional paths, which is a real answer and not an error. |
| `contact_page_method` | string | null | How the page was located: homepage\_anchor, footer\_anchor, sitemap or path\_guess, strongest first. A path\_guess found a page at a conventional URL and nothing on that page confirmed what it is, so filter on this if a wrong page would be expensive for you. |
| `contact_page_confidence` | number | null | Confidence in the located page, 0 to 1, set per method and never blended across methods. A link the company itself labelled Contact scores 0.88; a URL that simply answered 200 scores 0.55. |
| `email_general` | string | null | The general enquiries role address, for example info@ or hello@. Null when no address of this class was found and kept. |
| `email_support` | string | null | The customer support role address, for example support@ or help@. |
| `email_sales` | string | null | The sales or partnerships role address, for example sales@ or partnerships@. |
| `email_privacy` | string | null | The privacy, data protection or legal role address, for example privacy@ or dpo@. Often the only address a large company publishes, because regulation requires it. |
| `emails_found_count` | integer | null | How many distinct addresses were seen on the pages read, before any gate was applied. Zero is a real answer. |
| `emails_rejected_count` | integer | null | How many of those addresses were dropped by the gates. A row that found eleven addresses and kept none is a completely different fact from a row that found none, and this column is what tells them apart. |
| `emails_rejected_reasons` | string | null | Why addresses were dropped, as counts: foreign\_domain (the address belongs to another company), free\_mail (a gmail or outlook address, which cannot be checked against your domain), not\_a\_role\_address (a named individual, never extracted by this actor), never\_keep (a no-reply or postmaster mailbox). Comma separated. |
| `phone_main` | string | null | The company main phone number in E.164 form where the country could be resolved. Null when no number was published or when it is only present inside an image. |
| `phone_source` | string | null | Where the number came from: a JSON-LD organization node, a tel: link or the page text, strongest first. A number scraped out of body text is the weakest of the three. |
| `address_line` | string | null | Street address as published. Null when the company publishes no postal address, which is normal for a remote first company. |
| `address_city` | string | null | City or locality. |
| `address_country` | string | null | Country as published, which may be a name or a two letter code depending on the source. |
| `address_source` | string | null | jsonld when the address came from a schema.org PostalAddress node, which is authoritative because the company published it as structured data, or footer when it was parsed out of footer text, which is noisy and is marked as such. |
| `contact_form_url` | string | null | A form on the contact page carrying both a message field and an email field. Newsletter signups, search boxes and login forms are excluded by name, because none of them is a way to contact the company. |
| `pages_read` | integer | null | How many pages were fetched for this company, including the homepage. Useful for reconciling a thin row against what it cost. |
| `coverage` | number | null | How much of what this actor can return actually came back on this row, from 0 to 1. Computed over this actor value fields only, never over the identity or status columns. Null on a degraded row, where nothing was attempted. This is a reporting field: nothing is dropped for low coverage and no event fires on it. |
| `fetch_status` | string | ok, not\_found, not\_extractable, blocked, identity\_mismatch, auth\_failed or skipped. Read this before reading any value on the row. not\_found means we looked and there is nothing there; blocked and not\_extractable mean we could not look, and they must never be read as an absence. |
| `run_date` | string | ISO 8601 timestamp of this run. Social counts move, so a row without a date is a number with no shelf life. |

> ⚠️ **How to read these values.** `emails_rejected_reasons` is the field to read when a row looks thin. `not_a_role_address=4` means the page carried four individual people's addresses and this actor deliberately did not return them.

### 🛠️ How to get a company contact email from a domain

1. Put a company domain in `company_domain`. That is the whole setup.
2. Leave `emailTypes` on `all` unless you want one class, for example `privacy` for a data protection contact sweep.
3. Set `allowFreeMailboxes` to `true` for small business or local company lists, where a gmail address on the contact page is often the real one.
4. For a list, pass an array of objects with the same fields.

#### 🧪 Using it in Clay

Add an **Enrichment > Apify** column, pick this actor, and map `company_domain` to your domain column. Every output field arrives as its own flat column, snake\_case, no nesting.

A useful pattern: run it only on rows where your ICP filter already passed, and use `email_sales` as the fallback when your people level waterfall returns nothing. A role address is a worse target than a named person and a much better one than an empty cell.

### 💵 How much does it cost?

Pay per event. You are charged for output, never for input.

| Event | Fires when | Price |
|---|---|---|
| `company-checked` | Once per company for which the contact page search completed and a non degraded row was produced, whether or not anything was found. A not\_found row fires this event, because looking and finding nothing is a real answer and it is the work you asked for. A degraded row, where the lookup could not run at all, fires nothing. | $0.0035 |
| `contact-page-found` | Once per company where a contact page was located and fetched. Does not fire when no contact page exists on the site, and does not fire when a page was located but could not be read. | $0.0025 |
| `email-extracted` | Once per DISTINCT classified role address kept on the row, so a company with a general and a support address fires it twice and a company with none fires it zero times. Addresses dropped by the domain gate or the role gate never charge: the work happened and the honest answer is that there is no address we can vouch for. | $0.0030 |

> 💳 **What you are billed for.** `email-extracted` fires once per address KEPT, so a company with two role addresses costs two of that event and a company with none costs zero. Addresses dropped by the gates never charge.
>
> A company whose site could not be read at all produces a degraded row and charges nothing.

**What the same coverage costs bought a la carte:** The Store carries generic email scrapers priced per page or per result and none of them classifies an address by role or gates it on the company domain, so a buyer running one gets a list that mixes the company, its vendors and its staff and has to clean it. `page-finder-extractor` locates a page but does not extract contacts. There is no like for like actor that takes a domain and returns classified role contact points, which is the whole reason this exists.

### ⌨️ Input

| Field | Type | Required | Meaning |
|---|---|---|---|
| `company_domain` | string | no | Bare company domain, for example stripe.com. This is the only required input and it is the join key for every other actor in the fleet. |
| `company_name` | string | no | Optional. Used in the row and in logging. This actor gates addresses on the email DOMAIN rather than on the company name, so supplying a name does not change which addresses are kept. |
| `emailTypes` | string | no | Which classes of role address to return. "all" (default) returns general, support, sales and privacy. The narrower settings return only what they name and leave the other columns null, which is a different answer from not finding one. Sent as a string for Clay compatibility. |
| `includePhones` | string | no | When "true" (default) the contact page is scanned for a main phone number. Set "false" to skip phone extraction entirely, which leaves the phone columns null. Sent as a string for Clay compatibility. |
| `includeAddress` | string | no | When "true" (default) a postal address is read from JSON-LD first and from the footer second. Set "false" to skip it. Sent as a string for Clay compatibility. |
| `allowFreeMailboxes` | string | no | When "false" (default) an address at gmail, outlook or another free provider is rejected, because it cannot be checked against the company domain. Set "true" for small business and local company lists, where a free mailbox on the contact page is often the real contact point. Sent as a string for Clay compatibility. |
| `crawlDepth` | string | no | How many pages to read after the homepage. "1" (default) reads the contact page. "2" also reads a support or legal page when the contact page yielded nothing. This is a cost and thoroughness dial, not a change of answer. Sent as a string for Clay compatibility. |
| `skipCache` | string | no | When "false" (default) a successful lookup is cached for seven days and reused, which costs you nothing on a repeated run. Set "true" to force a fresh fetch. Sent as a string for Clay compatibility. |

```json
{
  "company_domain": "stripe.com",
  "company_name": "Stripe",
  "emailTypes": "all",
  "includePhones": "true",
  "includeAddress": "true"
}
```

### 📤 Output

Exports to **JSON, CSV, Excel, HTML or XML**. One flat, snake\_case row per
company. No nested objects, so it drops straight into Clay, a spreadsheet or a
warehouse table without a flattening step.

```json
{
  "degraded": false,
  "degradation_reason": null,
  "company_domain": "stripe.com",
  "company_name": "Stripe",
  "contact_page_url": "https://stripe.com/contact/sales",
  "contact_page_method": "footer_anchor",
  "contact_page_confidence": 0.85,
  "email_general": null,
  "email_support": null,
  "email_sales": "sales@stripe.com",
  "email_privacy": null,
  "emails_found_count": 7,
  "emails_rejected_count": 6,
  "emails_rejected_reasons": "foreign_domain=5, not_a_role_address=1",
  "phone_main": null,
  "phone_source": null,
  "address_line": null,
  "address_city": null,
  "address_country": null,
  "address_source": null,
  "contact_form_url": null,
  "pages_read": 2,
  "coverage": 0.2,
  "fetch_status": "ok",
  "run_date": "2026-08-22T19:23:48.675Z"
}
```

#### false versus null, and why the difference matters

`false` means we looked and the answer is no. `null` means we could not look,
or the platform withheld it. They are never interchangeable in this output. If
you filter for companies with no presence on this platform, filter on `false`,
because `null` rows are unknown rather than absent and including them will
overstate your list.

### 💡 Tips

- **Read `emails_rejected_reasons` before concluding a site publishes nothing.** It usually publishes plenty and the addresses belong to people rather than roles.
- **`email_privacy` has the highest hit rate on large companies**, because regulation makes them publish it. If you need any address at all for a big enterprise, that is usually the one that exists.
- **Turn `allowFreeMailboxes` on for local business lists** and leave it off for B2B software.
- **`crawlDepth: 2` is worth it on sites with no contact page**, where the legal or imprint page carries the address instead. It costs one more fetch.

### ⚠️ Known limits

- **Obfuscated addresses are invisible.** An address rendered as an image, assembled in JavaScript, or written as `info [at] example.com` cannot be read by any static extractor. The row reports `not_extractable` rather than `not_found` when obfuscation was detected, because the two mean different things.
- **Named individuals are not returned and this is not configurable.** There is no setting that turns it on.
- **No team pages are walked.** Discovery goes to the contact page, and optionally a support or legal page. It never crawls a people directory.
- **A phone number inside an image is invisible**, for the same reason an email inside an image is.
- **Footer parsed addresses are noisy.** `address_source` says whether the address came from structured data or from footer text, and only the first is authoritative.

### ❓ FAQ

**Will this give me a decision maker's email?**
No. It returns company role addresses only. A named individual's address is dropped by the role gate whether or not you want it.

**Why is `emails_found_count` six and every email column null?**
Because all six failed a gate. Read `emails_rejected_reasons`: the usual answer is that they were individuals' addresses or belonged to another domain.

**Does it need a proxy or an API key?**
Neither. It reads the company's own public pages.

**What is the difference between a null email column and `fetch_status: "not_extractable"`?**
A null column means that class of address was not found. `not_extractable` on the row means the page was read but its addresses are obfuscated and no static extractor can see them.

**Is this GDPR safe?**
It extracts company contact points, which is what a company publishes a contact page for. It does not extract personal data about named individuals, and it will not do so on request. Your own use of the output is still yours to justify.

### 🧩 Want other GTM data?

Mamba Labs builds a fleet of GTM enrichment actors that share one flat,
Clay-ready output convention, so their rows join on `company_domain` with no
cleaning step:

| | |
|---|---|
| 🕵️ [Agent Accessibility Auditor](https://apify.com/mambalabs/agent-accessibility-auditor) | 🤖 [AI Tooling Detector](https://apify.com/mambalabs/ai-tooling-detector) |
| 📡 [B2B Buying Signals Aggregator](https://apify.com/mambalabs/b2b-buying-signals-hiring-tech-stack-intent-for-clay) | 🚀 [Prospect Engine](https://apify.com/mambalabs/b2b-prospect-engine) |
| 📝 [Publishing Frequency Tracker](https://apify.com/mambalabs/blog-publishing-frequency) | ⏩ [Sequencer Lead Push](https://apify.com/mambalabs/clay-to-instantly-smartlead-push) |
| 🔄 [Company Change-Event Feed](https://apify.com/mambalabs/company-change-event-feed) | 🧭 [Company Discovery List Builder](https://apify.com/mambalabs/company-discovery-list-builder) |
| 🏢 [Company Firmographic Enricher](https://apify.com/mambalabs/company-firmographic-enricher) | 🪪 [Company Identity Resolver](https://apify.com/mambalabs/company-identity-resolver) |
| 🌐 [Company Social Presence Mapper](https://apify.com/mambalabs/company-social-presence-mapper) | 🏷️ [Contact Classifier](https://apify.com/mambalabs/contact-classifier) |
| 📬 [Domain Deliverability Checker](https://apify.com/mambalabs/domain-deliverability-checker) | 🔗 [Domain to LinkedIn URL Resolver](https://apify.com/mambalabs/domain-to-linkedin-url-resolver) |
| ✉️ [Work Email Waterfall Finder](https://apify.com/mambalabs/email-waterfall-orchestrator) | 🎪 [Event Presence Index](https://apify.com/mambalabs/event-presence-index) |
| 💰 [Funding and Press Signal Scanner](https://apify.com/mambalabs/funding-press-signal-scanner) | 🧑‍💼 [GTM Hiring Signal Scraper](https://apify.com/mambalabs/gtm-hiring-signal-scraper) |
| 📋 [Job Posting Monitor](https://apify.com/mambalabs/gtm-job-discovery) | 🧱 [Tech Stack Detector](https://apify.com/mambalabs/gtm-tech-stack-signal-scraper) |
| 🎯 [ICP Fit Scorer](https://apify.com/mambalabs/icp-account-lead-scoring-fit-scorer-0-100-for-clay) | 🔑 [Job Board Keyword Scanner](https://apify.com/mambalabs/job-board-keyword-signal-scanner) |
| ⚖️ [Legal Entity Resolver](https://apify.com/mambalabs/legal-entity-resolver) | 💼 [LinkedIn Company Page Mapper](https://apify.com/mambalabs/linkedin-company-presence-mapper) |
| 💬 [LinkedIn Post Tracker and Comment Capture](https://apify.com/mambalabs/linkedin-post-engager-capture) | 📸 [Instagram and Facebook Brand Mapper](https://apify.com/mambalabs/meta-brand-presence-mapper) |
| 📮 [Outbound Stack Detector](https://apify.com/mambalabs/outbound-infrastructure-fingerprint) | 📄 [Page Finder and Extractor](https://apify.com/mambalabs/page-finder-extractor) |
| 👤 [People Finder and Email Verifier](https://apify.com/mambalabs/people-finder) | 📌 [Pinterest Brand Presence Mapper](https://apify.com/mambalabs/pinterest-brand-presence-mapper) |
| 🏛️ [Government Contract Award Monitor](https://apify.com/mambalabs/public-award-monitor) | 📅 [Public Company Reporting Window Finder](https://apify.com/mambalabs/public-company-reporting-window-finder) |
| 👥 [Team Page People Extractor](https://apify.com/mambalabs/team-page-people-extractor) | 🎵 [TikTok Brand Presence Mapper](https://apify.com/mambalabs/tiktok-brand-presence-mapper) |
| 🏅 [Workplace Program Detector](https://apify.com/mambalabs/workplace-program-detector) | ▶️ [YouTube Channel Stats Extractor](https://apify.com/mambalabs/youtube-channel-transcript-extractor) |

> Every actor in the suite takes a domain or a company and returns one flat row,
> so they stack in the same Clay table without reshaping anything.

> 🛠️ **Need something custom built for you or your team?** Tell us what you are
> trying to find and we will build it. [Talk to Mamba Labs](https://mambabuilt.com/contact).

### 🆘 Support

Issues, field requests and bug reports: open an issue on the actor's Issues tab.
Mamba Labs reads every one.

> ℹ️ **Sourcing and legal.** Every field is read from pages the company publishes on its own website, with `robots.txt` honored. Only role addresses are kept and named individual addresses are rejected by construction, which `emails_rejected_reasons` records. You remain responsible for compliance with applicable marketing and data protection law.

Built by [Mamba Labs](https://apify.com/mambalabs).

# Actor input Schema

## `company_domain` (type: `string`):

Bare company domain, for example stripe.com. This is the only required input and it is the join key for every other actor in the fleet.

## `company_name` (type: `string`):

Optional. Used in the row and in logging. This actor gates addresses on the email DOMAIN rather than on the company name, so supplying a name does not change which addresses are kept.

## `emailTypes` (type: `string`):

Which classes of role address to return. "all" (default) returns general, support, sales and privacy. The narrower settings return only what they name and leave the other columns null, which is a different answer from not finding one. Sent as a string for Clay compatibility.

## `includePhones` (type: `string`):

When "true" (default) the contact page is scanned for a main phone number. Set "false" to skip phone extraction entirely, which leaves the phone columns null. Sent as a string for Clay compatibility.

## `includeAddress` (type: `string`):

When "true" (default) a postal address is read from JSON-LD first and from the footer second. Set "false" to skip it. Sent as a string for Clay compatibility.

## `allowFreeMailboxes` (type: `string`):

When "false" (default) an address at gmail, outlook or another free provider is rejected, because it cannot be checked against the company domain. Set "true" for small business and local company lists, where a free mailbox on the contact page is often the real contact point. Sent as a string for Clay compatibility.

## `crawlDepth` (type: `string`):

How many pages to read after the homepage. "1" (default) reads the contact page. "2" also reads a support or legal page when the contact page yielded nothing. This is a cost and thoroughness dial, not a change of answer. Sent as a string for Clay compatibility.

## `skipCache` (type: `string`):

When "false" (default) a successful lookup is cached for seven days and reused, which costs you nothing on a repeated run. Set "true" to force a fresh fetch. Sent as a string for Clay compatibility.

## `source_tag` (type: `string`):

Internal attribution tag set by Mamba Labs on published task examples. Not required, and nothing depends on it. Leave it empty.

## Actor input object example

```json
{
  "company_domain": "stripe.com",
  "company_name": "Stripe",
  "emailTypes": "all",
  "includePhones": "true",
  "includeAddress": "true",
  "allowFreeMailboxes": "false",
  "crawlDepth": "1",
  "skipCache": "false"
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset of one flat row per company, with per platform status so a blocked fetch never reads as a zero.

# 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 = {
    "company_domain": "stripe.com",
    "company_name": "Stripe"
};

// Run the Actor and wait for it to finish
const run = await client.actor("mambalabs/company-contact-details-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 = {
    "company_domain": "stripe.com",
    "company_name": "Stripe",
}

# Run the Actor and wait for it to finish
run = client.actor("mambalabs/company-contact-details-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 '{
  "company_domain": "stripe.com",
  "company_name": "Stripe"
}' |
apify call mambalabs/company-contact-details-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mambalabs/company-contact-details-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/4mMncKaJykiq94grz/builds/yMoXeSKOVEwK4yiuK/openapi.json
