# Sessionize Speakers Directory Scraper (`adam-frank/sessionize-speakers`) Actor

Extracts speaker name, tagline, company, bio, topics, sessions, past and upcoming events, and social links from public Sessionize speaker profiles, via directory categories, search, or custom lists, priced pay-per-result.

- **URL**: https://apify.com/adam-frank/sessionize-speakers.md
- **Developed by:** [Adam Schepis](https://apify.com/adam-frank) (community)
- **Categories:** Lead generation, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 results

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

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Sessionize Speakers Directory Scraper

Extracts speaker name, tagline, company, bio, topics, sessions, past and upcoming events, and social links from public [Sessionize](https://sessionize.com) speaker profiles. Start from a directory category, a search term, a custom speaker list, or individual profile URLs.

### What you get

- One structured record per public Sessionize speaker profile: who they are, what they talk about, where they've spoken, and where to find them online.
- Topic tags, Sessionize expertise categories, and badges (e.g. Java Champion, Oracle ACE, Most Active Speaker) for filtering thought leaders by field.
- The speaker's full event history as listed on their profile, with dates, locations, and an upcoming flag. Useful for sizing how active a speaker is.
- Pay per result: one `result` event per speaker profile saved to the dataset.
- Runs on Apify's infrastructure with retries and proxy support.

Built for **conference and meetup organizers** sourcing speakers for a track, and **sponsorship, DevRel, and marketing agencies** researching industry voices by topic.

### Input

| Field | Type | Required | Description |
|---|---|---|---|
| `startUrls` | array of URLs | one of `startUrls`/`searchQuery` | Sessionize speakers directory categories, directory search URLs, custom speaker lists, or individual speaker profiles. |
| `searchQuery` | string | one of `startUrls`/`searchQuery` | Searches the speakers directory by name, topic, language, or location (max 40 characters). Used in addition to any start URLs. |
| `maxResults` | integer | no (default 100) | Stops the run once this many speaker profiles have been produced. |

Supported start URL shapes:

- Directory category: `https://sessionize.com/speakers-directory/information-communications-technology`
- Directory search (you can also paste a URL after filtering on the site): `https://sessionize.com/speakers-directory?q=kubernetes`
- Custom speaker list: `https://sessionize.com/oracle-aces`, `https://sessionize.com/microsoft-solutions-women-in-tech-speakers`
- Single speaker profile: `https://sessionize.com/<speaker-username>`

Example input:

```json
{
    "startUrls": [
        { "url": "https://sessionize.com/speakers-directory/information-communications-technology" },
        { "url": "https://sessionize.com/oracle-aces" }
    ],
    "searchQuery": "kubernetes",
    "maxResults": 100
}
```

### Output example

An invented record in the exact shape the Actor emits. The `topics`, `sessions`, and `events` arrays are shortened here for readability; the dataset contains every entry shown on the profile.

```json
{
    "name": "Dana Okonkwo",
    "tagline": "Platform Engineer @ Northwind Systems",
    "company": "Northwind Systems",
    "companyUrl": "https://example.com/",
    "location": "Leeds, United Kingdom",
    "bio": "Dana Okonkwo builds developer platforms at Northwind Systems and has spent a decade on Kubernetes, CI pipelines, and the human side of on-call. Dana writes about platform teams that stay small. ...",
    "areasOfExpertise": ["Information & Communications Technology"],
    "topics": ["Kubernetes", "Platform Engineering", "CI/CD", "Observability", "On-call"],
    "badges": ["Most Active Speaker 2025"],
    "linkedinUrl": "https://www.linkedin.com/in/example-profile/",
    "twitterUrl": null,
    "blueskyUrl": "https://bsky.app/profile/example.invalid",
    "githubUrl": "https://github.com/example-user",
    "youtubeUrl": null,
    "blogUrl": "https://example.com/blog",
    "links": [
        { "label": "LinkedIn", "url": "https://www.linkedin.com/in/example-profile/" },
        { "label": "Blog", "url": "https://example.com/blog" },
        { "label": "Company", "url": "https://example.com/" }
    ],
    "sessionCount": 9,
    "sessions": [
        {
            "title": "Your Platform Team Is Too Big",
            "url": "https://sessionize.com/s/example-speaker/your-platform-team-is-too-big/100000",
            "languages": []
        }
    ],
    "eventCount": 14,
    "events": [
        {
            "name": "Northern Platform Days 2025",
            "url": "https://example.com/events/npd-2025",
            "date": "June 2025",
            "location": "Manchester, United Kingdom",
            "isSessionizeEvent": true,
            "isUpcoming": false
        }
    ],
    "url": "https://sessionize.com/example-speaker",
    "scrapedAt": "2026-09-15T19:07:27.419Z"
}
```

Every dataset item has the same shape. Download results as JSON, CSV, Excel, or via the Apify API.

#### Field notes

- `company` is parsed from the tagline (the text after "at" or "@"). Sessionize has no structured employer field, so it is `null` when the tagline doesn't name one and can be wrong for unusual taglines. `companyUrl` is whatever the speaker linked as "Company" and may not match the tagline.
- `twitterUrl`, `linkedinUrl`, `blueskyUrl`, `githubUrl`, `youtubeUrl`, and `blogUrl` are convenience columns picked from `links`. `links` keeps every link with the speaker's own label.
- `events` lists everything on the profile, past and upcoming, including events not run on Sessionize (`isSessionizeEvent: false`).
- Multi-language profiles: `tagline` and `bio` use the English version when one exists. `sessions` includes talks in all languages.

### Pricing

This Actor uses [pay-per-event pricing](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event). You are charged only for the `result` event, once per speaker profile saved to the dataset, up to `maxResults`. The per-event price is shown on the Actor's Store page before you run it.

| Event | When it's charged |
|---|---|
| `result` | Once per extracted speaker profile, up to `maxResults` |

### Why this actor

Sessionize says 85,000+ speakers have public profiles on its platform, but its directory has no export. This Actor turns a category, search, or curated list into a spreadsheet of speakers with their topics, talk titles, and speaking history. You can shortlist speakers for a CFP, map who speaks about a technology, or find community leaders in a region without clicking through profiles one by one.

### Limits and good-citizen notes

- **1,000 speakers per listing.** Sessionize listings stop at 1,000 results (34 pages of 30; later pages return 404), and large categories and broad searches hit that cap. To go beyond that, split the work into narrower searches (topic, location, language) or several categories. Speakers that appear in more than one of your start URLs are only scraped and charged once per run.
- **One page request per speaker.** Each result needs its profile page, plus one listing request per 30 speakers. Runs are deliberately throttled (3 concurrent requests, at most 120 per minute). Sessionize profile pages are large and took about 3 to 4 seconds each in local test runs, which worked out to 30 to 47 requests per minute, or roughly 25 to 35 minutes per 1,000 speakers.
- **robots.txt.** Sessionize's `robots.txt` (checked 2026-09-15) disallows only `/app/` and `/submission/helper/`. The Actor loads and honors robots.txt on every run.
- **Public data only.** The Actor never logs in and reads only what an anonymous visitor sees. It does not collect email addresses or phone numbers: profile pages don't show them, the profile's Contact dialog only repeats the speaker's own links (inviting a speaker requires a Sessionize login), `mailto:`/`tel:` links are dropped, and email addresses or phone numbers typed into a bio or tagline are replaced with `[email removed]` / `[phone removed]`.
- **Personal data.** Speaker profiles are personal data under GDPR and similar laws. Sessionize speakers choose to make their profiles public, but you are responsible for having a lawful basis for how you store and use the data, for example when contacting speakers.
- Sessionize notes that it "is not responsible for the accuracy or validity of the data provided by speakers". Profiles are self-reported.

Built with [Crawlee](https://crawlee.dev) and the [Apify SDK for JavaScript](https://docs.apify.com/sdk/js/).

### Reference docs used to build this Actor

- Apify SDK for JS: https://docs.apify.com/sdk/js/
- Pay-per-event monetization overview: https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event
- Pay-per-event SDK guide (`Actor.charge`, `ChargingManager`, local test mode): https://docs.apify.com/sdk/js/docs/concepts/pay-per-event
- `.actor/actor.json` reference: https://docs.apify.com/platform/actors/development/actor-definition/actor-json

# Actor input Schema

## `startUrls` (type: `array`):

Sessionize pages to start from: a speakers directory category (e.g. https://sessionize.com/speakers-directory/information-communications-technology), a directory search or filtered URL (e.g. https://sessionize.com/speakers-directory?q=kubernetes), a custom speaker list (e.g. https://sessionize.com/oracle-aces), or individual speaker profiles (e.g. https://sessionize.com/some-speaker). Listing pages are followed page by page; Sessionize shows at most 1,000 speakers per listing, so split large categories with search terms.

## `searchQuery` (type: `string`):

Optional. Searches the Sessionize speakers directory by name, topic, language, or location (max 40 characters, the site's own limit) and scrapes the matching speakers. Used in addition to any Start URLs.

## `maxResults` (type: `integer`):

Stops the run (and pay-per-event charging) once this many speaker profiles have been produced.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://sessionize.com/speakers-directory/information-communications-technology"
    }
  ],
  "maxResults": 50
}
```

# Actor output Schema

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

Dataset containing all scraped records

# 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 = {
    "startUrls": [
        {
            "url": "https://sessionize.com/speakers-directory/information-communications-technology"
        }
    ],
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("adam-frank/sessionize-speakers").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 = {
    "startUrls": [{ "url": "https://sessionize.com/speakers-directory/information-communications-technology" }],
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("adam-frank/sessionize-speakers").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 '{
  "startUrls": [
    {
      "url": "https://sessionize.com/speakers-directory/information-communications-technology"
    }
  ],
  "maxResults": 50
}' |
apify call adam-frank/sessionize-speakers --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,adam-frank/sessionize-speakers"
        }
    }
}
```

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/WRaOvqgDSqHdAXg2c/builds/K9AxIIy3uedqsUQfH/openapi.json
