Facebook Events Scraper

Export public Facebook event details and organizer event lists with dates, venues, hosts, ticket links, media, and engagement data to CSV, JSON, Excel, or API.

Data fields

FieldTypeDescription
planningDetailsobjectPresent only with includePlanningDetails. Target-ID-bound facts; null means missing or conflicting. Child count is independent of edge co...
typestringValue exported as type.
discoveredViastringValue exported as discoveredVia.
idstringValue exported as id.
eventIdstringValue exported as eventId.
inputUrlstringValue exported as inputUrl.
urlstringValue exported as url.
canonicalUrlstringValue exported as canonicalUrl.

Input preview

startUrlsFacebook URLs
eventIdsEvent IDs
maxItemsMaximum events
includePlanningDetailsInclude source-backed planning facts
exportCalendarExport saved events as a calendar
calendarStartCalendar start (inclusive UTC)

API and agents

This actor can be run through Apify API, datasets, webhooks, schedules, and the official Apify MCP server.

Ready-to-run examples

Open a saved Apify example, adjust the input, and run the actor in your own Apify account.

View all examples

How this actor works

See example inputs, outputs, API usage, and practical limits before running this actor on Apify.

Open Apify page

Extract public Facebook event details and organizer event lists into a dataset for CSV, JSON, Excel, or API use. Collect dates, venues, hosts, ticket links and available media without providing a Facebook login. Anonymous access varies by target.

Quick start

Paste a public event URL or numeric event ID, choose a small maxItems, then run the Actor and open its dataset. For an older event, enable includePastEvents:

{
  "eventIds": ["1855253805343101"],
  "maxItems": 1,
  "includePastEvents": true
}

This is an input recipe, not a guarantee that this event remains publicly accessible. Use an event you can view without signing in.

Prefer a video guide? This short Apify walkthrough shows you how to set up and run an Actor. It uses a different Actor, but the setup steps are the same.

https://youtu.be/1OW8gOqlZbY?t=25

What you get

Facebook Events Scraper collects public event pages and public organizer hosted-event lists. Use it to monitor event calendars, enrich lead lists, track local event activity, or build research datasets without manually opening every event page.

The Actor accepts direct Facebook event URLs, numeric event IDs, and organizer hosted-event URLs such as facebook.com/{page}/upcoming_hosted_events.

Who is it for?

  • Event marketers building outreach lists
  • Local media and community researchers tracking upcoming events
  • Tourism, venue, and entertainment teams monitoring public calendars
  • Data teams enriching event IDs with names, dates, venues, hosts, and media
  • Analysts who need repeatable exports instead of manual copy-paste work

How you can use the data

  • Enrich a known public event ID. Use the existing numeric-ID recipe with a one-event cap. Keep eventId, name, url, startISO, timezone and scrapedAt together, checking available dates and the source page before adding it to a calendar.
  • Review an organizer's public event list. Supply its supported hosted-event URL with a small cap. Inspect host, venue and event links for your own editorial or research sheet. This is not keyword or city-based event discovery.
  • Research an older event explicitly. Enable past events when using the existing older-event recipe. A past-list URL selects the organizer list, while older detail records still require the past-events setting.
  • Plan and import saved events. Enable source-backed planning facts to check known frequency, event kind and child availability. Optionally export saved rows as an ICS calendar, selecting a date window without changing dataset rows, their order or charges. Separate going/interested counts remain unavailable.

Input settings

Setting / API key Type Required Description
Facebook URLs / startUrls array Alternative Direct event URLs or public page, profile or group event-list URLs. Search and shared links are unsupported.
Event IDs / eventIds array Alternative Numeric Facebook event IDs. Supply URLs, IDs, or both.
Maximum events / maxItems integer No Maximum saved event records across the run. Default 10.
Include past events / includePastEvents boolean No Select past organizer lists and allow older detail records. Default false.
Planning facts / includePlanningDetails boolean No Target-bound same-response facts. Default false.
Calendar file / exportCalendar boolean No Export saved rows only. Default false.
Calendar selection / calendarStart, calendarEnd string No Inclusive/exclusive UTC event-start boundaries; requires calendar export.
Calendar cancellations / calendarIncludeCanceled boolean No Omitted means true; false excludes known cancellations from file only. Requires export when supplied.

Provide at least one URL or event ID, with at most 100 combined targets. IDs must contain 5–30 digits. maxItems accepts 1–10,000. URL strings and { "url": "..." } objects are accepted. Remote URL lists are not supported. New inputs use direct public connections. Explicit connection settings are respected. The Actor does not switch to another route when your selected route is unavailable.

Optional planning briefs and calendar import

