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,timezoneandscrapedAttogether, 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
startTimeis formatted date text rather than an isolated clock time. - Read final status and per-input outcomes. Check
RUN_SUMMARYas 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.
includePastEventsselects past organizer lists and allows past details. An explicitpast_hosted_eventsURL also selects a past list, but older detail records still requireincludePastEvents: 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_SUMMARYkey-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
- Claude and Claude Code (Anthropic): Apify setup guide.
- ChatGPT and Codex (OpenAI): Apify setup guides.
- Grok Bot (xAI): Apify plugin guide.
- Gemini CLI (Google): MCP server setup guide. Use the server URL below with the HTTP configuration supported by Gemini CLI.
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. ♥