# B2B Qualified Leads – Contacts, Tech Stack & Lead Scoring (`70peterson/qualified-lead-intelligence`) Actor

Turn business websites into qualified B2B leads with public contacts, tech-stack detection, commercial signals, transparent scoring, and resilient browser fallback.

- **URL**: https://apify.com/70peterson/qualified-lead-intelligence.md
- **Developed by:** [pierre-luc Rheaume-cyr](https://apify.com/70peterson) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## B2B Qualified Lead Intelligence

Turn public business websites into structured, qualified B2B lead intelligence.

This Actor combines contact enrichment, technology-stack detection, commercial website signals, resilient retrieval, and transparent scoring in one dataset. It is designed for lead research, sales operations, market intelligence, automation workflows, and AI agents that need more than a raw list of domains.

### What you get

For each website, the Actor can return:

- Company name and domain
- Public business email addresses and phone numbers
- Contact, about, pricing, careers, and booking/demo pages
- Social profiles
- Technology stack signals such as CMS, e-commerce, frameworks, analytics, advertising, CRM/forms, chat, payments, booking tools, and CDN/infrastructure
- Commercial signals such as pricing/quote availability, booking/demo options, careers, newsletters, contact forms, e-commerce, analytics, and advertising
- A lead score from 0–100
- Lead grade: A, B, C, D, or U
- Confidence score
- Three specialized sub-scores:
  - **Contactability** — how easy the business is to reach with public data
  - **Digital maturity** — observable technology and digital-operation signals
  - **Commercial signals** — observable website signals that may make the lead more actionable
- A recommended next action
- Reasons and warnings explaining the result
- Retrieval diagnostics when a website is difficult to access

### Lead grades

| Grade | Meaning |
| --- | --- |
| **A** | High-completeness, digitally mature lead. Prioritize review/outreach if it matches your target market. |
| **B** | Strong prospect with useful business/contact signals. |
| **C** | Usable lead, but additional enrichment may improve it. |
| **D** | Low contactability or limited observable signals. Enrich before outreach. |
| **U** | Unknown / insufficient retrieval. The Actor did not collect enough reliable data to judge the business. |

**Grade U is intentionally different from Grade D.** A website protected by a security challenge, for example, is not automatically treated as a weak business.

### Retrieval strategy

The Actor starts with fast HTTP extraction. When the retrieved page is genuinely too sparse, it can fall back to a browser-based strategy and proxy access. It also reports whether fallback was used, whether a challenge was detected, and whether the available data is sufficient for scoring.

This approach helps keep normal runs inexpensive while reserving heavier browser retrieval for websites that actually need it.

### Technology detection

Technology signals are based on observable public website evidence such as scripts, embedded resources, markup, and response headers. Detection includes categories such as:

- WordPress, Wix, Squarespace
- Shopify, WooCommerce, Magento
- Next.js, React, Vue, Angular, Nuxt
- Google Analytics, Google Tag Manager, Segment, Hotjar, Microsoft Clarity
- Google Ads, Meta Pixel, LinkedIn Insight Tag
- HubSpot, Salesforce, Marketo, Mailchimp
- Intercom, Zendesk, Tawk.to
- Stripe, PayPal
- Calendly, Acuity Scheduling, OpenTable, Resy
- Cloudflare, CloudFront, Fastly, Vercel, Netlify

The detector uses stricter signatures for technologies that are prone to false positives. For example, a plain mention of a booking platform is not enough to classify it as an installed booking technology.

### Example input

```json
{
  "websites": [
    "https://example.com",
    "https://another-business.com"
  ],
  "maxPagesPerSite": 4,
  "requestTimeoutSecs": 15,
  "maxConcurrency": 15
}
```

### Example output

```json
{
  "companyName": "Example Company",
  "domain": "example.com",
  "businessEmails": ["sales@example.com"],
  "phones": ["+1 555 555 0123"],
  "technologies": {
    "ecommerce": ["Shopify"],
    "analytics": ["Google Tag Manager"]
  },
  "qualification": {
    "score": 84,
    "grade": "A",
    "confidence": 90,
    "provisional": false,
    "subScores": {
      "contactability": 95,
      "digitalMaturity": 72,
      "commercialSignals": 65
    },
    "recommendedAction": "Prioritize outreach"
  }
}
```

### Important interpretation note

The score measures **public contact completeness and observable digital/commercial maturity**. It does **not** claim that a company intends to buy a product or service, and it is not a substitute for your own target-market criteria.

A high-scoring company can still be a poor fit for your offer. A lower-scoring company may simply expose less information publicly.

### Responsible use

Use the Actor with public business websites and comply with applicable laws, website terms, privacy requirements, and your own outreach policies. The Actor is intended for legitimate business research and automation.

### Built for automation

Outputs are structured for use in:

- CRM enrichment pipelines
- Lead-ranking workflows
- AI agents
- Sales operations
- Market research
- Prospecting datasets
- Automated qualification workflows

The Actor can process a list of domains in one run and stores one structured result per website in the default dataset.

# Actor input Schema

## `websites` (type: `array`):

Public business domains or URLs to qualify. Example: https://example.com

## `maxPagesPerSite` (type: `integer`):

Maximum number of useful pages scanned per website, including the home page.

## `requestTimeoutSecs` (type: `integer`):

Maximum time allowed for each page request.

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

Maximum number of pages processed in parallel.

## Actor input object example

```json
{
  "websites": [
    "https://apify.com"
  ],
  "maxPagesPerSite": 4,
  "requestTimeoutSecs": 15,
  "maxConcurrency": 15
}
```

# Actor output Schema

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

No description

# 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("70peterson/qualified-lead-intelligence").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("70peterson/qualified-lead-intelligence").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 70peterson/qualified-lead-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,70peterson/qualified-lead-intelligence"
        }
    }
}
```

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/5DzTwvR6vs6jGujgm/builds/5DMlpd6Ybo33OeGQ9/openapi.json
