# Company Enrichment From Domain: Tech Stack, Socials, Hiring (`jtpalms/company-profile`) Actor

Company enrichment from a list of website domains: company name, description, official social links, tech stack (CMS, ecommerce, analytics), domain age, and hiring activity from the company's job board. USD 5 per 1,000 profiles; unreachable domains are free.

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

## Pricing

from $4.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 Enrichment From Domain: company profile, tech stack, social links and hiring

Company enrichment from public sources: give it a list of company websites (domains) and get one company profile per company:

- the company name and description from its homepage;

- its official social pages;

- its tech stack (CMS, ecommerce platform, analytics, CDN, frameworks, payments and more);

- domain registration date and age;

- hiring activity from its own job board: open roles, roles posted in the last 30 days, top departments and sample jobs.

- **USD 5 per 1,000 profiles.** Domains that don't answer, or aren't registered, are free.

- **No personal data.** Company pages only: no emails, phone numbers or employee profiles.

### What people use it for

- **Lead enrichment.** Add company facts to a list of domains before outreach: what they run on, how old the company is, and whether it is hiring.
- **Sales targeting.** Find Shopify stores, HubSpot users or React shops in your list, and see who is growing (open roles, recent postings).
- **Market research.** Profile every company in a niche the same way.
- **CRM hygiene.** Refresh names, descriptions and social links for the accounts you already have.

### Sample output

A real profile (lists shortened):

```json
{
  "domain": "linear.app",
  "name": "Linear",
  "description": "Purpose-built for planning and building products with AI agents.",
  "language": "en",
  "socialProfiles": { "x": "https://x.com/linear", "github": "https://github.com/linear", "youtube": "https://youtube.com/@linear" },
  "techCount": 31,
  "tech": {
    "cms": ["Sanity"],
    "frameworks": ["React", "styled-components"],
    "cdn": ["Cloudflare", "Google Cloud CDN"],
    "marketing": ["HubSpot"],
    "payments": ["Stripe"],
    "email": ["Google Workspace", "Amazon SES"]
  },
  "domainInfo": { "registered": true, "createdAt": "2018-05-09T23:45:22.384Z", "ageYears": 8.4, "registrar": "CloudFlare, Inc." },
  "hiring": {
    "jobBoardFound": true,
    "platform": "ashby",
    "openJobs": 30,
    "postedLast30Days": 4,
    "remoteJobs": 29,
    "topDepartments": [{ "department": "GTM", "jobs": 14 }]
  }
}
```

The full row also lists every detected technology with its categories (`technologies`), the page title, logo and favicon, and up to 20 sample jobs with links.

### How to use it

1. Paste your domains into **Website domains**, one per line. Full URLs work too.
2. Switch off any part you don't need (tech stack, hiring, domain age) to make runs faster.
3. Run it, then export as CSV, JSON or Excel, or send it to Google Sheets, Make, Zapier or your CRM.

### Pricing

| What | Price |
|---|---|
| Company profile (the site answered) | USD 0.005 (USD 5 per 1,000). Lower on Apify's higher plans |
| Unreachable or unregistered domain | Free |

### How each part works

- **Homepage facts** come from the site's own title, description and Open Graph tags.
- **Social links** are official company pages linked from the homepage. Personal LinkedIn profiles, share buttons and single posts are ignored.
- **Tech stack** is detected from the homepage, its headers and DNS, with the open-source Wappalyzer fingerprints.
- **Domain age** comes from the official RDAP registry for the domain's extension.
- **Hiring** comes from the company's own public job board, found by following its careers links. Supported: Greenhouse, Lever, Ashby, Workable, Recruitee, Personio, Breezy, Teamtailor, Gem and Pinpoint. Companies on other systems show `jobBoardFound: false`.

### Limits

- **The actor identifies itself.** Every request (homepage, tech scan, job board, domain registry) carries the user agent `Mozilla/5.0 (compatible; company-profile/1.0; +https://apify.com/JTPalms/company-profile)`, with plain request headers. It never pretends to be Chrome or any other browser.
- Some sites block bots, so their profiles may be partial; each failed part is named in `errors` and the rest is still filled in.
- Tech detection sees what the homepage shows. Back-office tools are not visible.
- Hiring is only found when the site links to a supported job board.

### Related actors

- [Website Tech Stack Detector (Wappalyzer Alternative)](https://apify.com/JTPalms/tech-stack-detector): Find the technology behind any website in bulk: CMS, ecommerce platform, analytics, frameworks, CDN, hosting, payment, email and...
- [Hiring Signals: Companies Hiring by Role, Team & Location](https://apify.com/JTPalms/hiring-signals): Find companies hiring right now, one row per company: open roles by team, seniority and location, roles posted in the last 7 and 30...
- [Bulk Domain Lookup & Availability Checker (RDAP)](https://apify.com/JTPalms/domain-rdap-lookup): Check thousands of domains: available or registered, registrar, creation date, expiry date, days to expiry, status codes, nameservers...
- [Website Screenshot API: Full Page, Mobile, PDF](https://apify.com/JTPalms/website-screenshot): Screenshot any list of URLs as full-page or viewport PNG, JPEG, WebP or PDF, on desktop, laptop, tablet or mobile.

### FAQ

**Do you collect emails or people's names?** No. The profile is about the company. No emails, phone numbers or employee profiles are collected.

**Can I get the jobs themselves?** Yes: use the Career Page Jobs actor or the Career Site Jobs Index from the same developer.

**Something wrong for a domain?** Open an issue with the domain and what you expected.

# Actor input Schema

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

Company websites to profile, for example linear.app or https://www.allbirds.com. One per line; up to 10,000 per run.

## `includeTech` (type: `boolean`):

Detect the site's CMS, ecommerce platform, analytics, CDN, frameworks and more.

## `includeHiring` (type: `boolean`):

Find the company's job board (Greenhouse, Lever, Ashby, Workable, Recruitee, Personio, Breezy, Teamtailor, Gem, Pinpoint) and count open roles.

## `includeDomainAge` (type: `boolean`):

Registration date, age and registrar from the official RDAP registry.

## `sampleJobs` (type: `integer`):

How many of the newest open roles to include, with links.

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

How many domains to profile at once.

## `timeoutSecs` (type: `integer`):

How long to wait for each website or registry to answer.

## Actor input object example

```json
{
  "domains": [
    "linear.app",
    "allbirds.com",
    "shopify.ca"
  ],
  "includeTech": true,
  "includeHiring": true,
  "includeDomainAge": true,
  "sampleJobs": 5,
  "maxConcurrency": 5,
  "timeoutSecs": 20
}
```

# Actor output Schema

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

All output rows in the default dataset (JSON, CSV, Excel via the format parameter).

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

Domains profiled, unreachable and charged.

# 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": [
        "linear.app",
        "allbirds.com",
        "shopify.ca"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jtpalms/company-profile").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": [
        "linear.app",
        "allbirds.com",
        "shopify.ca",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("jtpalms/company-profile").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": [
    "linear.app",
    "allbirds.com",
    "shopify.ca"
  ]
}' |
apify call jtpalms/company-profile --silent --output-dataset

```

## MCP server setup

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

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/4VkDd38pEAL8Aln5O/builds/4nGgLgt7b0UfsXFB8/openapi.json
