# Facebook Events Scraper - Search by Keyword, City & Page (`scrapewise/facebook-events-scraper`) Actor

Scrape public Facebook events without login: search by keyword and city, all events of a page, or event links. Name, UTC start and end, venue with GPS, organizer page, description, tickets link, category, response count, image. US$ 8.50 per 1,000 events.

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

## Pricing

from $7.23 / 1,000 event delivereds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Facebook Events Scraper

Facebook Events Scraper turns **public Facebook events** into clean JSON, CSV or Excel, **without login, cookies or an API key**. Search by keyword and city, pull every event a page hosts, or pass event links, and get each event's **name, start and end in UTC, venue with GPS coordinates, organizer page, full description, tickets link, category, response count and cover image**. Built for event marketers, city guides, venues, ticketing and lead generation teams.

**US$ 8.50 per 1,000 events. No monthly fee, no start fee. Error rows are free.**

### At a glance

- **Price per 1,000 events:** US$ 8.50 (US$ 7.23 on Gold plans and above), every event with full details
- **Search:** keyword + city, date window, category; several keywords and cities in one run
- **Pages:** all upcoming events hosted by a page, past events optional
- **Event links:** one row per link, recurring events resolved to the right date
- **No account needed:** nothing to log in, no cookies to paste, no risk for your Facebook profile
- **Error rows:** free, with an `errorCode`

### One real row

`halloween party` in `New York` (collected on 2026-10-03, description trimmed):

```json
{
  "type": "event",
  "id": "1631479465280674",
  "url": "https://www.facebook.com/events/1631479465280674/",
  "name": "2nd Annual Kids Halloween Costume Party",
  "description": "Blacklight Glow Halloween Painting Party Kid friendly ages 5 and up with 1 hour blacklight Halloween painting, fun games and spooky treats...",
  "startUtc": "2026-10-25T19:00:00Z",
  "endUtc": "2026-10-25T21:00:00Z",
  "startTimestamp": 1792954800,
  "endTimestamp": 1792962000,
  "timezone": "EDT",
  "dateText": "Sunday, October 25, 2026 at 3:00 PM – 5:00 PM EDT",
  "duration": "2 hr",
  "isOnline": false,
  "isCanceled": false,
  "isPast": false,
  "isRecurring": false,
  "venueName": "2557 Hempstead Turnpike, East Meadow, NY",
  "address": "2557 Hempstead Tpke, East Meadow, NY 11554-2154, United States",
  "city": "East Meadow, New York",
  "cityId": "104103549624706",
  "latitude": 40.72468,
  "longitude": -73.54074,
  "categories": ["Party"],
  "respondedCount": 3,
  "ticketUrl": "https://www.pinotspalette.com/eastmeadow/event/934526",
  "organizerIsPage": true,
  "organizerName": "Pinot's Palette (East Meadow)",
  "organizerUrl": "https://www.facebook.com/pinotspaletteeastmeadow",
  "organizerVerified": false,
  "source": "search:halloween party | New York",
  "scrapedAt": "2026-10-03T13:48:08Z"
}
```

### What you can do with it

- **Event lead generation:** list the pages that host events in a city or niche (venues, promoters, festivals, studios), with their Facebook page, ticketing link and how many people responded.
- **Event calendars and city guides:** feed a newsletter, app or website with upcoming events, UTC times and GPS coordinates.
- **Competitor and venue monitoring:** schedule a page and get its new events every day.
- **Market research:** what is on, where and when; which categories and ticket providers dominate a city.

### Search Facebook events by keyword and city

```json
{
  "searchQueries": ["halloween party", "tech conference"],
  "locations": ["New York", "London"],
  "startDate": "2026-10-24",
  "endDate": "2026-11-01",
  "maxItems": 50
}
```

| Field | What it does |
|---|---|
| `searchQueries` | Keywords as you would type them on Facebook: `halloween party`, `tech conference`, `jazz`, `food festival` |
| `locations` | City names in English (`New York`, `London`, `Paris, France`) or a numeric Facebook city id. Every keyword is searched in every city |
| `dateFilter` | `any`, `today`, `tomorrow`, `this_week`, `this_weekend`, `next_week`, `next_30_days`, `custom` |
| `startDate`, `endDate` | Date window, `YYYY-MM-DD` |
| `category` | Facebook's event category: `music`, `party`, `food`, `networking`, `comedy`, `sports`, `art`, `wellness` and 15 more |
| `exactCityOnly` | Keep only events whose city is exactly the one you asked for (see the note below) |
| `includePastEvents` | Also return events that already happened |
| `maxItems` | Upper limit per keyword and city pair, per page and per search link |
| `onlyNew` | For schedules: delivers, and charges, only events not delivered by earlier runs (see below) |

**About the city filter.** The Actor applies Facebook's own location filter, and Facebook reads it as "in or near the city": a search in New York also returns Hoboken or East Meadow. Turn on `exactCityOnly` to drop the neighbours; dropped events are not charged.

### Get all events of a Facebook page