Both includePlanningDetails and exportCalendar default to false and work independently. Planning reads only the already fetched event HTML. It adds planningDetails and populates corresponding compatibility fields only when target-ID-bound facts are present. Known zero children differs from unknown children: childCount:0 does not imply an exhausted child connection. childInstancesComplete is null without edges, false for partial/unconfirmed edges, and true only with explicit exhausted pagination and a matching known count. Children are descriptive source instances, not extra saved or billed rows. No recurrence rule is inferred.

{
  "eventIds": ["1855253805343101"],
  "maxItems": 1,
  "includePastEvents": true,
  "includePlanningDetails": true,
  "exportCalendar": true,
  "calendarStart": "2026-08-01T00:00:00Z",
  "calendarEnd": "2026-09-01T00:00:00Z",
  "calendarIncludeCanceled": false
}

This is an input recipe, not a promise of ongoing target availability. calendarStart (inclusive) and calendarEnd (exclusive) select event start instants, not overlapping durations; omit them for all saved dates. They require calendar export and valid UTC timestamps. calendarIncludeCanceled is optional and means true when omitted; false excludes only explicitly canceled events from the file. Calendar selection never filters dataset rows, changes maxItems/past-event behavior, charges fewer items, or scans more targets.

With export enabled, download EVENTS_CALENDAR from the run's key-value store (or the calendar Output link) and import that .ics content into your calendar application. CALENDAR_SUMMARY reports included/omitted counts, missing/invalid ends, unknown cancellation and text truncation. These records do not exist with export off. The file uses stable source-ID UIDs, exact UTC instants, escaped UTF-8 text and explicit STATUS:CANCELLED for known cancellations. Unknown start dates are omitted, unknown/invalid end dates have no DTEND, and no duration, attendance status, free admission or recurrence is invented. Calendar applications may visually apply their own default duration to an event without an end.

Export is bounded to 16 MiB in saved-row order; additional rows remain in the dataset but are counted as artifact-limit omissions. Calendar descriptions are limited to 16,384 characters, names/locations to 4,096; truncation affects only the file. Import is a file handoff, not a subscription, update-monitoring service or write to a private calendar. No additional source requests or item charges are made. Small optional local serialization/storage costs remain part of the run. Existing CSV/Excel view columns and their order are unchanged; request JSON for the complete nested planning facts.

Example inputs

Use the Quick start input as a small first run. Adjust the fields described above for your own data.

Output data

Each dataset item represents one Facebook event.

Group Fields
Identity and provenance type, discoveredVia, id, eventId, inputUrl, url, canonicalUrl, sourceUrl, sourceType, scrapedAt
Core event details name, description, isOnline, isCanceled, isPast, eventType, privacyInfo
Dates and times formattedDate, dateTimeSentence, timezone, startTimestamp, endTimestamp, startISO, endISO, startDate, endDate, utcStartDate, utcEndDate, startTime, duration, durationSeconds
Venue and coordinates location, locationName, locationAddress, address, locationCity, locationCountry, locationLat, locationLng, latitude, longitude, onlineDetails
Hosts and organizers hosts, organizators, organizedBy, hostName, hostUrl, hostId, hostType, hostPhotoUri, hostCount
Media and links photo, photos, photoUri, photoUrl, imageUrl, imageUri, imageCaption, video, videoUrl, videoThumbnailUri, videoThumbnailUrl, coverVideo, ticketUrl, ticketsInfo, externalLinks
Categories, series, and children categories, discoveryCategories, categoryLabel, categoryCount, parentEvent, parentEventId, siblingEvents, siblingEventIds, hasChildEvents, childEvents, eventFrequency
Engagement and compatibility usersResponded, usersGoing, usersInterested, paidContent, isClassEvent, isLiveAudioRoom, isRemoteLearningClass, isRemoteLearningCourse, groupEventPinnedToFeatured, hasRecordingAvailable

Available fields depend on the public event. usersResponded is a combined count, not an attendee list. usersGoing, usersInterested, privacyInfo, paidContent, isClassEvent, isLiveAudioRoom, isRemoteLearningClass, isRemoteLearningCourse, groupEventPinnedToFeatured and hasRecordingAvailable remain null.

Default output is unchanged: eventFrequency, eventType, hasChildEvents and imageCaption remain null, childEvents stays empty, and ticketsInfo supplies only an available URL. With includePlanningDetails:true, source-bound facts may populate these fields, plus planningDetails containing frequency, kind, known child count, observed child instances/completeness, ticket context and caption. Null means absent or conflicting, never free/zero/unavailable. The verified public example exposes SINGLE, PUBLIC_TYPE and a known child count of zero; its ticket price/provider and caption are unknown. Ticket labels/provider/price and recurring child connections are supported only when those shapes are actually present; synthetic regression coverage is not proof of their availability on every live event. No recommendation nodes, attendee identities or private/login-only data are included.

