# Speaker Refresh - Single Speaker Enricher (`etb2b-tools/etb2b-speaker-refresh`) Actor

Enrich any speaker/professional with full LinkedIn profile, recent news, Wikipedia, social handles, decision-maker score, and email-pattern guesses. Input: name (+ optional company/designation/LinkedIn). Output: 40+ portal-ready fields. Built by RS Niraj for event/conference workflows.

- **URL**: https://apify.com/etb2b-tools/etb2b-speaker-refresh.md
- **Developed by:** [RS Niraj](https://apify.com/etb2b-tools) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 99.9% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

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

## Speaker Refresh Actor

Single-speaker enrichment for production portal. Pulls fresh Wikipedia + Google News + SERP cascade + LinkedIn data and returns the same speaker card schema as event-scraper.

### Use case
Production portal has a "Refresh" button on each speaker card. Click → this actor runs → fresh enriched data returned with same schema → portal updates DB.

### Input
- `speakerName` (string, **required**) — Full name
- `speakerCompany` (string, optional) — Current company
- `speakerDesignation` (string, optional) — Current role
- `speakerLinkedin` (string, optional) — LinkedIn URL (saves SERP-for-LinkedIn cost if provided)
- `speakerImageUrl` (string, optional) — Existing image as fallback
- `speakerEmail` (string, optional) — Existing email as fallback
- `eventIndustry`, `eventName` (string, optional) — Context for Wikipedia validation
- `useWikipedia` (bool, default `true`) — FREE
- `includeNews` (bool, default `true`) — FREE
- `includeLinkedin` (bool, default `true`) — ~$0.01/refresh
- `includeRecentActivity` (bool, default `false`) — ~$0.01/refresh
- `useSerpCascade` (bool, default `false`) — ~$0.03/refresh
- `maxPostsPerSpeaker` (int, default `5`)

### Cost matrix
| Mode | Flags | ~Cost |
|------|-------|-------|
| FREE only | wiki + news ON, others OFF | $0 |
| Standard | wiki + news + linkedin ON | $0.01 |
| Full | + SERP cascade | $0.04 |
| Full + posts | + recent activity | $0.05 |

### Output
Dataset entry with same speaker card schema as event-scraper (drop-in mapping for portal).

### Architecture
- Reuses enrichment modules from `apify-event-scraper`: `wikipedia_enrich.py`, `serp_bio_enrich.py`, `speaker_enrich.py`, `news_enrich.py`
- Reshape logic mirrors event-scraper's `_reshape_speaker_for_portal` verbatim
- Any logic updates here MUST mirror event-scraper to keep schema consistent

### Deploy
```bash
apify push
````

### Version

- v0.1 — Initial speaker refresh actor, mirroring event-scraper v0.5.45

# Actor input Schema

## `speakerName` (type: `string`):

Full name of the speaker. Mandatory.

## `speakerCompany` (type: `string`):

Current company — improves enrichment accuracy.

## `speakerDesignation` (type: `string`):

Current job title — improves disambiguation.

## `speakerLinkedin` (type: `string`):

If known, skips SERP-for-LinkedIn step (saves cost + faster).

## `speakerImageUrl` (type: `string`):

Existing speaker image — used as fallback if no fresh image found.

## `speakerEmail` (type: `string`):

Existing speaker email — used as fallback if no fresh email found.

## `eventIndustry` (type: `string`):

Industry context for Wikipedia validation (helps avoid wrong-person matches).

## `eventName` (type: `string`):

Event name context for Wikipedia validation.

## `useWikipedia` (type: `boolean`):

\[v0.4 POLICY] This flag is IGNORED — actor always runs Wikipedia enrichment for guaranteed rich data.

## `includeNews` (type: `boolean`):

\[v0.4 POLICY] This flag is IGNORED — actor always runs Google News for guaranteed rich data.

## `includeLinkedin` (type: `boolean`):

\[v0.4 POLICY] This flag is IGNORED — actor always runs LinkedIn profile fetch (~$0.01).

## `includeRecentActivity` (type: `boolean`):

\[v0.4 POLICY] This flag is IGNORED — actor always fetches recent LinkedIn posts (~$0.01).

## `maxPostsPerSpeaker` (type: `integer`):

Maximum number of recent LinkedIn posts to fetch per speaker.

## `useSerpCascade` (type: `boolean`):

\[v0.4 POLICY] This flag is IGNORED — actor always runs SERP cascade (~$0.03) for topics/awards/image-fallback. Sending false has NO effect.

## Actor input object example

```json
{
  "speakerName": "Satya Nadella",
  "speakerCompany": "Microsoft",
  "speakerDesignation": "CEO",
  "speakerLinkedin": "https://www.linkedin.com/in/satyanadella/",
  "eventIndustry": "Logistics",
  "useWikipedia": true,
  "includeNews": true,
  "includeLinkedin": true,
  "includeRecentActivity": true,
  "maxPostsPerSpeaker": 5,
  "useSerpCascade": true
}
```

# 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("etb2b-tools/etb2b-speaker-refresh").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("etb2b-tools/etb2b-speaker-refresh").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 '{}' |
apify call etb2b-tools/etb2b-speaker-refresh --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=etb2b-tools/etb2b-speaker-refresh",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Speaker Refresh - Single Speaker Enricher",
        "description": "Enrich any speaker/professional with full LinkedIn profile, recent news, Wikipedia, social handles, decision-maker score, and email-pattern guesses. Input: name (+ optional company/designation/LinkedIn). Output: 40+ portal-ready fields. Built by RS Niraj for event/conference workflows.",
        "version": "2.4",
        "x-build-id": "VyArTUmobhJJqd3QG"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/etb2b-tools~etb2b-speaker-refresh/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-etb2b-tools-etb2b-speaker-refresh",
                "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/etb2b-tools~etb2b-speaker-refresh/runs": {
            "post": {
                "operationId": "runs-sync-etb2b-tools-etb2b-speaker-refresh",
                "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/etb2b-tools~etb2b-speaker-refresh/run-sync": {
            "post": {
                "operationId": "run-sync-etb2b-tools-etb2b-speaker-refresh",
                "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": [
                    "speakerName"
                ],
                "properties": {
                    "speakerName": {
                        "title": "Speaker Name (required)",
                        "type": "string",
                        "description": "Full name of the speaker. Mandatory."
                    },
                    "speakerCompany": {
                        "title": "Company (optional)",
                        "type": "string",
                        "description": "Current company — improves enrichment accuracy."
                    },
                    "speakerDesignation": {
                        "title": "Designation/Role (optional)",
                        "type": "string",
                        "description": "Current job title — improves disambiguation."
                    },
                    "speakerLinkedin": {
                        "title": "LinkedIn URL (optional)",
                        "type": "string",
                        "description": "If known, skips SERP-for-LinkedIn step (saves cost + faster)."
                    },
                    "speakerImageUrl": {
                        "title": "Current image URL (optional)",
                        "type": "string",
                        "description": "Existing speaker image — used as fallback if no fresh image found."
                    },
                    "speakerEmail": {
                        "title": "Current email (optional)",
                        "type": "string",
                        "description": "Existing speaker email — used as fallback if no fresh email found."
                    },
                    "eventIndustry": {
                        "title": "Event industry context (optional)",
                        "type": "string",
                        "description": "Industry context for Wikipedia validation (helps avoid wrong-person matches)."
                    },
                    "eventName": {
                        "title": "Event name context (optional)",
                        "type": "string",
                        "description": "Event name context for Wikipedia validation."
                    },
                    "useWikipedia": {
                        "title": "Use Wikipedia (FREE) [v0.4: always-on]",
                        "type": "boolean",
                        "description": "[v0.4 POLICY] This flag is IGNORED — actor always runs Wikipedia enrichment for guaranteed rich data.",
                        "default": true
                    },
                    "includeNews": {
                        "title": "Include Google News (FREE) [v0.4: always-on]",
                        "type": "boolean",
                        "description": "[v0.4 POLICY] This flag is IGNORED — actor always runs Google News for guaranteed rich data.",
                        "default": true
                    },
                    "includeLinkedin": {
                        "title": "Include LinkedIn Profile [v0.4: always-on]",
                        "type": "boolean",
                        "description": "[v0.4 POLICY] This flag is IGNORED — actor always runs LinkedIn profile fetch (~$0.01).",
                        "default": true
                    },
                    "includeRecentActivity": {
                        "title": "Include LinkedIn Recent Posts [v0.4: always-on]",
                        "type": "boolean",
                        "description": "[v0.4 POLICY] This flag is IGNORED — actor always fetches recent LinkedIn posts (~$0.01).",
                        "default": true
                    },
                    "maxPostsPerSpeaker": {
                        "title": "Max LinkedIn posts to fetch",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Maximum number of recent LinkedIn posts to fetch per speaker.",
                        "default": 5
                    },
                    "useSerpCascade": {
                        "title": "Use SERP top-10 cascade [v0.4: always-on]",
                        "type": "boolean",
                        "description": "[v0.4 POLICY] This flag is IGNORED — actor always runs SERP cascade (~$0.03) for topics/awards/image-fallback. Sending false has NO effect.",
                        "default": true
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
