# Facebook Events Scraper (`mina_safwat/facebook-events-scraper`) Actor

Scrapes public Facebook events from event links or from Pages' upcoming and past events: name, description, start and end time with timezone, venue, address, coordinates, hosts, going and interested counts, ticket link and cover image. No login or cookies needed.

- **URL**: https://apify.com/mina_safwat/facebook-events-scraper.md
- **Developed by:** [Mina](https://apify.com/mina_safwat) (community)
- **Categories:** Social media, Travel, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 events

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

### What does Facebook Events Scraper do?

**Facebook Events Scraper** collects **public Facebook events**, either from
single event links or from a **Page's upcoming and past events**. For every
event you get the **name, description, start and end time with the event's
own UTC offset, venue, address, city, latitude and longitude, online flag,
hosts with their Page links, going, interested and "people responded"
counts, ticket link, categories and cover image**. No login, cookies or Facebook account needed.

Try it with the prefilled Page: open the Actor, click **Start**, and the next 5
events at the [Royal Albert Hall](https://www.facebook.com/royalalberthall)
arrive in about 20 seconds. Because it runs on the Apify platform, you also get
API access, scheduled runs, integrations (Google Sheets, Make, Zapier,
webhooks), run monitoring and automatic retries from fresh proxy addresses.

### Why scrape Facebook events?

- **Event listings and city guides**: fill a "what's on" calendar with the
  events venues, clubs and promoters publish on Facebook.
- **Venue and promoter monitoring**: follow what competitors schedule, when,
  and how many people respond.
- **Lead generation**: find the organisers behind events in your niche, with
  links to their Pages.
- **Ticketing and market research**: collect ticket links, dates and interest
  levels across many venues.
- **Reporting**: schedule a daily run and send new events to a spreadsheet or
  dashboard.

### How to scrape Facebook events

1. Open a Facebook Page that hosts events and copy its address, such as
   `https://www.facebook.com/royalalberthall`. You can also copy a single event
   link such as `https://www.facebook.com/events/1482777493615743`.
2. Paste it into **Facebook event or Page links**, one link per line.
3. Set **Max events per Page or profile**, and tick **Include past events of
   Pages** if you want past events too.
4. Click **Start**, then download the results when the run finishes.

### Input

Everything is set on the Input tab. In JSON, the input looks like this:

```json
{
    "startUrls": [
        "https://www.facebook.com/royalalberthall",
        "https://www.facebook.com/SXSW/past_hosted_events",
        "https://www.facebook.com/events/1314538782908908"
    ],
    "maxEventsPerPage": 20,
    "includePastEvents": false
}
```

| Field | What it does | Default |
|---|---|---|
| `startUrls` | Event links (`facebook.com/events/…`, also `m.` and `web.` links, share links `facebook.com/events/s/<name>/<id>/`, `fb.me/e/…` short links, and links to one date of a recurring event: `facebook.com/events/<series>/<date>/` or `?event_time_id=…`) and Page or profile links (`facebook.com/royalalberthall`, `facebook.com/royalalberthall/events`, `facebook.com/profile.php?id=…`, `facebook.com/people/Name/ID/` or just `royalalberthall`). A link to a Page's `past_hosted_events` tab reads its past events only. Links without `https://` and API objects such as `{"url": "…"}` are accepted. | required |
| `maxEventsPerPage` | Stops after this many events for each Page or profile, in Facebook's order (soonest first for upcoming events, latest first for past ones). | 20 |
| `includePastEvents` | For Page links, also reads past events after the upcoming ones. Both count towards the maximum. | false |

### Output

One row per event. You can download the dataset in various formats such as
JSON, HTML, CSV, or Excel. A real row (cover link shortened):

```json
{
    "id": "1804447570709306",
    "url": "https://www.facebook.com/events/1804447570709306/",
    "name": "Konstantinos Argiros - Meet & Greet Add-On",
    "description": "Meet & Greet add on with Konstantinos Argiros (does not include event ticket) ...",
    "startTime": "2026-10-22T22:30:00+01:00",
    "endTime": null,
    "timezone": "UTC+01",
    "dateText": "Thursday, October 22, 2026 at 10:30 PM BST",
    "isOnline": false,
    "isCanceled": false,
    "isPast": false,
    "locationName": "Royal Albert Hall",
    "address": "Kensington Gore, SW7 2AP London, UK",
    "city": "London, United Kingdom",
    "latitude": 51.50073,
    "longitude": -0.17683,
    "organizers": [
        { "name": "Senbla Live Events", "url": "https://www.facebook.com/SenblaLiveEvents" },
        { "name": "Royal Albert Hall", "url": "https://www.facebook.com/royalalberthall" }
    ],
    "respondedCount": 26,
    "goingCount": null,
    "interestedCount": null,
    "ticketUrl": "https://ticketmaster.evyy.net/c/253158/2038758/24023?u=https%3A%2F%2Fwww.ticketmaster.co.uk%2F...",
    "categories": [],
    "coverImageUrl": "https://scontent-lga3-1.xx.fbcdn.net/v/t39.99422-6/824871399_...n.png?...",
    "inputUrl": "https://www.facebook.com/royalalberthall",
    "scrapedAt": "2026-10-20T14:02:29.797386+00:00"
}
```

### Data fields

The share of rows with a value comes from 109 test events across Pages in the
UK and the US (going and interested counts: 45 Hollywood Bowl events).

| Field | Description | Filled |
|---|---|---|
| `id`, `url` | The event's Facebook id and link. For a recurring event, the id of the date shown (the next one). | 100% |
| `name`, `description` | Event title and full description text. | 100% |
| `startTime`, `endTime` | ISO 8601 times in the event's own UTC offset (`2026-10-22T19:30:00+01:00`). `endTime` is null when the organiser set no end time, which is most events. When the offset cannot be worked out, times are in UTC (`+00:00`). | 100% / 7% |
| `timezone` | The zone Facebook shows, such as `PDT`, `UTC+01` or `UTC`. | 100% |
| `dateText` | The date and time as Facebook writes it. | 100% |
| `isOnline`, `isCanceled`, `isPast` | Online event, cancelled, already over. | 100% |
| `locationName` | Venue name (`Online event` for online events). | 100% |
| `address`, `city` | One-line street address and the city Facebook links it to. | 83% / 100% |
| `latitude`, `longitude` | Venue coordinates. | 100% |
| `organizers` | Hosts, each with `name` and Page or profile `url`. | 100% |
| `respondedCount` | "People responded", Facebook's total of going and interested. It can be slightly higher than the two counts added up. | 95% |
| `goingCount`, `interestedCount` | Read from the summary Facebook writes for the event page. Facebook leaves zero and small going counts out of that summary, and writes big ones rounded ("1.1K"); both come back `null` (unknown). A missing count is set to 0 only when the other count already equals `respondedCount`. So the largest events usually have only `respondedCount`. | about 40% / 55% |
| `ticketUrl` | The ticket link the organiser added. | 79% |
| `categories` | Facebook's event categories, such as `Music` or `Food`. | 50% |
| `coverImageUrl` | Cover image link. | 100% |
| `inputUrl` | The link from your input that led to this event. | 100% |
| `scrapedAt` | When the row was saved (UTC). | 100% |

Image links are signed by Facebook and stop working after a few days, so
download the images you want to keep.

### How much does it cost to scrape Facebook events?

The Actor uses plain HTTP requests (no browser) through Apify's datacenter
proxy, so the platform cost is tiny: about **$0.06–0.08 per 1,000 events** in
our tests. You pay per event saved; see the **Pricing** tab for the exact price.
Links that give nothing (private events, Pages without events, typos) are
never charged. You can set a maximum cost per run, and the Actor stops cleanly
when it is reached.

### Tips

- **Pages with many events**: Facebook lists 8 events per page; raise
  `maxEventsPerPage` to read further. A Page that lists no upcoming events is
  reported in `FAILED_INPUTS` with "no public upcoming events"; tick
  **Include past events of Pages** to read its history instead.
- **Old Page names work**: when a Page has moved to a new address (for example
  `facebook.com/SXSW` → `facebook.com/SXSWFestival`), the Actor follows it.
- **The same event from several Pages** is saved and charged once per run.
  When a listed event turns out to be one already saved (another date of the
  same recurring event, or an event another Page listed), the Actor reads
  further down the listing to make up the number you asked for.
- **Check `FAILED_INPUTS`** in the run's key-value store: every link that gave
  nothing is listed there with the reason.
- **Schedule it**: run it daily on your venues' Pages to catch new events.

### FAQ, disclaimers and support

**Can it search events by keyword or city?** No. Facebook's events search does
open logged out, but it answers each visit with a different, often empty,
handful of events, and its later pages are rate-limited. Results like that
would look complete while missing most events, so the Actor reads Pages and
event links only. Event search links are listed in `FAILED_INPUTS` with this
reason.

**Why are going or interested counts sometimes empty?** Logged-out Facebook
gives the split only in a one-line page summary. That summary leaves out zero
and small going counts, rounds big counts ("1.1K", which the Actor does not
guess at), and is missing on some events. When a count is not there and
cannot be proven to be 0, it is `null`. The guest list (who is going) is never
shown logged out.

**Which date does a recurring event give?** A link to the series gives the
date Facebook shows first (usually the next one). A link to one date
(`facebook.com/events/<series>/<date>/`) gives that date.

**Why is an event missing?** Private events, events visible only to group
members, and removed events show Facebook's login page to logged-out visitors.
They are listed in `FAILED_INPUTS` as "Facebook shows this only to logged-in
users". The Actor only settles on that answer after a residential
address sees the login page too, so a datacenter address being turned away
is never mistaken for a private event.

**Is it legal to scrape Facebook events?** The Actor reads only what Facebook
shows to anyone without logging in. Event pages can name people (hosts,
performers), which is personal data under laws such as the GDPR: only collect
what you have a legitimate reason to process, and check your local rules and
Facebook's terms for your use case. This is not legal advice.

**Something is not working, or you need more?** Open an issue on the
**Issues** tab with the link that failed and we will look into it. For a custom
solution, get in touch through the Issues tab as well.

# Actor input Schema

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

One link per line. Paste a single event (https://www.facebook.com/events/1234567890, a share link https://www.facebook.com/events/s/…/1234567890/, an fb.me/e/… link, or one date of a recurring event https://www.facebook.com/events/<series>/<date>/) or a Page or profile to get its upcoming events (https://www.facebook.com/royalalberthall, https://www.facebook.com/profile.php?id=…; https://www.facebook.com/royalalberthall/past_hosted_events gives its past events). Links without https:// work too. Links that give nothing are listed with the reason in the FAILED_INPUTS record.

## `maxEventsPerPage` (type: `integer`):

Stops after this many events for each Page or profile link, in Facebook's order (soonest first for upcoming events, latest first for past ones). Single event links always give one event.

## `includePastEvents` (type: `boolean`):

For Page and profile links, also read the Page's past events after its upcoming ones (both count towards the maximum above). A link to a Page's past_hosted_events tab reads only past events.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.facebook.com/royalalberthall"
  ],
  "maxEventsPerPage": 5,
  "includePastEvents": false
}
```

# 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": [
        "https://www.facebook.com/royalalberthall"
    ],
    "maxEventsPerPage": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("mina_safwat/facebook-events-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": ["https://www.facebook.com/royalalberthall"],
    "maxEventsPerPage": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("mina_safwat/facebook-events-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": [
    "https://www.facebook.com/royalalberthall"
  ],
  "maxEventsPerPage": 5
}' |
apify call mina_safwat/facebook-events-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mina_safwat/facebook-events-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/23F7gNVHNrbafVShk/builds/pDOhJHgmSF90jmHvl/openapi.json
