# Meeting Prep Agent (`phazonoverload/meeting-prep-agent`) Actor

Given a meeting invitation, researches each attendee and their company, then synthesizes everything into a structured briefing document you can read in 2 minutes.

- **URL**: https://apify.com/phazonoverload/meeting-prep-agent.md
- **Developed by:** [Kevin Lewis](https://apify.com/phazonoverload) (community)
- **Categories:** AI, Lead generation
- **Stats:** 2 total users, 1 monthly users, 80.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

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

### Meeting Prep Agent

Never walk into a meeting cold again. Give the Meeting Prep Agent a list of attendees and it researches each person across LinkedIn, Google News, and their company website, then uses AI to synthesize everything into a 2-minute briefing. The output is an original document built by orchestrating multiple Apify Actors and an LLM.

Powered by [Apify Actors](https://apify.com/actors) orchestration and [OpenRouter](https://openrouter.ai/) AI (DeepSeek V4 Flash).

### Why use Meeting Prep Agent?

- **Sales and BD** - Prepare for prospect calls without manual research
- **Investors and consultants** - Brief yourself before portfolio or client meetings
- **Recruiters** - Understand a candidate's background and recent activity before a screen
- **Anyone with external meetings** - Turn calendar invites into actionable context

The AI layer is load-bearing. It doesn't just collect data, it synthesises across sources into a structured briefing with talking points, open questions, and company context you would not get from any single source.

### How it works

1. Enter the attendee name and company. LinkedIn URL and role are optional.
2. The Agent runs 3 research tasks in parallel:
    - **LinkedIn Profile** - Searches for the profile if no URL given, then extracts role, background, and career history
    - **Google News** - Finds recent mentions, interviews, and coverage
    - **Company Website** - Captures product positioning and description
3. AI synthesises everything into a structured briefing
4. Output is saved as JSON to the dataset and as Markdown to the key-value store

### Input

#### Fields

| Field            | Type   | Required | Description                                                    |
| ---------------- | ------ | -------- | -------------------------------------------------------------- |
| `attendeeName`   | string | yes      | Full name of the person you're meeting with                    |
| `company`        | string | yes      | Company or organization the attendee works for                 |
| `role`           | string | no       | Job title or role (improves research accuracy)                 |
| `linkedinUrl`    | string | no       | LinkedIn profile URL (skips the Google search step)            |
| `meetingContext` | string | no       | What the meeting is about (improves relevance)                 |
| `maxActorCostUSD`| number | no       | Cost cap for sub-Actor calls (0 = no limit)                    |

If no LinkedIn URL is given, the Agent searches Google for the profile automatically.

### Output

#### Dataset (JSON)

```json
{
    "meetingSummary": "2-3 sentence overview of who you're meeting and why it matters",
    "attendees": [
        {
            "name": "Jana Dvorak",
            "role": "VP of Product",
            "company": "Productboard",
            "background": "3-4 sentences on career, expertise, relevant context",
            "recentActivity": ["notable recent posts, talks, interviews"],
            "likelyPriorities": ["inferred from role and company context"],
            "icebreakerAngle": "one genuine, non-cringey conversation starter"
        }
    ],
    "companySnapshot": {
        "name": "Productboard",
        "oneLiner": "Product management platform",
        "stage": "Series B",
        "recentNews": ["announced new AI features"],
        "inferredPriorities": ["what they are probably focused on right now"],
        "watchOuts": ["anything sensitive or worth being aware of"]
    },
    "suggestedTalkingPoints": ["string"],
    "openQuestions": ["things worth asking in the meeting"],
    "sources": ["https://linkedin.com/in/jana-dvorak", "https://..."]
}
````

#### Key-value store (Markdown)

A formatted Markdown version (`briefing.md`) is also saved to the key-value store with section headers, bold labels, and bullet lists. Readable directly in the Apify Console or downloadable.

### Pricing / Cost estimation

Pay-per-run. Each run incurs costs from:

- Sub-Actor calls (LinkedIn scraper, Google search, website crawler) - typically $0.01-0.05 each
- OpenRouter AI inference (DeepSeek V4 Flash) - approximately $0.01-0.03 per briefing

Total cost per run: roughly **$0.05-0.20** for a single attendee at quick depth. Use `maxActorCostUSD` to cap unexpected spend in case a sub-Actor runs longer than expected.

### Tips

- Provide `linkedinUrl` when you have it to skip the Google search step
- Fill in `meetingContext` for significantly better briefing relevance
- Provide `OPENROUTER_API_KEY` via `apify secrets add openrouterApiKey <key>` or set it in the Apify Console env vars

### Local development

```bash
## Edit the sample input with your OpenRouter key
## storage/key_value_stores/default/INPUT.json

## Run locally (storage/ is local-only)
apify run
```

### Deployment

```bash
apify push
```

### FAQ, disclaimers, and support

- **What if a sub-Actor fails?** The Agent degrades gracefully. If LinkedIn is blocked, the briefing notes the gap and continues with Google News and website data.
- **Is LinkedIn data always accurate?** The Agent scrapes whatever is publicly visible. Results depend on the target profile's privacy settings and the scraper's capabilities.
- **Does this comply with platform terms?** You are responsible for ensuring your use of third-party scrapers and LLM APIs complies with their respective terms of service.
- **Need help or want a custom version?** Open an issue on the Issues tab or contact us directly.

### Resources

- [Apify SDK for JavaScript](https://docs.apify.com/sdk/js)
- [Apify Platform](https://docs.apify.com/platform)
- [OpenRouter API](https://openrouter.ai/docs)
- [LinkedIn Profile Scraper](https://apify.com/anchor/linkedin-profile-scraper)
- [Google Search Scraper](https://apify.com/apify/google-search-scraper)
- [Website Content Crawler](https://apify.com/apify/website-content-crawler)

# Actor input Schema

## `attendeeName` (type: `string`):

Full name of the person you're meeting with

## `company` (type: `string`):

Company or organization the attendee works for

## `role` (type: `string`):

Attendee's job title or role (helps improve research accuracy)

## `linkedinUrl` (type: `string`):

LinkedIn profile URL (skips the Google search step if provided)

## `meetingContext` (type: `string`):

What the meeting is about (improves briefing relevance)

## Actor input object example

```json
{
  "attendeeName": "Jana Dvořák",
  "company": "Productboard",
  "role": "VP of Product",
  "linkedinUrl": "https://linkedin.com/in/jana-dvorak",
  "meetingContext": "Partnership discussion re: data licensing"
}
```

# 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 = {
    "attendeeName": "Jana Dvořák",
    "company": "Productboard",
    "role": "VP of Product",
    "linkedinUrl": "https://linkedin.com/in/jana-dvorak",
    "meetingContext": "Partnership discussion re: data licensing"
};

// Run the Actor and wait for it to finish
const run = await client.actor("phazonoverload/meeting-prep-agent").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 = {
    "attendeeName": "Jana Dvořák",
    "company": "Productboard",
    "role": "VP of Product",
    "linkedinUrl": "https://linkedin.com/in/jana-dvorak",
    "meetingContext": "Partnership discussion re: data licensing",
}

# Run the Actor and wait for it to finish
run = client.actor("phazonoverload/meeting-prep-agent").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 '{
  "attendeeName": "Jana Dvořák",
  "company": "Productboard",
  "role": "VP of Product",
  "linkedinUrl": "https://linkedin.com/in/jana-dvorak",
  "meetingContext": "Partnership discussion re: data licensing"
}' |
apify call phazonoverload/meeting-prep-agent --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Meeting Prep Agent",
        "description": "Given a meeting invitation, researches each attendee and their company, then synthesizes everything into a structured briefing document you can read in 2 minutes.",
        "version": "1.0",
        "x-build-id": "lm6tt4Jg0HWL3xzO6"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/phazonoverload~meeting-prep-agent/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-phazonoverload-meeting-prep-agent",
                "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/phazonoverload~meeting-prep-agent/runs": {
            "post": {
                "operationId": "runs-sync-phazonoverload-meeting-prep-agent",
                "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/phazonoverload~meeting-prep-agent/run-sync": {
            "post": {
                "operationId": "run-sync-phazonoverload-meeting-prep-agent",
                "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": [
                    "attendeeName",
                    "company"
                ],
                "properties": {
                    "attendeeName": {
                        "title": "Attendee Name",
                        "type": "string",
                        "description": "Full name of the person you're meeting with"
                    },
                    "company": {
                        "title": "Company",
                        "type": "string",
                        "description": "Company or organization the attendee works for"
                    },
                    "role": {
                        "title": "Role (optional)",
                        "type": "string",
                        "description": "Attendee's job title or role (helps improve research accuracy)"
                    },
                    "linkedinUrl": {
                        "title": "LinkedIn URL (optional)",
                        "type": "string",
                        "description": "LinkedIn profile URL (skips the Google search step if provided)"
                    },
                    "meetingContext": {
                        "title": "Meeting Context (optional)",
                        "type": "string",
                        "description": "What the meeting is about (improves briefing relevance)"
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
