# Whova Event Scraper - Sessions, Speakers, Sponsors & Exhibitors (`scrapesage/whova-event-scraper`) Actor

Turn any public Whova event into clean, structured data. One run captures the full agenda (sessions, times, rooms, tracks, docs), the complete speaker roster with bios and their sessions, sponsors with tiers and logos, and exhibitors with booth numbers. No login. Export to JSON, CSV, or Excel.

- **URL**: https://apify.com/scrapesage/whova-event-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** Lead generation, Agents, Integrations
- **Stats:** 3 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.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

## Whova Event Scraper — Sessions, Speakers, Sponsors & Exhibitors

> **Disclaimer:** This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Whova or any of its subsidiaries. All trademarks mentioned are the property of their respective owners. "Whova" is referenced only to describe the publicly available website this Actor collects data from.

Extract **sessions**, **speakers**, **sponsors**, and **exhibitors** (with **booth numbers** and **sponsor tiers**) from any public Whova event page as clean, structured JSON. **No login / no cookies** — it reads Whova's own public event-webpage data.

### Why this Whova scraper?

| Typical scrapers | This actor |
|---|---|
| Grab one list (just the agenda) | Pulls **four datasets in one run** — sessions, speakers, sponsors, exhibitors |
| Miss the dedicated speaker directory | Merges the **full speaker roster** from the agenda *and* the speaker directory, **deduplicated by profile** |
| Drop breakout sessions | Captures **subsessions** as their own rows, linked to the parent |
| Skip booth/tier metadata | Keeps **exhibitor booth numbers** and **sponsor tiers** |
| Fail on empty sections | Empty results finish as a **successful run** with a plain-English note — no charge |

### Use cases

- **Event lead generation** — pull sponsor and exhibitor companies with websites, logos, tiers, and booth numbers for outreach before or during the show.
- **Conference agenda research** — capture every session's title, time, room, tracks, description, and attached documents for competitive or planning analysis.
- **Speaker sourcing** — build a complete, deduplicated speaker roster with titles, affiliations, bios, and the sessions each person appears in.
- **Expo-floor mapping** — export exhibitors by booth number and category to plan a walk-through or compare year-over-year participation.
- **Multi-event monitoring** — scrape several Whova events at once and track who's sponsoring, exhibiting, or speaking across an industry.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **Whova Event Scraper**, fill in the inputs you need, and click **Start**.
3. Watch results stream into the dataset table as each record is parsed.
4. **Export** as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
  "startUrls": [
    { "url": "https://whova.com/embedded/event/RO1JdFJs9ii6Fx75WrNTg1kBuSNRjetEH9eL7BSaXKQ%3D/" }
  ],
  "includeSessions": true,
  "includeSpeakers": true,
  "includeSponsors": true,
  "includeExhibitors": true,
  "maxItems": 0,
  "maxConcurrency": 5,
  "minDelayMs": 250,
  "maxRequestRetries": 4,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

- **`startUrls`** — public Whova event pages or embedded URLs. Any URL containing the event id works, e.g. `https://whova.com/embedded/event/<event_id>/`. Open an event's public agenda or exhibitor page and copy the long code after `/event/`.
- **`eventIds`** — alternative to URLs: paste raw Whova event ids (the long code after `/event/`, usually ending in `%3D` or `=`).
- **`includeSessions` / `includeSpeakers` / `includeSponsors` / `includeExhibitors`** — toggle each record type (all `true` by default).
- **`maxItems`** — hard cap on total records across all events and types (`0` = no limit).
- **`maxConcurrency`** — how many events to process in parallel (default `5`, max `20`).
- **`minDelayMs`** — politeness delay before each API call (default `250` ms).
- **`maxRequestRetries`** — retries per request on network/HTTP errors; the proxy IP is rotated on each retry (default `4`).
- **`proxyConfiguration`** — uses Apify Proxy (datacenter) by default; recommended.

> **Heads-up on links:** a `whova.com/web/<code>` *app* link won't work on its own — that short code isn't the event id the data needs. Use the **embedded** URL (containing `/embedded/event/`) or the raw id. If you paste something unsupported, the run still finishes successfully and explains how to get the right id.