Results follow input/discovery order, not chronological order. startTime repeats the formatted date text rather than an isolated clock time. Per-input outcomes and run totals are available in the RUN_SUMMARY key-value-store record. Diagnostic messages are not dataset rows.

More example output

Illustrative shape only. These sample values are not an observed event. Optional fields depend on what Facebook exposes publicly.

{
  "type": "event",
  "eventId": "1855253805343101",
  "name": "Public event name",
  "url": "https://www.facebook.com/events/1855253805343101",
  "dateTimeSentence": "Sun, Aug 9 at 10:00 AM UTC+02",
  "utcStartDate": "2026-08-09T08:00:00.000Z",
  "hostName": "Event organizer",
  "locationName": "Venue name",
  "usersResponded": 123,
  "discoveredVia": "event",
  "scrapedAt": "2026-08-01T14:30:00.000Z"
}

Download your results

Open your run's dataset, choose Export and select JSON, CSV or Excel. JSON keeps nested fields together. CSV and Excel are useful when you want to review the records in a spreadsheet.

See Apify's download and export guide for the available formats and field options.

Tips for best results

  • Use supported event IDs or public event-list URLs. Search and shared links are not supported starting inputs.
  • Start with a small global cap. Organizer lists can contain several events, so inspect the initial output before increasing volume.
  • Set past-event handling deliberately. The default is not a strict future-only filter, and older detail records need the explicit setting.
  • Inspect actual date fields before calendar use. Source text and timezone coverage can vary, and startTime is formatted date text rather than an isolated clock time.
  • Read final status and per-input outcomes. Check RUN_SUMMARY as well as saved records when a target is unavailable or work stops early.

Limits and caveats

The default run has a 15-minute timeout and a shorter processing limit. Large inputs can stop before reaching the item cap, and a shorter custom timeout can stop them earlier. Start a new run rather than restarting or resurrecting one that already began processing.

  • Only public Facebook surfaces are supported.
  • Private events, login-only pages, missing events and blocked pages may not return data. An inaccessible response alone does not establish why a target is unavailable.
  • Organizer list inputs are deduplicated by event ID before enrichment.
  • includePastEvents selects past organizer lists and allows past details. An explicit past_hosted_events URL also selects a past list, but older detail records still require includePastEvents: true. With the default setting, events are filtered only when their end time (or start time if no end is known) is more than 24 hours old. This is not a strict future-only filter.
  • Completed valid lists with no matches and events excluded as past succeed with an empty dataset and truthful reasons in the RUN_SUMMARY key-value-store record.
  • Parser failures, unverified blocked responses and unresolved extraction failures are not treated as legitimate emptiness. All-failed extraction runs fail. Mixed batches preserve useful records and diagnostics.
  • Essential storage, billing and processing-limit failures stop the run. Saved records may remain available in a failed run. Check the final run status as well as its dataset.

Automation and integrations

Save your settings for next time

Once you have an input that works for you, save it as an Apify task. This keeps your settings together so you can use them again without filling in the form from scratch.

Run on a schedule

Need fresh results regularly? You can schedule the Actor or a saved task to run at a time that suits you.

Each scheduled run collects the data again. If you want to compare results or highlight changes, add that step in your own workflow.

Send results to your other tools

Use n8n, Make or Zapier to connect this scraper to the rest of your workflow. For example, you could pass its results to an AI assistant or add records to a spreadsheet. Follow the Apify integration guides for your chosen tool.

For a custom connection, an Apify webhook can notify your app when a run finishes or fails. Your app can then fetch the results or handle the failure.

API usage

Want to collect this data from your own app or automation? The examples below send input to the scraper and show how to collect its results.

The Node.js and Python examples wait for the run to finish before reading its results. The cURL example starts the run and returns its details. Wait for that run to finish, then use its defaultDatasetId to fetch the results.

For setup instructions, see Apify's JavaScript client guide, Python client guide and Actor runs API reference.

cURL

curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~facebook-events-scraper/runs' \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  --data @- <<'JSON'
{
  "eventIds": [
    "1855253805343101"
  ],
  "maxItems": 1,
  "includePastEvents": true
}
JSON

Node.js

import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/facebook-events-scraper').call({
  "eventIds": [
    "1855253805343101"
  ],
  "maxItems": 1,
  "includePastEvents": true
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('fetch_cat/facebook-events-scraper').call(run_input={'eventIds': ['1855253805343101'], 'maxItems': 1, 'includePastEvents': True})
print(client.dataset(run['defaultDatasetId']).list_items().items)

