# Personal Facts - Verified Hobbies & Causes (`greg_benbetter/uniqueness-engine`) Actor

Hobbies, causes, fandom, and milestones on the people you sell to. Each fact is a quote with a source URL, or it is withheld. Identify people by LinkedIn URL. You pay only when we find at least one verified personal fact.

- **URL**: https://apify.com/greg\_benbetter/uniqueness-engine.md
- **Developed by:** [Greg Crisci](https://apify.com/greg_benbetter) (community)
- **Categories:** Lead generation, Social media, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$370.00 / 1,000 delivered briefs

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

## Uniqueness Engine: Verified Personal Facts on People

**Hobbies, causes, fandom, and milestones. Each line is a quote with a source.**

Everyone already has the job title. This finds the person: the marathon PR, the
rescue dog's name, the team they've had season tickets for since college, the food
bank board they sit on. Every fact comes with the source URL and the exact quote.
If we can't quote it, you don't get it.

You tell us who with a LinkedIn profile URL, because this is built for B2B. The
research runs across the public web (their blog, podcasts, race results, press,
posts), not just LinkedIn. No cookies, no login.

If we can't confirm it's the right person, or we find no verified personal fact,
nothing is delivered and you pay $0.

Built on [Uniqueness Engine](https://uniquenessengine.com).

### Personal facts vs profile scrapers

| | First line of a cold email |
| --- | --- |
| **From scraper data** (what every other sender already has) | "Hi Jane, I came across your profile and saw you're VP of Engineering at Acme…" |
| **From a sourced personal fact** | "Hi Jane, saw Banjo already runs the house. Anyone who adopts a third rescue is someone I want to talk to about long-horizon work." |

The second line uses `personal_hook`: a cited fact you can open and check before
you send.

### What we look for

**What they do**
Marathons and PRs, half marathons, triathlons, cycling, golf, tennis, rec leagues,
hiking, climbing, fishing, skiing, cooking, baking, gardening, video games, chess and
board games, instruments, bands, photography, painting, writing, collecting.

**What they like**
Books they're reading, film and TV, music they love, concerts, food they prefer,
drinks they order, restaurants, bars, hotels, venues, destinations, brands, products
and snacks, cars and style.

**Who they root for**
Professional teams, college teams, season tickets, school teams they played on, alma
mater, fraternity or sorority, hometown.

**Causes, pets, and the rest of life**
Pets, rescue animals, volunteering, nonprofit boards, charity walks, community clubs,
youth sports coaching, moves, awards, certifications, travel, origin story, personal
philosophy, things they avoid, shows they make, books they wrote, family (only when
they say it themselves).

That's the map, not a limit. Falconry, speedcubing, competitive BBQ judging and
restoring pinball machines turn up the same way: if it's public and quotable, it
counts.

GDPR special-category facts (health, religion, politics, and similar) are excluded
on this actor.

### How it works

1. **Identity.** Name, photo, handles, and links have to match the person at the
   URL. Same-name strangers are dropped.
2. **Quote.** Every fact needs public text we can quote, with the link.
3. **Second check.** A separate pass confirms the quote is about this person and
   says what the fact claims.

No match, or no verified personal fact: `needs_review`, nothing delivered, $0.

Each personal fact carries `attribution`: `self_stated` (their own words) or
`reported` (published by someone else about them). Personal-looking rows that
fail the checks are dropped, not sold.

#### Live example: Bill Gates

From a Uniqueness Engine brief for `https://www.linkedin.com/in/williamhgates/`
(2026-09-24, 47 verified personal facts; a few below):

| Fact | Quote | Attribution |
| --- | --- | --- |
| Plays bridge, especially with Warren Buffett | "My parents first taught me bridge, but I really started to enjoy it after playing with Warren Buffett." | self\_stated |
| Played tennis his whole life, including a match with Roger Federer | "I have played tennis my whole life. This year, I got to play a match with Roger Federer to help raise money for his foundation." | self\_stated |
| Settlers of Catan is the family board game | "This civilization-building board game is a favorite in my family." | self\_stated |
| Reads about a book a week | "On average, I try to read a book a week, and I always bring a whole tote bag of them on vacation." | self\_stated |
| Plays pickleball | "I've been playing pickleball for 50 years" | reported |

`personal_hook` for that run: *"Bill Gates published a memoir titled Source Code."*

#### Demo fixture: Jordan Ellis (Banjo)

The demo on uniquenessengine.com is a labeled fictional fixture. It shows the kind of
fact that makes a first line:

- "Just adopted a third rescue dog, Banjo." Quote: *"adopted our third rescue this weekend — Banjo already runs the house 🐶"*
- "Lifelong Buffalo Bills fan." Quote: *"Bills Mafia for life. Through every single heartbreak."*
- "Ran the Chicago Marathon for the third time, a 3:48 PR."

"Interested in dogs, sports, fitness" is a segment. "Banjo already runs the house" is
a first sentence you can send.

### How to run it

1. **Paste** one LinkedIn profile URL per person into `linkedinUrls`. The URL is how we identify them.
2. **Run.** Research takes about 45 to 90 seconds per person. A batch of ten runs
   in parallel, so it is not ten times as long.
3. **Export** the dataset (JSON, CSV, Excel, or the Apify API) and drop
   `personal_hook` into your sequencer.

No LinkedIn account, cookies, or credentials are ever requested.

### Input

```json
{
    "linkedinUrls": ["https://www.linkedin.com/in/williamhgates/"],
    "maxUrls": 10
}
```

- `linkedinUrls`: LinkedIn people-profile URLs (`linkedin.com/in/...`), used to identify each person. Company pages are not supported.
- `maxUrls`: default 10, max 100. Caps spend up front.

### Output

Each **delivered** brief is one dataset item. Refused and skipped profiles are
listed with reasons in the run summary (key-value store `OUTPUT`). They are
never in the dataset and never charged. A brief is delivered only when it has at
least one verified personal fact.

`OUTPUT` has `delivered`, `refused[]`, `skipped[]` (each with a reason), and
`chargedEventCounts`, the number of briefs this run billed.

| Flat field | What it holds |
| --- | --- |
| `personal_hook` | Best verified personal line, ready for a first sentence |
| `interest_1`, `interest_2` | Labels of the top personal facts |
| `source_1`, `quote_1` | Source URL + exact quote behind the hook |
| `safe_to_reference` | Personal facts joined with `\|` |
| `identity_confidence` | 0 to 1 confidence the brief belongs to the right person |
| `status` | `ok` on delivered items |

Dataset items also include `personalFacts[]` / `professionalFacts[]` with
`{fact, sourceUrl, quote}` (personal facts add `attribution`), plus `fullName`, `company`, `title`, and
`discoveredHandles`.

`giftIdeas` and `outreachAngles` are always empty. The engine returns facts, not copy.

#### Example dataset item (live actor run, truncated)

```json
{
    "status": "ok",
    "sourceProfileUrl": "https://www.linkedin.com/in/williamhgates/",
    "fullName": "Bill Gates",
    "company": "Gates Foundation",
    "title": "Chair, Gates Foundation and Founder, Breakthrough Energy",
    "identityConfidence": 0.9,
    "personal_hook": "Bill Gates has a deep friendship with Warren Buffett.",
    "interest_1": "Friendship with Warren Buffett",
    "source_1": "https://www.linkedin.com/feed/update/urn:li:activity:7499851762841927680/",
    "quote_1": "It was a deep friendship from our very first conversation.",
    "personalFacts": [
        {
            "fact": "Bill Gates has a deep friendship with Warren Buffett.",
            "sourceUrl": "https://www.linkedin.com/feed/update/urn:li:activity:7499851762841927680/",
            "quote": "It was a deep friendship from our very first conversation.",
            "attribution": "self_stated"
        },
        {
            "fact": "Bill Gates first learned about computers at age 13.",
            "sourceUrl": "https://gatesnot.es/AI",
            "quote": "When I first learned about computers at age 13",
            "attribution": "self_stated"
        },
        {
            "fact": "Bill Gates is a voracious reader.",
            "sourceUrl": "https://www.linkedin.com/in/williamhgates/",
            "quote": "Voracious reader.",
            "attribution": "reported"
        }
    ]
}
```

### How much does it cost?

**$0.37 per delivered brief.** Same unit price as
[uniquenessengine.com](https://uniquenessengine.com). One dataset item = one
charge. Refused, failed, and skipped profiles, and briefs with no verified
personal fact, are free. `maxUrls` (default 10,
max 100) caps every run.

This is research-grade enrichment, not a profile scrape. You pay only when a
sourced brief is delivered.

### Who uses it

- **Sales / SDR / GTM**: personalize cold email and LinkedIn outreach with a sourced hobby, not a job title everyone already has.
- **Clay / Instantly / Smartlead**: map `personal_hook` into a sequencer variable; skip rows with no dataset item.
- **Founders**: research investors, partners, and dream customers before the first touch.
- **CS / CX / account teams**: call prep and mid-funnel notes from public interests and causes.
- **AI agents**: research the person before drafting outreach; every fact has a URL a human can open.

### Integrations

#### Clay

```
POST https://api.apify.com/v2/acts/greg_benbetter~uniqueness-engine/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>
Content-Type: application/json

{ "linkedinUrls": ["{{LinkedIn Profile URL}}"], "maxUrls": 1 }
```

Map `personal_hook`, `interest_1`, `source_1`. Branch on whether a row was
returned. Refused profiles produce no dataset item and cost nothing.

#### Instantly / Smartlead

Export CSV and import `personal_hook` / `interest_1` as custom variables.

#### n8n / Make / Apify API

Webhook on `ACTOR.RUN.SUCCEEDED`, or call the actor via the Apify API / MCP.

### Responsible use

- Public data only. Every fact cites the page and quote it came from.
- You are the controller of your use (GDPR/CCPA, CAN-SPAM, PECR).
- Not a consumer report. Do not use for employment, credit, housing, insurance, or FCRA purposes.
- Do not use for spam, harassment, stalking, or doxxing.

Data-deletion requests: [uniquenessengine.com](https://uniquenessengine.com).

### FAQ

**Is this a LinkedIn scraper?**
No. Scrapers extract fields already on the profile. This researches the person
across public sources and returns only cited facts, refusing when it isn't sure.

**What if you can't find the person?**
It refuses and you are not charged. Refused URLs appear in the run summary.

**How long does a run take?**
About 45–90 seconds per profile (up to ~2–3 minutes). Batches run in parallel.

**Does it need my LinkedIn cookies?**
No.

**Does it write my emails?**
No. It returns verified facts; the words stay yours.

Built on [Uniqueness Engine](https://uniquenessengine.com). Issues and data-deletion requests go there.

# Actor input Schema

## `linkedinUrls` (type: `array`):

One LinkedIn people-profile URL per line (linkedin.com/in/username). It is only used to identify the person. Company pages, search URLs, and Sales Navigator links are not supported. No LinkedIn cookies or login required.

## `maxUrls` (type: `integer`):

Spend cap. URLs beyond this cap are skipped, listed in the run summary, and never charged. Refused profiles, and profiles with no verified personal fact, are also free.

## Actor input object example

```json
{
  "linkedinUrls": [
    "https://www.linkedin.com/in/williamhgates/"
  ],
  "maxUrls": 10
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "linkedinUrls": [
        "https://www.linkedin.com/in/williamhgates/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("greg_benbetter/uniqueness-engine").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 = { "linkedinUrls": ["https://www.linkedin.com/in/williamhgates/"] }

# Run the Actor and wait for it to finish
run = client.actor("greg_benbetter/uniqueness-engine").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 '{
  "linkedinUrls": [
    "https://www.linkedin.com/in/williamhgates/"
  ]
}' |
apify call greg_benbetter/uniqueness-engine --silent --output-dataset

```

## MCP server setup

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

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/b0wbRheToCZqITy7l/builds/rwGnqD6wG0nIkYdap/openapi.json