```json
{
  "startUrls": ["https://www.facebook.com/RoyalAlbertHall"],
  "maxItems": 100
}
```

A page link or just the page name works. You get the events the page hosts, upcoming first. With `includePastEvents` the list continues into past events, newest first.

### Scrape Facebook event links

```json
{
  "startUrls": [
    "https://www.facebook.com/events/457586111619974/",
    "https://www.facebook.com/events/search/?q=food%20festival"
  ]
}
```

Event links return one row each. An events search link is scraped with the filters you picked on Facebook. A link to a private or removed event returns a free `EVENT_NOT_FOUND` row.

### Schedule it daily: only new events

Turn on `onlyNew`, save your keywords, cities or pages as a Task and attach a daily Schedule:

```json
{
  "searchQueries": ["tech conference"],
  "locations": ["London"],
  "maxItems": 50,
  "onlyNew": true
}
```

- The first run delivers up to `maxItems` and marks every other event it found as seen.
- Every run after that delivers, and charges, only events you have not received before. Already delivered events are skipped before their page is opened, so they cost nothing and do not count toward `maxItems`.
- Facebook shows logged-out visitors a different slice of the search each time, so the first few runs may still bring events that existed before but never reached you. Never a repeat.
- The same input is searched again only after 30 minutes: a run started sooner ends at once, without searching, and charges nothing. Hourly or daily schedules are not affected.
- A day with nothing new ends successfully with the status "No new events since the last run" and charges nothing.
- The memory lives in a Key-Value Store in your own Apify account (`facebook-events-scraper-only-new`), one record per search, page and filter set. Delete it to start over. Event links are always delivered.
- Connect Slack, e-mail or Google Sheets to the Task and new events land where you read them.

### Output fields

| Field | Meaning |
|---|---|
| `id`, `url`, `name`, `description` | The event |
| `startUtc`, `endUtc`, `startTimestamp`, `endTimestamp` | Start and end in UTC (ISO 8601 and Unix seconds). `endUtc` is empty when the host set no end time |
| `timezone`, `dateText`, `duration` | Time zone abbreviation and the date line exactly as Facebook shows it in the event's local time |
| `isOnline`, `onlineUrl`, `isCanceled`, `isPast` | Status flags |
| `isRecurring`, `seriesId`, `otherOccurrences` | Recurring events: the row is the next date (or the date inside your date window); `otherOccurrences` lists the neighbouring dates with their own links |
| `venueName`, `address`, `city`, `cityId`, `latitude`, `longitude`, `venuePageUrl` | Where it happens |
| `categories` | Facebook's categories for the event |
| `respondedCount` | People who responded (interested or going) as shown to visitors without login |
| `interestedCount`, `goingCount` | Filled only when Facebook exposes the split for that event; usually empty |
| `ticketUrl`, `ticketProvider` | Tickets link and provider when the host added one |
| `imageUrl` | Cover image |
| `organizerIsPage`, `organizerName`, `organizerUrl`, `organizerId`, `organizerVerified` | The hosting page. Filled only when Facebook marks the event as owned by a Page |
| `source`, `scrapedAt` | Which input produced the row, and when |
| `error`, `errorCode` | Only on free error rows |

### Pricing

**US$ 8.50 per 1,000 events**, pay per result, no monthly rental and no start fee. US$ 8.08 on Bronze, US$ 7.65 on Silver, US$ 7.23 on Gold and above.

- 30 events (the default example): about US$ 0.26
- 300 events from 3 keywords in 2 cities: about US$ 2.55
- 1,000 events: US$ 8.50

You are charged once per unique event delivered. Not charged: error rows, duplicates across keywords, past events you did not ask for, events dropped by `exactCityOnly`. Proxy and compute are already inside the price. Set a maximum charge per run in the run options and the Actor stops there.

### How to use it

- **API:** open the **API** tab on the Actor page and copy the `run-sync-get-dataset-items` endpoint; POST the input JSON as the body and the events come back in the response.
- **Schedule:** save the input as a task and add a schedule in the Apify Console (daily for a page or a city is typical).
- **Integrations:** n8n, Make and Zapier have Apify nodes: run the Actor, then read the dataset. Webhooks fire when a run ends. Export as JSON, CSV, Excel or XML.
- **MCP / AI agents:** the Actor works as a tool through the Apify MCP server.

### Limits you should know

- **Public events only, as a visitor without login sees them.** Private events, events of groups, and pages restricted by age or country (many bars and clubs) need a login and are not returned.
- **Depth of a search.** Without login Facebook shows roughly 50 to 150 events per search, sometimes fewer. The Actor repeats each search across several sessions and merges the results, so two runs can return slightly different sets. For big jobs use several keywords, date windows, categories or cities; duplicates are removed and never charged twice.
- **Date windows.** Facebook matches a recurring series when any of its dates is inside the window; the Actor returns the date that falls inside it and drops (free of charge) what it cannot place in the window.
- **Ticket price is not shown to visitors without login.** You get the tickets link and the provider.
- **Organizer.** Returned only when the event belongs to a Facebook Page. Events created from a personal profile come without organizer name and link. Guest lists and attendee names are never collected.
- **City names.** Type the city in English. If a small town is not recognised, the Actor falls back to a text search and logs it.