MCP and AI agents

You can ask your AI assistant to collect data with Facebook Events Scraper and help you work with the results. The scraper returns the data, and your assistant can then summarize it, compare records or prepare notes.

Connect your assistant through the Apify MCP server. MCP gives your assistant a way to find this scraper, run it and read the results. Follow the official setup and sign-in guide for your app.

Easier setup with an Apify plugin

If you use a supported coding assistant, the official Apify plugin can set up the connection for you. It connects your assistant to Apify and includes instructions for common tasks. Follow the guide for your particular app.

Use Apify AI in Console

Prefer to keep everything in Apify? Open Apify AI in Console and ask it to find Fetch Cat's Facebook Events Scraper. You can describe the data you want and ask questions about the results.

Apify AI is currently in beta. It asks for confirmation before starting an Actor, and normal run charges apply.

Choose your assistant

Connect just this scraper

To keep your setup focused on this scraper, add this server configuration to a compatible MCP client:

{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=fetch_cat/facebook-events-scraper"
    }
  }
}

Sign in to Apify when your client asks. If your client uses a Bearer token instead, follow its setup guide and keep the token in its secure configuration. Configuration formats vary by app, so use the linked guide if your client needs a different format.

Use Apify's general server

Already connected to the general Apify MCP server at https://mcp.apify.com? You can use it to find this scraper without adding another server. Ask your assistant to use Facebook Events Scraper by Fetch Cat, or give it the identifier fetch_cat/facebook-events-scraper.

Your assistant can check the available settings and retrieve the results from the returned run. If the run is still working, it should follow that run rather than start it again. Both connection options use Apify's hosted service.

Example requests

  • “Use Fetch Cat’s Facebook Events Scraper to retrieve one public event from the numeric ID I provide. Show its available name, source URL, start time and timezone so I can verify it before a calendar import.”
  • “Collect up to 5 events from the public organizer hosted-events URL I provide. Include host names, venue information and source event links, then explain any unavailable targets or partial output.”
  • “Retrieve the older public event ID I supply with past events enabled and a one-event cap. Show available dates and ticket links without inventing ticket prices or attendee information.”

Normal Apify charges apply. Check the live Pricing tab before asking your assistant to run a larger batch.

Pay with x402

If your AI agent has a funded wallet, it can pay for Apify usage through x402. This experimental option lets an agent use Apify without a conventional account.

Apify AGI provides a prepaid API token with a spending cap after payment. Your agent can use that token to run this scraper through the Apify API or an authenticated MCP connection.

Some MCP setups also support paying for each request directly. That is a different payment option, so check the official guide for its availability.

Follow the official guide for wallet setup, supported payment options and current terms. Apify handles the payments. Keep wallet keys and payment tokens in your agent's secure configuration.

Other ways for agents to pay

Apify also supports MPP for prepaid access through AGI and Skyfire for eligible Actors. If your agent already uses one of these, see the agentic payment guide to choose the right setup.

Support and feedback

For custom additions or integrations, email hello@fetchcat.dev.

Found an error or have a feature request? Open an issue with the run URL, a non-sensitive input example and what you expected.

Need help sharing it? See Apify’s guide to sharing a run when reporting an issue. Sharing a run can give the developer access to its input, logs and results, so use a run that contains no sensitive data. Please leave out API tokens, passwords, cookies, private documents and personal data. Use a public sample URL or a redacted example instead.

Tried this scraper? We'd love to hear how it worked for you. Leave a review to help others choose the right tool and help us improve it. Your feedback means a lot to us.

Made with care for curious people, AI agents and the possibilities in data. ♥

Common questions

Questions and answers reused from the canonical actor README.

Can I export public Facebook events to CSV or JSON without logging in?

Yes. Provide public Facebook event URLs or public organizer event-list URLs, then export Facebook events data from the Apify dataset as CSV, JSON, Excel, Google Sheets, or via API.

Can I scrape Facebook organizer event lists through an API?

Yes. Use this Actor as a Facebook events API endpoint through Apify: send organizer URLs, set maxItems, and read normalized event records from the dataset.

Can it scrape private Facebook events?

No. The Actor is designed for public event pages and public organizer event lists only.

Why did my organizer URL return fewer events than expected?

Facebook may expose only a limited public list for anonymous visitors. The Actor saves available discovered events within maxItems, run budgets and charge capacity. Public lists may be incomplete even when more events are visible after login.

Can I scrape past events?

Yes. Set includePastEvents to true for direct event IDs or URLs, or to request an organizer's past-events list.