# Company Data by Domain: Logo, Socials, Industry (`steady-scrape/company-profile-by-domain`) Actor

Turn a list of domains into company profiles: name, description, industry, logo, LinkedIn/X/Facebook/Instagram/YouTube/GitHub, generic emails and phone, address, founded year and tech hints. From each company's own website. No personal data.

- **URL**: https://apify.com/steady-scrape/company-profile-by-domain.md
- **Developed by:** [SteadyScrape](https://apify.com/steady-scrape) (community)
- **Categories:** Lead generation, Marketing, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 company profiles

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Company Data by Domain: Logo, Socials, Industry

Give it a list of **company domains or URLs** and get one clean **company profile per domain**: company name, description, **industry guess**, **logo and favicon**, **LinkedIn, X, Facebook, Instagram, YouTube, GitHub and TikTok** links, the **contact page**, **generic company emails** (info@, sales@, support@…), the **company phone**, postal **address**, **founded year** and **tech hints**. All of it is read from the company's own public website (schema.org data, OpenGraph and meta tags, the home, about and contact pages). **No personal data** and no LinkedIn scraping. **Price: $0.004 per company profile ($4 per 1,000). Domains that are unreachable, blocked, parked or empty are free.**

Made by **SteadyScrape (steady-scrape)**. Note: we are not the similarly named "steadyscrape" account on Apify.

### What you can do with it

1. **Enrich a CRM or lead list.** Paste the domains from a sign-up form, a trade-show list or a CSV export and get names, logos, industries and social links back to fill empty CRM fields.
2. **Clean up and route inbound sign-ups.** Turn `hello@acme-widgets.com` into the company `acme-widgets.com` and see its industry and LinkedIn page before your sales team picks it up. Emails are accepted as input and only the domain is used.
3. **Build logo walls and directories.** Get logo, favicon and share image URLs plus a short description for a partner page, a marketplace or an investor portfolio list.
4. **Find a company's official channels.** Get the brand's own LinkedIn company page, X account, Instagram and YouTube channel as linked from its site, not a guess from a search engine.
5. **Segment a market.** Group thousands of domains by industry guess, country and tech hints (Shopify, HubSpot, WordPress, Stripe…) before an outreach campaign.

### Input

- **Domains** (required): one per line. `stripe.com`, `https://www.stripe.com/pricing` and `info@stripe.com` all become `stripe.com`. Duplicates are removed and are free.
- **Pages per domain** (1–5, default 3): the home page plus the about and contact pages. 1 is fastest; 4–5 also tries the imprint and company pages (useful for European sites, where the address is often on the imprint).
- **Respect robots.txt** (default on): pages that robots.txt disallows are skipped.
- **Tech hints** (default on): technologies seen in the page and HTTP headers. It costs nothing extra.
- **Max concurrency** (default 20, up to 50) and an optional **Apify datacenter proxy** (off by default). You don't need a proxy for most sites. Residential proxies and custom proxy URLs are not supported.

Example:

```json
{
  "domains": ["stripe.com", "notion.so", "patagonia.com"],
  "maxPagesPerDomain": 3,
  "includeTechHints": true
}
```

### Output

One row per input domain, in input order. A record from a real run (October 2026), trimmed:

```json
{
  "domain": "shipbob.com",
  "status": "ok",
  "companyName": "ShipBob",
  "description": "Ecommerce fulfillment across all channels. ShipBob empowers businesses to scale, offer 2-day shipping, and manage inventory and shipments.",
  "industryGuess": "Logistics / Transportation",
  "industryConfidence": "high",
  "industryKeywords": ["shipping", "fulfillment", "warehouse", "supply chain"],
  "logoUrl": "https://www.shipbob.com/wp-content/themes/shipbob-2022/resources/images/gmp.svg",
  "faviconUrl": "https://www.shipbob.com/wp-content/themes/shipbob-2022/resources/icons/favicon.ico",
  "linkedinUrl": "https://www.linkedin.com/company/shipbob",
  "xUrl": "https://x.com/ShipBob",
  "facebookUrl": "https://www.facebook.com/LoveShipBob",
  "instagramUrl": "https://www.instagram.com/shipbob",
  "youtubeUrl": "https://www.youtube.com/channel/UCyKm9fpP6V9ns84rVClCvMw",
  "tiktokUrl": "https://www.tiktok.com/@shipbob.com",
  "emails": [],
  "phones": [],
  "contactPageUrl": "https://www.shipbob.com/contact/",
  "aboutPageUrl": "https://www.shipbob.com/about/",
  "foundedYear": 2014,
  "foundedSource": "https://www.shipbob.com/about/",
  "techHints": ["Cloudflare", "WordPress", "Google Tag Manager", "HubSpot", "VWO", "OneTrust", "Bootstrap"],
  "language": "en-US"
}
```

Other fields: `legalName`, `nameSource`, `descriptionSource`, `industryCandidates`, `ogImageUrl`, `streetAddress`, `city`, `region`, `postalCode`, `country`, `addressFull`, `employeesStated` (only when the site states it), `techDetails` (name + category), `schemaTypes`, `finalUrl`, `redirectedToDomain` and `pagesFetched`. The dataset has ready-made views: **Overview**, **Social links**, **Contacts** and **Firmographics**. The run's `OUTPUT` record has status counts and the fill rate of each field.

Every row has a `status`. Only `ok` rows are charged:

| status | meaning | charged |
|---|---|---|
| `ok` | profile found | yes |
| `no_data` | site gave too little to build a profile (for example a JavaScript-only page) | no |
| `blocked` | site blocks automated visits (bot challenge, 403/429) | no |
| `parked` / `unavailable` | domain for sale, or a maintenance page | no |
| `unreachable` / `timeout` / `http_error` | DNS, TLS or server problem | no |
| `robots_disallowed` | robots.txt disallows the home page | no |
| `invalid_input` | not a domain | no |

### How well it works (our tests, October 2026)

- **Well-known company sites** (60 domains: SaaS, DTC brands, banks, industrial, restaurants, nonprofits, EU and LATAM): **54 of 60 profiles (90%)**. The 6 misses were sites with strong bot protection, and they were not charged. Name and description: 100% of profiles. Logo: 78%. LinkedIn: 67%. Instagram: 85%. Contact page: 80%. Founded year: 41%.
- **Random long-tail domains** (500 from a public top-sites list, many of them not companies at all): **303 profiles (61%)**. The rest were dead, parked, blocked or empty domains, and all of them were free. Name: 100%. Description: 90%. Logo: 84%. Facebook: 58%. Phone: 39%. LinkedIn: 32%.
- Speed: about 60 well-known domains in 10 seconds. Long-tail lists are slower, because dead and slow sites wait for a 45-second timeout (500 domains took about 8 minutes).

### Pricing

Pay per event: **$0.004 per company profile** (`company-profile` event), so **$4 per 1,000 profiles**. There is no run fee, apart from Apify's standard tiny start event ($0.00005). Apify paid plans get volume discounts on the same event.

Worked example: you upload 1,000 domains. 700 return a profile and 300 are dead, parked or blocked. You pay 700 × $0.004 = **$2.80**. The 300 misses cost nothing. Set **Maximum cost per run** in the run options and the Actor stops before it goes over.

### Cost examples

Costs use the current list prices on the Apify Free plan, including Apify's $0.00005 start event. Run time depends on the input.

| Run | Cost (Free plan) |
|---|---|
| 2 domains (test run) | about $0.008 |
| 100 domains from a lead list | about $0.40 |
| 1,000 domains, 700 with a profile | about $2.80 |

Price per profile: $0.004 on the Apify Free plan, $0.0036 on Starter (Bronze), $0.0032 on Scale (Silver), $0.003 on Business (Gold) and above. The discount is applied automatically.

### How it compares

- **vs. "contact / lead scrapers"**: many of them crawl whole sites and return every email they find, including personal ones, often at $0.10 per lead on the free plan. We return only generic company mailboxes and the company phone, and we charge $0.004 per company.
- **vs. LinkedIn company scrapers**: these return employee counts and HQ from LinkedIn, but they depend on scraping a login-walled site. We read only the company's own website, so we don't give LinkedIn-only fields like follower counts. We do give you the company's own LinkedIn URL, which you can pass to any LinkedIn tool you already use.
- **vs. enrichment APIs** (subscription firmographics databases): they have revenue and headcount estimates for big companies, but they charge monthly and are often stale for small businesses. We fetch the live site on every run. Pay per profile, no subscription.
- **What we don't do:** no revenue estimates, no employee names, no personal emails, no browser rendering. Sites that need JavaScript to show anything come back as `no_data` (free).

### Use it from an AI agent (Apify MCP)

Give Claude, Cursor, VS Code or any other MCP client this Actor as a tool through the [Apify MCP server](https://mcp.apify.com). Add this to your client's MCP config; you sign in to Apify with OAuth on first connect:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=steady-scrape/company-profile-by-domain"
    }
  }
}
```

Clients without OAuth can send an `Authorization: Bearer <APIFY_TOKEN>` header instead. Then ask, for example: *"Enrich these 20 company domains with their industry, logo, LinkedIn page and generic contact email."* The agent starts a normal run, so the prices above and your maximum charge per run still apply.

### FAQ

**Is the industry reliable?** It's a rule-based guess from the site's own words and schema.org type, with a `industryConfidence` of high, medium or low and the keywords that led to it (`industryKeywords`). Use `high` and `medium` for segmentation, and check `low` rows yourself. About a third of long-tail sites get no guess.

**Do you return personal data?** No. Emails are kept only if they are role mailboxes on the company's own domain (info@, sales@, support@, press@…). Named people, personal emails and personal LinkedIn profiles (`/in/…`) are dropped. Phones are the numbers the site publishes. A very small business can publish the owner's own number, so treat phones as business contact data and follow your local rules (GDPR, CAN-SPAM, etc.).

**Why is a big site `blocked`?** Some sites block automated visits from cloud servers. You can turn on the Apify datacenter proxy and try again, but sites with strong bot protection will usually stay `blocked`. Blocked rows are never charged.

**Can I use a residential or my own proxy?** No. The Actor runs without a proxy or with the Apify datacenter proxy only. This keeps the price at a flat $0.004 per profile with no proxy traffic costs. If an API input asks for a residential group, the datacenter proxy is used instead and the run summary says so.

**Founded year and employees?** These come only from the site itself: schema.org `foundingDate` / `numberOfEmployees`, or a clear sentence like "founded in 2014" on the about page. Sentences about a person's career are ignored. `foundedSource` shows the page it came from.

**Can I send emails or URLs?** Yes, both are reduced to the domain. Subdomains are kept (`shop.example.com`). `www.` is removed.

**How many domains per run?** Up to 20,000. For bigger lists, split them into several runs or use the API.

**How do I enrich a list of company domains?** Paste the domains (or emails or URLs, which are reduced to the domain) and run. Each row has the company name, description, industry, logo, social links, generic email and phone from the company's own site.

**How much does company enrichment cost per company?** $0.004 on the Apify Free plan ($4 per 1,000), less on paid plans. Dead, parked and blocked domains are free.

**Can I find a company's LinkedIn page from its website?** Yes. The company's own LinkedIn, X, Facebook, Instagram, YouTube and GitHub links are returned when the site links to them.

### Integrations

Use it from **Make**, **Zapier**, **n8n**, **Google Sheets** (via the Apify integration), the **Apify API** (`run-sync-get-dataset-items` returns the rows in one call for small lists) or as a tool for AI agents through the **Apify MCP server**. A typical setup is a Zap that sends each new CRM company domain to this Actor and writes the logo, industry and LinkedIn URL back to the CRM.

### More from SteadyScrape

- [ATS Job Scraper](https://apify.com/steady-scrape/ats-job-feed): see which roles a company is hiring for, straight from its career site (Greenhouse, Lever, Ashby, Workday and more).
- [Bulk Domain Rank & Traffic Checker](https://apify.com/steady-scrape/domain-seo-metrics): organic and paid traffic estimates, ranked keywords, backlinks and spam score for a list of domains.
- [Backlink Checker API: New and Lost Link Monitor](https://apify.com/steady-scrape/backlink-explorer): backlinks and referring domains for a list of company domains, with a scheduled monitor for new and lost links.
- [AI Visibility & Share of Voice Tracker](https://apify.com/steady-scrape/ai-brand-visibility-tracker): see whether ChatGPT and Perplexity mention, rank and cite a brand versus its competitors.

See every **SteadyScrape (steady-scrape)** Actor on [our Apify profile](https://apify.com/steady-scrape).

Questions or a field you need? Open an issue on the Actor's Issues tab and we'll answer.

# Actor input Schema

## `domains` (type: `array`):

One per line, up to 20,000 per run. Bare domains (stripe.com), URLs (https://www.stripe.com/pricing) and company emails (info@stripe.com) all work. Duplicates are removed.

## `maxPagesPerDomain` (type: `integer`):

1 = homepage only (fastest). 3 = homepage + about + contact page (recommended). 4 adds the imprint / legal notice page (good for EU addresses). 5 also tries /company.

## `includeTechHints` (type: `boolean`):

Detect CMS, e-commerce platform, analytics, chat, marketing tools and hosting from the homepage HTML and headers. Free, no extra requests.

## `respectRobotsTxt` (type: `boolean`):

Skip pages the site's robots.txt asks crawlers not to visit. Recommended.

## `maxConcurrency` (type: `integer`):

How many websites to visit at the same time.

## `useApifyProxy` (type: `boolean`):

Off by default: company websites rarely need a proxy. Turn on to send requests through Apify's datacenter proxy (automatic IP rotation). Residential proxies and custom proxy URLs are not supported.

## Actor input object example

```json
{
  "domains": [
    "stripe.com",
    "notion.so",
    "patagonia.com"
  ],
  "maxPagesPerDomain": 3,
  "includeTechHints": true,
  "respectRobotsTxt": true,
  "maxConcurrency": 20,
  "useApifyProxy": false
}
```

# Actor output Schema

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

One row per domain.

## `socials` (type: `string`):

No description

## `contacts` (type: `string`):

No description

## `firmographics` (type: `string`):

No description

## `summary` (type: `string`):

Totals, fill rates and charges.

# 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 = {
    "domains": [
        "stripe.com",
        "notion.so",
        "patagonia.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("steady-scrape/company-profile-by-domain").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 = { "domains": [
        "stripe.com",
        "notion.so",
        "patagonia.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("steady-scrape/company-profile-by-domain").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 '{
  "domains": [
    "stripe.com",
    "notion.so",
    "patagonia.com"
  ]
}' |
apify call steady-scrape/company-profile-by-domain --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,steady-scrape/company-profile-by-domain"
        }
    }
}
```

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/IFomVuYSjhJtnCDtM/builds/2rVcffsb4Vi9aioJh/openapi.json