### Output

Every record carries `recordType`, `eventId`, `eventName`, `sourceUrl`, `scrapedAt`, and `isVirtualEvent`. Missing values are `null` (never invented). Sessions additionally include `parentSessionId` and `isSubsession`, so breakout subsessions are captured as their own rows and linked to their parent. The examples below show the most useful fields per type.

**Session**

```json
{
  "recordType": "session",
  "sessionId": "2917325",
  "name": "The United Kingdom",
  "startTime": "2023-04-22 09:00:00",
  "endTime": "2023-04-22 10:00:00",
  "place": "4th Floor, Venture",
  "description": "The United Kingdom (UK) is at the forefront…",
  "descriptionHtml": "<div><p>…</p></div>",
  "tracks": ["Showcase"],
  "documents": [{ "title": "Slides", "url": "https://…", "description": null }],
  "sessionOrder": 2,
  "speakerNames": ["Michael Kill", "Peter Marks", "Carly Heath", "Philip Kolvin"],
  "speakerCount": 4,
  "eventName": "Sociable City Summit 2023",
  "eventTimezone": "America/New_York"
}
```

**Speaker** (full roster — merged from the agenda + speaker directory, deduplicated by profile)

```json
{
  "recordType": "speaker",
  "profileId": "28928388",
  "name": "Ariel Palitz",
  "title": "Global Government and Hospitality Consultant",
  "affiliation": "NYC Alliance, Oaktree Solutions, Venue Advisors",
  "location": "New York, New York, United States",
  "bio": "…",
  "photoUrl": "https://…",
  "photoIsLinkedinCdn": false,
  "photoIsDefault": false,
  "hasLinkedin": true,
  "hasPicture": true,
  "role": "Speaker",
  "roles": ["Speaker"],
  "sessionIds": ["2931508", "2931510"],
  "sessionCount": 2,
  "socialLinks": { "linkedin": null, "facebook": null, "twitter": null, "instagram": null, "tiktok": null, "youtube": null, "pinterest": null }
}
```

**Sponsor**

```json
{
  "recordType": "sponsor",
  "companyId": "121043",
  "name": "Curb",
  "website": "https://www.gocurb.com/",
  "logoUrl": "https://…",
  "tier": "Advocate",
  "categories": [],
  "boothNumber": null,
  "unpaid": false,
  "description": "…",
  "socialLinks": { "linkedin": null, "facebook": null, "twitter": null, "instagram": null, "tiktok": null, "youtube": null, "pinterest": null },
  "links": []
}
```

**Exhibitor**

```json
{
  "recordType": "exhibitor",
  "companyId": null,
  "name": "3D Group",
  "website": "https://www.3dgroup.net",
  "logoUrl": "https://…",
  "tier": null,
  "categories": [],
  "boothNumber": "215",
  "unpaid": false,
  "description": "360 Feedback - Leadership Coaching - Team Effectiveness…",
  "socialLinks": { "linkedin": null, "facebook": null, "twitter": null, "instagram": null, "tiktok": null, "youtube": null, "pinterest": null },
  "links": []
}
```

Notes:

- Records contain **public, professional/business information only** — no attendee personal contact details (personal email, phone, home address) are ever emitted.
- Many fields are optional and returned as `null` when Whova has no value (e.g. an exhibitor with no tier, a sponsor with no booth).
- **Empty results are reported as success.** If an event has no public data for the types you selected, the run finishes successfully with a plain-English explanation written to the `RUN_SUMMARY` in the run's key-value store, and an empty run is never charged.

### How much does it cost to scrape Whova?

This Actor uses Apify's **pay-per-event** pricing: you are charged only for the results it delivers, with no monthly rental and no start fee. The events it can charge are:

- **Result** - Each record returned — a session, speaker, sponsor, or exhibitor.

