# AI Lead Enrichment & Outreach Generator (`piotrv1001/ai-lead-enrichment-outreach-generator`) Actor

Turn a CSV or Google Sheet of leads into ready-to-send outreach in one run. Scrapes each company's website, detects business signals (hiring, dev focus, B2B SaaS), and generates grounded icebreakers, angles, and value hooks with OpenAI — tied to your own value proposition and fit-scored per lead.

- **URL**: https://apify.com/piotrv1001/ai-lead-enrichment-outreach-generator.md
- **Developed by:** [FalconScrape](https://apify.com/piotrv1001) (community)
- **Categories:** AI, Lead generation, Automation
- **Stats:** 1 total users, 1 monthly users, 0.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.32 / 1,000 gpt-4o mini results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

### 🎯 AI Enrichment & Outreach Generator

Turn a flat list of **leads into ready-to-send outreach** in one run. The **AI Enrichment & Outreach Generator** takes a CSV or public Google Sheet, scrapes each company's website, detects business signals, and generates grounded, personalized outreach copy using OpenAI — all tied back to **your own value proposition** so every message actually sells something.

### ✨ Features

- 📥 **Flexible input** — upload a CSV or paste a public Google Sheets URL. No column mapping required if you use standard headers (`first_name`, `company_name`, `website`, `title`).
- 🌐 **Live website enrichment** — fetches each company's homepage and relevant internal pages (about, product, customers, blog) with Cheerio and pulls out a compact company summary.
- 🧭 **Business signal detection** — rule-based detection of hiring, dev/API focus, ecommerce, B2B SaaS positioning, recent content, agency positioning, and more — each with a confidence score and supporting evidence.
- 💬 **Grounded outreach generation** — generates `icebreaker`, `outreach_angle`, `value_hook`, `email_subject`, and `linkedin_opener` with OpenAI, strictly grounded in the scraped evidence and **your seller offer**. No hallucinated customers, no generic flattery.
- 🎯 **Fit scoring & charge gating** — every row gets a `confidence_score` (0–1) measuring fit between your offer and the lead. Set `minFitScoreToCharge` to automatically skip and **not bill** rows below the threshold — you only pay for real fits.
- 🧠 **Domain deduplication** — multiple leads at the same company trigger a **single** scrape, then generate per-lead copy from the shared context. Saves time and money.
- 📊 **Dual output** — writes every row to the Apify dataset and produces a downloadable `OUTPUT.csv` in the key-value store.
- 🚀 **One-click demo** — leave the prefilled inputs as-is and hit **Start** to see the actor enrich 3 real B2B SaaS companies (Linear, Notion, PostHog) against a sample value proposition.

### 🛠️ How It Works

1. **Pick your lead source** — upload a CSV or paste a public Google Sheets URL.
2. **Describe what you sell** — drop 1–3 sentences into the `sellerValueProposition` field. Optionally add proof points (customer names, metrics).
3. **Pick an OpenAI model** — `gpt-4.1-mini` is the sensible default.
4. **Run the Actor** — for each unique company domain: the Actor scrapes relevant pages, detects signals, runs OpenAI generation, and writes the enriched row.
5. **Download the CSV** — open the run's **Storage** tab, grab `OUTPUT.csv` from the key-value store, and drop it into your sequencer.

### 📥 Input

The Actor opens **pre-populated with a working demo** (CSV `SAMPLE` sentinel + Flowprint value prop) so you can click **Start** and see results without any setup. The fields:

| Field | Type | Required | Description |
|---|---|---|---|
| `inputSourceType` | enum | yes | `csv_upload` or `google_sheet`. |
| `csvFile` | file | when `csv_upload` | Upload a CSV. Use the special value `SAMPLE` to load a bundled 3-row fixture (Linear, Notion, PostHog). |
| `googleSheetUrl` | string | when `google_sheet` | Publicly accessible Google Sheets URL. The Actor converts it to a CSV export automatically. |
| `maxRows` | integer | — | Max rows to process. Default `100`, demo prefill `3`. |
| `websiteColumn` | string | — | Column name holding the company website. Default `website`. |
| `companyNameColumn` | string | — | Default `company_name`. |
| `leadNameColumn` | string | — | Default `first_name`. |
| `jobTitleColumn` | string | — | Default `title`. |
| `companyDescriptionColumn` | string | — | Optional column used as extra context for the AI. |
| `additionalContextColumns` | string list | — | Any extra columns you want passed verbatim to the AI prompt. |
| `sellerValueProposition` | textarea | recommended | 1–3 sentences describing what you sell, for whom, and the outcome. This is what makes the generated copy specific instead of generic. |
| `sellerCompanyName` | string | — | Your company name, used in sign-offs. |
| `sellerProofPoints` | string list | — | Facts the AI is allowed to cite: customer names, metrics, case studies. |
| `minFitScoreToCharge` | number (0–1) | — | If > 0, rows scoring below this fit threshold are marked `skipped` and **not billed**. Great for loose lead lists. |
| `openAiModel` | enum | yes | One of `gpt-4.1-mini`, `gpt-4.1`, `gpt-4o-mini`, `gpt-4o`. Pricing depends on this choice (see below). |
| `outputTypes` | string list | — | Subset of `icebreaker`, `outreach_angle`, `value_hook`, `email_subject`, `linkedin_opener`. |
| `scrapeMode` | enum | — | `homepage_only`, `homepage_plus_about`, or `smart_multi_page`. Default `homepage_plus_about`. |
| `maxPagesPerCompany` | integer | — | Cap on pages fetched per domain. Default `3`. |
| `tone` | enum | — | `professional`, `friendly`, `curious`, `direct`, `casual`. |
| `lengthPreference` | enum | — | `very_short`, `short`, `medium`. |
| `detectSignals` | boolean | — | Run rule-based signal detection. Default `true`. |
| `includeSourceUrls` | boolean | — | Include the list of scraped URLs in each output row. |
| `saveIntermediateFields` | boolean | — | Include company summary and signal fields in the output row. |
| `debugMode` | boolean | — | Verbose logging. |

### 📊 Sample Output Data

Each dataset row preserves the original CSV columns and adds enrichment + AI fields. Example:

```json
[
    {
        "first_name": "Sarah",
        "company_name": "Linear",
        "title": "Head of Growth",
        "website": "https://linear.app",
        "processing_status": "success",
        "normalized_website": "https://linear.app",
        "scraped_urls": ["https://linear.app", "https://linear.app/about", "https://linear.app/customers"],
        "company_summary": "Linear – The system for product development. AI workflows at its core, built for modern teams.",
        "detected_signals": ["b2b_saas", "developer_or_api_focus"],
        "signal_evidence": "b2b_saas: platform | developer_or_api_focus: API",
        "icebreaker": "I noticed Linear is purpose-built for modern teams with AI workflows at its core, setting a new standard for product development.",
        "outreach_angle": "Linear's focus on self-driving product operations aligns with Flowprint's AI-guided onboarding tours to accelerate user activation.",
        "value_hook": "Flowprint can cut your new-user onboarding time by up to 40% by auto-generating interactive walkthroughs from your existing product docs.",
        "email_subject": "Faster onboarding for Linear's product users",
        "linkedin_opener": "Hi Sarah, I'm impressed by how Linear is redefining product development with AI workflows — would love to discuss growth strategies.",
        "personalization_reason": "Linear's AI-centric product development system aligns well with Flowprint's AI-guided onboarding solution.",
        "confidence_score": 0.8,
        "model_used": "gpt-4.1-mini",
        "charged_event": "result_gpt41_mini",
        "generated_at": "2026-04-09T12:14:22.108Z"
    }
]
````

Every run also produces `OUTPUT.csv` in the default key-value store — ready to drop into Instantly, Smartlead, Lemlist, Apollo, or any sequencer.

### 💰 Pricing

This Actor uses **Pay Per Event** monetization: you are **charged per successfully enriched lead**, and the per-result price depends on the OpenAI model you pick. Failed rows, skipped rows, and rows below your `minFitScoreToCharge` threshold are **never billed**.

| OpenAI model | Tier | Price per 1,000 successful results |
|---|---|---|
| `gpt-4o-mini` | Cheapest | **$3.99** |
| `gpt-4.1-mini` | Lower-mid (default) | **$6.99** |
| `gpt-4.1` | Premium | **$16.99** |
| `gpt-4o` | Premium+ | **$19.99** |

**Tips to control cost:**

- Start with `gpt-4.1-mini` — it's the best quality/price tradeoff for outbound copy.
- Set `minFitScoreToCharge` to `0.5` once you've dialed in your value proposition so off-ICP leads don't get billed.
- Domain deduplication is automatic: 100 leads across 10 companies scrape 10 times, not 100.
- Use `scrapeMode: "homepage_only"` for very large lists if you don't need deep company context.

***

Go from a flat CSV to **grounded, high-conversion outreach copy** in minutes with the **AI Enrichment & Outreach Generator**. 🚀

# Actor input Schema

## `inputSourceType` (type: `string`):

Choose whether to upload a CSV or provide a public Google Sheets link. The default example uses a bundled sample of 3 B2B SaaS companies — leave csvFile set to 'SAMPLE' to try it without uploading anything.

## `csvFile` (type: `string`):

Upload a CSV containing your leads. Used when 'Lead source' is 'CSV upload'. The special value 'SAMPLE' loads a bundled 3-row sample (Linear, Notion, PostHog) so you can see the actor work end-to-end without uploading a file.

## `googleSheetUrl` (type: `string`):

Paste a publicly accessible Google Sheets URL. Used when 'Lead source' is 'Public Google Sheets URL'.

## `maxRows` (type: `integer`):

Maximum number of rows to process from the input source. Higher values take longer and cost more.

## `websiteColumn` (type: `string`):

Name of the column in your CSV / Google Sheet that contains each lead's company website URL.

## `companyNameColumn` (type: `string`):

Name of the column that contains the company name.

## `leadNameColumn` (type: `string`):

Name of the column that contains the lead's first name. Used in icebreakers and LinkedIn openers.

## `jobTitleColumn` (type: `string`):

Optional. Name of the column that contains the lead's job title. Helps the AI tailor the angle to the lead's role.

## `companyDescriptionColumn` (type: `string`):

Optional. Name of the column that contains a short description of the company. Used as extra context for the AI if present.

## `additionalContextColumns` (type: `array`):

Optional list of additional column names from your CSV to pass verbatim into the AI prompt as extra context.

## `sellerValueProposition` (type: `string`):

1–3 sentences describing what you sell, who it's for, and the concrete outcome you deliver. Used to ground the outreach copy so the AI can tie your offer to each lead's company context.

## `sellerCompanyName` (type: `string`):

Optional. Used by the AI to sign-off naturally and avoid awkward phrasing.

## `sellerProofPoints` (type: `array`):

Optional. Short facts the AI is allowed to cite: customer names, metrics, case studies.

## `minFitScoreToCharge` (type: `string`):

Number between 0 and 1. If greater than 0, rows with a confidence\_score below this threshold will be marked 'skipped' and not billed. Useful once you provide a value proposition, so you only pay for leads that are a real fit. Leave at 0 to disable.

## `openAiModel` (type: `string`):

Select the OpenAI model to use. Pricing depends on the selected model — see README for the per-result price table.

## `outputTypes` (type: `array`):

Which outreach assets the AI should generate for each lead. You always get a personalization\_reason and confidence\_score in addition to these.

## `scrapeMode` (type: `string`):

How much of each company website to scrape. 'homepage\_only' is fastest; 'smart\_multi\_page' fetches up to maxPagesPerCompany relevant internal pages (about, product, customers, blog).

## `maxPagesPerCompany` (type: `integer`):

Cap on the number of pages fetched per unique company domain. Only applies in smart\_multi\_page mode.

## `tone` (type: `string`):

Desired tone of voice for the generated outreach copy.

## `lengthPreference` (type: `string`):

Preferred length of the generated outreach assets.

## `detectSignals` (type: `boolean`):

Run rule-based signal detection (hiring, dev/API focus, ecommerce, B2B SaaS, etc.) on the scraped pages and pass them to the AI.

## `includeSourceUrls` (type: `boolean`):

Include the list of scraped URLs in each output row for auditability.

## `saveIntermediateFields` (type: `boolean`):

Include company summary and detected signal fields in each output row alongside the generated outreach assets.

## `debugMode` (type: `boolean`):

Enable verbose logging (extracted page titles, selected pages, signal detection details, prompt stats).

## Actor input object example

```json
{
  "inputSourceType": "csv_upload",
  "csvFile": "SAMPLE",
  "maxRows": 3,
  "websiteColumn": "website",
  "companyNameColumn": "company_name",
  "leadNameColumn": "first_name",
  "jobTitleColumn": "title",
  "companyDescriptionColumn": "company_description",
  "sellerValueProposition": "Flowprint is an AI-guided product tour builder for B2B SaaS companies. We cut new-user onboarding time by up to 40% by auto-generating interactive walkthroughs from your existing product docs. Best fit for dev tools and collaboration software with self-serve signup.",
  "sellerCompanyName": "Flowprint",
  "sellerProofPoints": [
    "Used by Retool and Hex",
    "Avg 38% drop in time-to-first-value",
    "SOC 2 Type II"
  ],
  "minFitScoreToCharge": "0",
  "openAiModel": "gpt-4o-mini",
  "outputTypes": [
    "icebreaker",
    "outreach_angle",
    "value_hook"
  ],
  "scrapeMode": "homepage_plus_about",
  "maxPagesPerCompany": 3,
  "tone": "professional",
  "lengthPreference": "short",
  "detectSignals": true,
  "includeSourceUrls": true,
  "saveIntermediateFields": true,
  "debugMode": false
}
```

# Actor output Schema

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

No description

## `csv` (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 = {
    "inputSourceType": "csv_upload",
    "csvFile": "SAMPLE",
    "maxRows": 3,
    "sellerValueProposition": "Flowprint is an AI-guided product tour builder for B2B SaaS companies. We cut new-user onboarding time by up to 40% by auto-generating interactive walkthroughs from your existing product docs. Best fit for dev tools and collaboration software with self-serve signup.",
    "sellerCompanyName": "Flowprint",
    "sellerProofPoints": [
        "Used by Retool and Hex",
        "Avg 38% drop in time-to-first-value",
        "SOC 2 Type II"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/ai-lead-enrichment-outreach-generator").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 = {
    "inputSourceType": "csv_upload",
    "csvFile": "SAMPLE",
    "maxRows": 3,
    "sellerValueProposition": "Flowprint is an AI-guided product tour builder for B2B SaaS companies. We cut new-user onboarding time by up to 40% by auto-generating interactive walkthroughs from your existing product docs. Best fit for dev tools and collaboration software with self-serve signup.",
    "sellerCompanyName": "Flowprint",
    "sellerProofPoints": [
        "Used by Retool and Hex",
        "Avg 38% drop in time-to-first-value",
        "SOC 2 Type II",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/ai-lead-enrichment-outreach-generator").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "inputSourceType": "csv_upload",
  "csvFile": "SAMPLE",
  "maxRows": 3,
  "sellerValueProposition": "Flowprint is an AI-guided product tour builder for B2B SaaS companies. We cut new-user onboarding time by up to 40% by auto-generating interactive walkthroughs from your existing product docs. Best fit for dev tools and collaboration software with self-serve signup.",
  "sellerCompanyName": "Flowprint",
  "sellerProofPoints": [
    "Used by Retool and Hex",
    "Avg 38% drop in time-to-first-value",
    "SOC 2 Type II"
  ]
}' |
apify call piotrv1001/ai-lead-enrichment-outreach-generator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=piotrv1001/ai-lead-enrichment-outreach-generator",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "AI Lead Enrichment & Outreach Generator",
        "description": "Turn a CSV or Google Sheet of leads into ready-to-send outreach in one run. Scrapes each company's website, detects business signals (hiring, dev focus, B2B SaaS), and generates grounded icebreakers, angles, and value hooks with OpenAI — tied to your own value proposition and fit-scored per lead.",
        "version": "0.0",
        "x-build-id": "meg9uU8bZuNqqMsxZ"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/piotrv1001~ai-lead-enrichment-outreach-generator/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-piotrv1001-ai-lead-enrichment-outreach-generator",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/piotrv1001~ai-lead-enrichment-outreach-generator/runs": {
            "post": {
                "operationId": "runs-sync-piotrv1001-ai-lead-enrichment-outreach-generator",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/piotrv1001~ai-lead-enrichment-outreach-generator/run-sync": {
            "post": {
                "operationId": "run-sync-piotrv1001-ai-lead-enrichment-outreach-generator",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "inputSourceType",
                    "openAiModel"
                ],
                "properties": {
                    "inputSourceType": {
                        "title": "Lead source",
                        "enum": [
                            "csv_upload",
                            "google_sheet"
                        ],
                        "type": "string",
                        "description": "Choose whether to upload a CSV or provide a public Google Sheets link. The default example uses a bundled sample of 3 B2B SaaS companies — leave csvFile set to 'SAMPLE' to try it without uploading anything.",
                        "default": "csv_upload"
                    },
                    "csvFile": {
                        "title": "Upload leads CSV",
                        "type": "string",
                        "description": "Upload a CSV containing your leads. Used when 'Lead source' is 'CSV upload'. The special value 'SAMPLE' loads a bundled 3-row sample (Linear, Notion, PostHog) so you can see the actor work end-to-end without uploading a file."
                    },
                    "googleSheetUrl": {
                        "title": "Public Google Sheets URL",
                        "type": "string",
                        "description": "Paste a publicly accessible Google Sheets URL. Used when 'Lead source' is 'Public Google Sheets URL'."
                    },
                    "maxRows": {
                        "title": "Maximum rows to process",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of rows to process from the input source. Higher values take longer and cost more.",
                        "default": 100
                    },
                    "websiteColumn": {
                        "title": "Website column",
                        "type": "string",
                        "description": "Name of the column in your CSV / Google Sheet that contains each lead's company website URL.",
                        "default": "website"
                    },
                    "companyNameColumn": {
                        "title": "Company name column",
                        "type": "string",
                        "description": "Name of the column that contains the company name.",
                        "default": "company_name"
                    },
                    "leadNameColumn": {
                        "title": "Lead first name column",
                        "type": "string",
                        "description": "Name of the column that contains the lead's first name. Used in icebreakers and LinkedIn openers.",
                        "default": "first_name"
                    },
                    "jobTitleColumn": {
                        "title": "Job title column",
                        "type": "string",
                        "description": "Optional. Name of the column that contains the lead's job title. Helps the AI tailor the angle to the lead's role.",
                        "default": "title"
                    },
                    "companyDescriptionColumn": {
                        "title": "Company description column",
                        "type": "string",
                        "description": "Optional. Name of the column that contains a short description of the company. Used as extra context for the AI if present.",
                        "default": "company_description"
                    },
                    "additionalContextColumns": {
                        "title": "Additional columns to include in AI context",
                        "type": "array",
                        "description": "Optional list of additional column names from your CSV to pass verbatim into the AI prompt as extra context.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "sellerValueProposition": {
                        "title": "Your value proposition",
                        "type": "string",
                        "description": "1–3 sentences describing what you sell, who it's for, and the concrete outcome you deliver. Used to ground the outreach copy so the AI can tie your offer to each lead's company context."
                    },
                    "sellerCompanyName": {
                        "title": "Your company name",
                        "type": "string",
                        "description": "Optional. Used by the AI to sign-off naturally and avoid awkward phrasing."
                    },
                    "sellerProofPoints": {
                        "title": "Proof points / customer logos",
                        "type": "array",
                        "description": "Optional. Short facts the AI is allowed to cite: customer names, metrics, case studies.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "minFitScoreToCharge": {
                        "title": "Minimum fit score to charge",
                        "type": "string",
                        "description": "Number between 0 and 1. If greater than 0, rows with a confidence_score below this threshold will be marked 'skipped' and not billed. Useful once you provide a value proposition, so you only pay for leads that are a real fit. Leave at 0 to disable.",
                        "default": "0"
                    },
                    "openAiModel": {
                        "title": "OpenAI model",
                        "enum": [
                            "gpt-4o-mini",
                            "gpt-4.1-mini",
                            "gpt-4o",
                            "gpt-4.1"
                        ],
                        "type": "string",
                        "description": "Select the OpenAI model to use. Pricing depends on the selected model — see README for the per-result price table.",
                        "default": "gpt-4o-mini"
                    },
                    "outputTypes": {
                        "title": "Generated outputs",
                        "type": "array",
                        "description": "Which outreach assets the AI should generate for each lead. You always get a personalization_reason and confidence_score in addition to these.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "icebreaker",
                                "outreach_angle",
                                "value_hook",
                                "email_subject",
                                "linkedin_opener"
                            ]
                        },
                        "default": [
                            "icebreaker",
                            "outreach_angle",
                            "value_hook"
                        ]
                    },
                    "scrapeMode": {
                        "title": "Scraping depth",
                        "enum": [
                            "homepage_only",
                            "homepage_plus_about",
                            "smart_multi_page"
                        ],
                        "type": "string",
                        "description": "How much of each company website to scrape. 'homepage_only' is fastest; 'smart_multi_page' fetches up to maxPagesPerCompany relevant internal pages (about, product, customers, blog).",
                        "default": "homepage_plus_about"
                    },
                    "maxPagesPerCompany": {
                        "title": "Maximum pages per company",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Cap on the number of pages fetched per unique company domain. Only applies in smart_multi_page mode.",
                        "default": 3
                    },
                    "tone": {
                        "title": "Tone",
                        "enum": [
                            "professional",
                            "friendly",
                            "curious",
                            "direct",
                            "casual"
                        ],
                        "type": "string",
                        "description": "Desired tone of voice for the generated outreach copy.",
                        "default": "professional"
                    },
                    "lengthPreference": {
                        "title": "Length",
                        "enum": [
                            "very_short",
                            "short",
                            "medium"
                        ],
                        "type": "string",
                        "description": "Preferred length of the generated outreach assets.",
                        "default": "short"
                    },
                    "detectSignals": {
                        "title": "Detect business signals",
                        "type": "boolean",
                        "description": "Run rule-based signal detection (hiring, dev/API focus, ecommerce, B2B SaaS, etc.) on the scraped pages and pass them to the AI.",
                        "default": true
                    },
                    "includeSourceUrls": {
                        "title": "Include source URLs in output",
                        "type": "boolean",
                        "description": "Include the list of scraped URLs in each output row for auditability.",
                        "default": true
                    },
                    "saveIntermediateFields": {
                        "title": "Include enrichment fields in output",
                        "type": "boolean",
                        "description": "Include company summary and detected signal fields in each output row alongside the generated outreach assets.",
                        "default": true
                    },
                    "debugMode": {
                        "title": "Debug mode",
                        "type": "boolean",
                        "description": "Enable verbose logging (extracted page titles, selected pages, signal detection details, prompt stats).",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