### FAQ

**Do I need a Facebook account or cookies?** No. Everything is read as a logged-out visitor.

**Is it legal to scrape Facebook events?** The Actor reads only public event pages, the same a visitor without an account sees, and collects no private profiles or attendee lists. You are responsible for how you use the data; check the rules that apply to you.

**Why did my search return fewer events than `maxItems`?** That is all Facebook showed to visitors for that keyword, city and date. Try a broader keyword, remove the category, or split by date.

**Why is `interestedCount` empty?** Logged-out visitors see one number per event, the people who responded. It is in `respondedCount`.

**Can I get events near coordinates?** Use the nearest city in `locations`; every row has `latitude` and `longitude` to filter by distance afterwards.

**Something broke?** Open an issue on the Actor page with the run id. Issues are answered within a day.

This Actor collects only public data and respects the site's terms regarding non-public content.

### Changelog

- **2026-10-13:** `onlyNew` waits 30 minutes before searching the same input again; a run started sooner ends at once and charges nothing.
- **2026-10-04:** `onlyNew` (alias `onlyNewEvents`) for daily schedules: only events not delivered by earlier runs are delivered and charged; a day with nothing new charges nothing.
- **2026-10-03:** first release. Keyword and city search, page events, event and search links, category and date filters, free error rows.

# Actor input Schema

## `searchQueries` (type: `array`):

Words as you would type them in the Facebook events search, one per line, for example halloween party, tech conference, jazz or food festival. Each keyword is searched in each city, and every row says which keyword and city found it. Leave empty to get whatever is on in the cities. Each event is charged once as 'Event delivered'.

## `locations` (type: `array`):

City names in English, one per line, for example New York, London, "Paris, France" or Sydney. The Actor finds the Facebook city and applies Facebook's own location filter, which also returns events in nearby towns (see 'Only events inside the city'). A numeric Facebook city id works too. Leave empty to search everywhere.

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

Facebook links, one per line: event links (facebook.com/events/123...) return that event; page links or page names (facebook.com/RoyalAlbertHall) return the events the page hosts; events search links (facebook.com/events/search/?q=...) keep the filters you chose on Facebook.

## `dateFilter` (type: `string`):

Time window for keyword and city searches: Any upcoming date (default), Today, Tomorrow, This week, This weekend, Next week, Next 30 days, or Between the dates below. Not applied to pages and event links.

## `startDate` (type: `string`):

Start of a custom window, as YYYY-MM-DD, for example 2026-12-01. Setting a date is enough; there is no need to also pick "Between the dates below" in 'When'.

## `endDate` (type: `string`):

End of a custom window, as YYYY-MM-DD, for example 2026-12-31. Defaults to 30 days after the start date.

## `category` (type: `string`):

Facebook's own event category, for example music, comedy, food, fitness, networking or party. Default 'Any'. It works together with a keyword; a very generic keyword plus a category can return nothing.

## `exactCityOnly` (type: `boolean`):

Off (default): Facebook's location filter means "in or near the city". On: keep only events whose city is exactly the one you asked for. Events dropped by this filter are not charged.

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

Off (default): only upcoming and ongoing events. On: page links also return the page's past events, newest first, useful to study a venue's history.

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

Upper limit of events for each keyword and city pair, each page and each search link, for example 30. Without login Facebook shows roughly 50 to 150 events per search; split a big job into several keywords, dates or categories. You pay per event delivered, so this caps the cost of each search.

## `onlyNew` (type: `boolean`):

For scheduled runs. Remembers which events of each search, page or search link were already delivered (in a named key-value store in your account, 'facebook-events-scraper-only-new') and skips them on the next runs, before opening the event page: they are not delivered, not charged and do not count toward the limit. The first run also marks the events past your limit as seen. A run with nothing new ends successfully and charges nothing. The same input is searched again only after 30 minutes; an earlier run ends at once and charges nothing. Event links are always delivered.

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

Leave as is. Searches go through residential IPs and event pages through datacenter IPs automatically, and the proxy cost is already inside the event price. Change it only to use your own proxies.

## Actor input object example

```json
{
  "searchQueries": [
    "halloween party"
  ],
  "locations": [
    "New York"
  ],
  "maxItems": 30,
  "onlyNew": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `resultsCsv` (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 = {
    "searchQueries": [
        "halloween party"
    ],
    "locations": [
        "New York"
    ],
    "maxItems": 30,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/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 = {
    "searchQueries": ["halloween party"],
    "locations": ["New York"],
    "maxItems": 30,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/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 '{
  "searchQueries": [
    "halloween party"
  ],
  "locations": [
    "New York"
  ],
  "maxItems": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapewise/facebook-events-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapewise/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/ZamgGYz3nIBeOGWId/builds/oIdIM0zRTSEKe8X9o/openapi.json
