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

Collect public Facebook events as clean rows: date, time zone, venue, full address, host, description and ticket link. Paste event links, or name the Pages whose upcoming events you want. Ideal for venue calendars, listings sites and local guides. No account or login needed.

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

## Pricing

$1.50 / 1,000 event collecteds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Facebook Events Scraper

Turn a Facebook event link into a clean row of data — date, time, time zone, venue, full street address, host, description and ticket link — and do the same for every upcoming event a Page is hosting. Give it the events you already care about, or name the venues, promoters and organisations you follow and let it pull their upcoming schedule. Built for people who maintain event calendars, listings sites, venue databases and local guides, and who are tired of copying dates by hand.

No Facebook account, no login and no personal details are involved. Paste links, press start.

### What you can do with it

- **Keep a venue or festival calendar current.** Name the Pages of the venues and promoters you cover and collect their upcoming events every morning.
- **Fill a listings site or newsletter.** Every row already has the date, the address, the host and the ticket link, so it drops straight into a template.
- **Watch competitors and partners.** See what a rival venue, brand or conference organiser has announced, and when.
- **Enrich a list of events you already have.** Feed in links you collected elsewhere and get structured dates and addresses back.
- **Spot cancellations and online-only events** — both are flagged on every row.
- **Feed a map or a location database** using the street address exactly as the organiser published it.

### What you get

One row per event. An abridged real record:

```
{
  "eventId": "1560490818379950",
  "name": "Old 97's",
  "startsAt": "2026-08-06T03:00:00.000Z",
  "endsAt": null,
  "timezone": "PDT",
  "venueName": "The Fillmore",
  "address": "1805 Geary Blvd, San Francisco, CA, US 94115",
  "city": "San Francisco, CA, United States",
  "isOnline": false,
  "isCancelled": false,
  "hostName": "Live Nation Concerts",
  "hostPageId": "100064501372099",
  "description": "OPEN DANCE FLOOR / STANDING ROOM ONLY Doors 7:00pm / Show 8:00pm …",
  "ticketUrl": "https://www.ticketmaster.com/old-97s-san-francisco-california-08-05-2026/event/1C006462C198E993",
  "url": "https://www.facebook.com/events/1560490818379950/",
  "discoveredVia": "page",
  "sourcePage": "thefillmore",
  "identityMatchesRequest": true,
  "availability": "OK",
  "scrapedAt": "2026-08-01T20:12:44.881Z"
}
```

### Input reference

| Field | Type | Default | What it does |
| --- | --- | --- | --- |
| Event links | list of text | empty | Links to the events you want. Both the short form and the long form with the venue and event name in the link are accepted, as is a bare numeric event id. |
| Pages hosting events | list of text | empty | Facebook Pages whose upcoming events you want. A Page link, an @handle or a numeric id all work. |
| Maximum events per Page | number (1–50) | 20 | Upper limit on how many events are taken from each Page. A ceiling, not a target. |
| Browse from | choice | United States | Which country to browse from. |
| Parallel work | number (1–8) | 4 | How many events are collected at the same time. Four is a good balance. |

At least one event link or one Page is required.

### Output fields

| Field | Type | Notes |
| --- | --- | --- |
| `eventId` | text | Facebook's own id for the event. |
| `name` | text | The event title. |
| `startsAt` | text | Start time in a fixed universal format. |
| `endsAt` | text or empty | Empty when the organiser published no finish time. |
| `timezone` | text | The time-zone label the event itself displays, such as `CDT`. |
| `venueName` | text | The venue. For an event given only as a street address, this is that address. |
| `address` | text | The one-line address as published. |
| `city` | text or empty | Only present when the venue is a place with its own Facebook presence. |
| `isOnline` | true/false | Whether the event is online-only. |
| `isCancelled` | true/false | Whether the organiser has cancelled it. |
| `hostName` | text | The host, taken from the organiser or the host list. |
| `hostPageId` | text | The host's numeric id. |
| `description` | text | The organiser's description. |
| `ticketUrl` | text or empty | The external ticket link, when the event sells tickets. Organisers often publish it as an affiliate tracking link that bounces through a redirector; the destination behind it is what you get, so the link points straight at the ticket page. |
| `url` | text | The event's page on Facebook. |
| `discoveredVia` | text | `url` when you supplied the link, `page` when it came from a Page. |
| `sourcePage` | text or empty | Which Page it came from, when it came from one. |
| `identityMatchesRequest` | true/false or empty | False when a handle you gave resolved to a different profile than you probably meant. True when what you asked for is what came back. Empty when there was nothing to check — you gave a numeric Page id, or the Page did not publish a handle — because no answer is better than a made-up one. |
| `availability` | text | `OK` on every delivered row. |
| `scrapedAt` | text | When the row was collected. |

An empty field means "the organiser did not publish this", never "this does not exist". The one exception is `identityMatchesRequest`, where empty means there was nothing to compare.

### Pricing

You pay per event delivered — **$1.50 per 1,000 events**, and nothing else. There is no monthly fee and no charge for a run that finds nothing.

