Facebook Events Scraper avatar

Facebook Events Scraper

Pricing

from $2.39 / 1,000 item extracteds

Go to Apify Store
Facebook Events Scraper

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.

Pricing

from $2.39 / 1,000 item extracteds

Rating

0.0

(0)

Developer

Fetch Cat

Fetch Cat

Maintained by Community

Actor stats

0

Bookmarked

5

Total users

3

Monthly active users

a day ago

Last modified

Features

Limited permissions

Share

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.

Ready-to-run examples

Choose a public example to see its settings before starting a run:

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 keyTypeRequiredDescription
Facebook URLs / startUrlsarrayAlternativeDirect event URLs or public page, profile or group event-list URLs. Search and shared links are unsupported.
Event IDs / eventIdsarrayAlternativeNumeric Facebook event IDs. Supply URLs, IDs, or both.
Maximum events / maxItemsintegerNoMaximum saved event records across the run. Default 10.
Include past events / includePastEventsbooleanNoSelect past organizer lists and allow older detail records. Default false.
Planning facts / includePlanningDetailsbooleanNoTarget-bound same-response facts. Default false.
Calendar file / exportCalendarbooleanNoExport saved rows only. Default false.
Calendar selection / calendarStart, calendarEndstringNoInclusive/exclusive UTC event-start boundaries; requires calendar export.
Calendar cancellations / calendarIncludeCanceledbooleanNoOmitted 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.

GroupFields
Identity and provenancetype, discoveredVia, id, eventId, inputUrl, url, canonicalUrl, sourceUrl, sourceType, scrapedAt
Core event detailsname, description, isOnline, isCanceled, isPast, eventType, privacyInfo
Dates and timesformattedDate, dateTimeSentence, timezone, startTimestamp, endTimestamp, startISO, endISO, startDate, endDate, utcStartDate, utcEndDate, startTime, duration, durationSeconds
Venue and coordinateslocation, locationName, locationAddress, address, locationCity, locationCountry, locationLat, locationLng, latitude, longitude, onlineDetails
Hosts and organizershosts, organizators, organizedBy, hostName, hostUrl, hostId, hostType, hostPhotoUri, hostCount
Media and linksphoto, photos, photoUri, photoUrl, imageUrl, imageUri, imageCaption, video, videoUrl, videoThumbnailUri, videoThumbnailUrl, coverVideo, ticketUrl, ticketsInfo, externalLinks
Categories, series, and childrencategories, discoveryCategories, categoryLabel, categoryCount, parentEvent, parentEventId, siblingEvents, siblingEventIds, hasChildEvents, childEvents, eventFrequency
Engagement and compatibilityusersResponded, 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.

Pricing

The start event is charged once when startup capacity permits the run, including runs that ultimately save no events. The primary item event is charged for each Facebook event record saved to the dataset. Failed inputs that produce no dataset items do not create item charges.

Use a small item cap for an initial organizer-list sample. See the live Pricing tab for current rates and discounts.

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. Customer cost limits and short timeouts stop work successfully with a warning and RUN_SUMMARY.limitStop, preserving saved rows. Allow at least 103 seconds for useful work (up to three 30-second attempts plus retry and shutdown time); very short limits stop before extraction or explicit charges. Large inputs can stop before reaching the item cap. 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. An explicit Facebook age-restricted logged-out event route also succeeds without event rows; its source outcome is event_unavailable_logged_out_age_restriction. No login or restriction bypass is attempted.
  • Parser failures, unverified blocked responses and unresolved extraction failures are not treated as legitimate emptiness. Any unresolved required extraction failure fails the run. 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.

FAQ

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.

No. Supply event IDs or supported Facebook URLs. City discovery, keyword queries and search-result URLs are not supported.

How do I keep a test run cheap?

Use one direct eventIds value or one direct event URL with maxItems: 1.

  • Facebook Pages Scraper — Collect public Page profile and contact fields, visible audience counts and optional post links.
  • Facebook Ads Library Scraper — Collect public Meta ad copy, advertiser details and available creative links for advertising research.
  • Facebook Posts Scraper — Collect visible public post text, publication dates and media from known Pages, groups or post URLs.
  • Eventbrite Events Scraper — Collect public event URLs, dates, venues and available ticket-price information from Eventbrite.
  • Meetup Events Scraper — Collect public event titles, dates, venues and available RSVP counts from Meetup targets or searches.

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. ♥

⌂ 换网址