The current price of each event is shown on the **Pricing** tab of this page. Set a maximum total charge on the run if you want a hard cap on spend, and use the input limits to control how much the Actor fetches.

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run it on a cron to keep your data fresh.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions the moment a run finishes.

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/whova-event-scraper').call({
    startUrls: [
        { url: 'https://whova.com/embedded/event/RO1JdFJs9ii6Fx75WrNTg1kBuSNRjetEH9eL7BSaXKQ%3D/' },
    ],
    includeSessions: true,
    includeSpeakers: true,
    includeSponsors: true,
    includeExhibitors: true,
    maxItems: 0,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} records`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new records straight into your CRM or sheet.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a run finds something new.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "pull every sponsor and exhibitor (with booth numbers) from this Whova event page" and let it run this scraper for you.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

Need data from other event platforms and lead sources? Try these:

- [eventbrite-scraper](https://apify.com/scrapesage/eventbrite-scraper) — events plus organizer leads with contacts
- [sched-conference-scraper](https://apify.com/scrapesage/sched-conference-scraper) — conference speakers, sessions, sponsors & leads
- [swapcard-exhibitor-scraper](https://apify.com/scrapesage/swapcard-exhibitor-scraper) — event exhibitors, speakers & contacts
- [bark-listing-scraper](https://apify.com/scrapesage/bark-listing-scraper) — Bark.com service-provider directory listings
- [sam-gov-scraper](https://apify.com/scrapesage/sam-gov-scraper) — US federal contract opportunities & contacts
- [linkedin-jobs-scraper](https://apify.com/scrapesage/linkedin-jobs-scraper) — filter-based LinkedIn job postings, no login
- [facebook-ad-library-scraper](https://apify.com/scrapesage/facebook-ad-library-scraper) — Meta/Instagram competitor ad intelligence
- [google-ads-transparency-scraper](https://apify.com/scrapesage/google-ads-transparency-scraper) — see who's advertising what on Google

### Tips

- Use the **embedded** URL (containing `/embedded/event/`) or the raw event id — a `whova.com/web/<code>` app link won't resolve to the data.
- Keep the default **Apify Proxy (datacenter)** on; the actor rotates the proxy IP on each retry for reliability.
- Set **`maxItems`** to a small number for a test run — the actor samples fairly across all four types so you see every record type, and `RUN_SUMMARY` reports both what was written and what was available. Set it to `0` for everything.
- Toggle off any record type you don't need (e.g. `includeSpeakers: false`) to keep runs focused and cheaper.
- For large events the actor downloads and parses the entire agenda before writing, so the first records can take 1–2 minutes (longer for very large events) and then appear all at once — that startup delay is normal.

### FAQ

**Do I need a Whova login?** No. The actor only reads public event-webpage data — no account, no cookies.

**An event returned 0 exhibitors or 0 sponsors — is it broken?** No. Many events (e.g. summits) have no expo hall or haven't published a section yet. The run succeeds and `RUN_SUMMARY` explains why; empty runs cost nothing.

**Will it get speakers that aren't attached to the agenda?** Yes. Many events keep their roster in a separate speaker directory. The actor pulls that full directory and merges it with any agenda-linked speakers (deduplicated by profile), and even backfills a session's speaker list where the agenda left it blank.

**Where do booth numbers come from?** Whova stores the booth in the exhibitor's `location` field; the actor maps it to `boothNumber`.

**Can I scrape several events at once?** Yes — add multiple URLs or event ids and they're processed in parallel up to `maxConcurrency`.

**Is the data legal to collect?** The actor gathers public, professional/business information only and never emits personal contact details. It is an independent tool and is not affiliated with, endorsed by, or sponsored by Whova. Use it in accordance with the laws and terms that apply to you.

**What export formats are available?** JSON, CSV, Excel, XML, and RSS via the dataset, or programmatically through the Apify API.

### Data & lawful use

This Actor reads business and professional listings that the professionals themselves published to be found: names, roles, firms, ratings and the contact details shown on the public listing. Because those details belong to identifiable people, treat the output as personal data. If you are in the EU or UK you are the data controller for what you do with it: have a lawful basis (usually legitimate interest for B2B prospecting or market research), keep any outreach relevant to the professional's line of work, honour opt-outs and deletion requests, and do not use the output for spam.

Under [Apify's Standard Actor Contract](https://docs.apify.com/legal/standard-actor-contract), which governs your use of this Actor, you are the controller of any personal data in your input and output and scrapesage acts only as your processor: that data is processed solely to run your job, written only to your own Apify storage, never used for any other purpose and never shared onward. If you need help with a data-subject request that involves this Actor's output, open an issue on the Issues tab.

### Disclaimer

**This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Whova or any of its subsidiaries. All trademarks mentioned are the property of their respective owners.**

"Whova" and any related marks are the property of their respective owners and are used here only in a descriptive, nominative sense - to identify the publicly accessible website from which this Actor collects data. This Actor is not an official Whova product, is not authorised or certified by Whova, and does not distribute Whova software. It collects only publicly available information; you are responsible for ensuring your use of that data complies with applicable laws, regulations and the terms of the source website.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

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

Public Whova event pages or embedded URLs. Any URL containing the event id works, e.g. https://whova.com/embedded/event/\<event_id>/ . Tip: open an event's public agenda or exhibitor page and copy the long code after /event/ in the address bar.

## `eventIds` (type: `array`):

Alternative to URLs: paste raw Whova event ids (the long code after /event/, usually ending in %3D or =).

## `includeSessions` (type: `boolean`):

Include the agenda's sessions (title, time, room, description, tracks, documents).

## `includeSpeakers` (type: `boolean`):

Include the FULL speaker roster — pulled from BOTH the agenda and the event's dedicated speaker directory, deduplicated by profile, with each speaker's sessions, title, affiliation, bio and photo. Public professional info only.

## `includeSponsors` (type: `boolean`):

Include sponsors (name, website, logo, tier, social links found in the description).

## `includeExhibitors` (type: `boolean`):

Include exhibitors (name, website, logo, booth number, category).

## `maxItems` (type: `integer`):

Hard cap on total records across all events and types. 0 means no limit.

## `maxConcurrency` (type: `integer`):

How many events to process in parallel.

## `minDelayMs` (type: `integer`):

Politeness delay before each API call (rate limiting).

## `maxRequestRetries` (type: `integer`):

Retries per request on network/HTTP errors (the proxy IP is rotated on each retry).

## `proxyConfiguration` (type: `object`):

Uses Apify Proxy (datacenter) by default — recommended.

## `urlsFromFile` (type: `string`):

Paste a list of URLs (one per line), OR one link to a .txt/.csv file, Google Sheet or Google Drive file containing them. Lets you import many Start URLs at once instead of typing each. Google Sheet/Drive share links are handled automatically.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://whova.com/embedded/event/RO1JdFJs9ii6Fx75WrNTg1kBuSNRjetEH9eL7BSaXKQ%3D/"
    }
  ],
  "includeSessions": true,
  "includeSpeakers": true,
  "includeSponsors": true,
  "includeExhibitors": true,
  "maxItems": 0,
  "maxConcurrency": 5,
  "minDelayMs": 250,
  "maxRequestRetries": 4,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "startUrls": [
        {
            "url": "https://whova.com/embedded/event/RO1JdFJs9ii6Fx75WrNTg1kBuSNRjetEH9eL7BSaXKQ%3D/"
        }
    ],
    "urlsFromFile": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/whova-event-scraper").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://whova.com/embedded/event/RO1JdFJs9ii6Fx75WrNTg1kBuSNRjetEH9eL7BSaXKQ%3D/" }],
    "urlsFromFile": "",
}

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/whova-event-scraper").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://whova.com/embedded/event/RO1JdFJs9ii6Fx75WrNTg1kBuSNRjetEH9eL7BSaXKQ%3D/"
    }
  ],
  "urlsFromFile": ""
}' |
apify call scrapesage/whova-event-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapesage/whova-event-scraper"
        }
    }
}
```

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/7ecCdJVV6tKzFApkn/builds/5N8wf0twr9kFTCP3b/openapi.json