An event that cannot be read publicly is **not charged**. It is counted in the run summary as unavailable and never appears in your results, so you never pay for an empty row.

Worked example: 40 venue Pages, each with about eight upcoming events, is roughly 320 events, or about **$0.48** for the whole sweep. Running that every morning for a month costs around **$14**.

### Limits & what this actor cannot do

- **There is no public event search on Facebook, so this actor cannot find events by keyword, city or date.** Every event must come from a link you supply or from a Page you name. Any tool that claims to search Facebook's public events by keyword is not doing what it says.
- A Page publishes only a shortlist of its **upcoming** events publicly — on the venue Pages tested, eight. Past events and a full calendar cannot be collected from a Page.
- **Attendance figures are not reported.** Facebook does not publish "going" and "interested" counts publicly in a form that can be trusted, and the numbers visible next to an event page often belong to other, suggested events. Reporting them would mean reporting numbers that may not be the event's own.
- Not every event publishes a finish time or a separate city. Those fields arrive empty rather than guessed at.
- Some events are set so their details are only visible to logged-in visitors, and an event that has been withdrawn looks exactly the same. Both are reported as unavailable, never as an empty result and never as "deleted".
- Event details are a snapshot at the moment of collection. Organisers move dates, change venues and cancel.
- Vanity links get reassigned: a handle that once belonged to one brand can now resolve to a different profile, so every row reports which Page it actually came from and flags a mismatch. The flag is only filled in when there is a handle to compare — give a Page as a numeric id and it stays empty rather than pretending to have checked.
- Speed depends on the size of the job and on Facebook's own response times. No fixed throughput is promised.
- Facebook's terms prohibit automated access, and event listings can contain personal data. You are responsible for using what you collect lawfully, in line with Facebook's terms and with applicable privacy law.

### FAQ

**Do I need a Facebook account?**
No. Nothing is collected that a logged-out visitor cannot see.

**Does it need my login or personal details?**
No. There is nothing to connect and nothing to authorise.

**Can I search for events near me, or by keyword?**
No, and nor can anything else that reads Facebook publicly — Facebook's public event search returns nothing at all. Name the venues, promoters and organisations you care about instead, and you get their upcoming events.

**Can I schedule it?**
Yes. Schedule it daily against a list of venue Pages and you have a calendar that maintains itself.

**Is the data complete?**
It is complete for what Facebook publishes publicly: dates, venue, address, host, description and ticket link. It is not complete for attendance figures, past events or a Page's full calendar — see the limits above.

**Why is `endsAt` empty on some rows?**
Because plenty of organisers only publish a start time. An empty finish time is what the event says, not a failure.

**Why did an event come back as unavailable?**
Either it is set so only logged-in visitors can see it, or it has been withdrawn. The two look identical from the outside, so the run reports it honestly as unavailable and does not charge you for it.

# Actor input Schema

## `eventUrls` (type: `array`):

Links to the Facebook events you want. Any public event link works, including the long ones with the venue and event name in them. Leave this empty if you only want the events hosted by the Pages below.

## `pageUrls` (type: `array`):

Facebook Pages whose upcoming events you want. Give a Page link, an @handle or a numeric id. Every upcoming event the Page lists publicly is collected.

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

Upper limit on how many events are taken from each Page listed above. Facebook publicly lists only a handful of upcoming events per Page, so this is a ceiling rather than a target.

## `country` (type: `string`):

The country to browse from. Event times are always reported in a fixed, unambiguous format, so this mainly affects which regional version of a page you see.

## `concurrency` (type: `integer`):

How many events are collected at the same time. Four is a good balance; raising it does not always finish sooner.

## Actor input object example

```json
{
  "eventUrls": [
    "https://www.facebook.com/events/1793720947905626/"
  ],
  "pageUrls": [
    "https://www.facebook.com/thefillmore"
  ],
  "maxEventsPerPage": 20,
  "country": "us",
  "concurrency": 4
}
```

# 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 = {
    "eventUrls": [
        "https://www.facebook.com/events/1793720947905626/"
    ],
    "pageUrls": [
        "https://www.facebook.com/thefillmore"
    ],
    "maxEventsPerPage": 20,
    "country": "us",
    "concurrency": 4
};

// Run the Actor and wait for it to finish
const run = await client.actor("apt_marble/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 = {
    "eventUrls": ["https://www.facebook.com/events/1793720947905626/"],
    "pageUrls": ["https://www.facebook.com/thefillmore"],
    "maxEventsPerPage": 20,
    "country": "us",
    "concurrency": 4,
}

# Run the Actor and wait for it to finish
run = client.actor("apt_marble/facebook-events-scraper").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 '{
  "eventUrls": [
    "https://www.facebook.com/events/1793720947905626/"
  ],
  "pageUrls": [
    "https://www.facebook.com/thefillmore"
  ],
  "maxEventsPerPage": 20,
  "country": "us",
  "concurrency": 4
}' |
apify call apt_marble/facebook-events-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/2TAXr2MaNdnCMahAa/builds/GQguyyiiTsTKpOIWe/openapi.json
