Facebook Events Scraper
Pricing
$19.99/month + usage
Facebook Events Scraper
Scrape Facebook events effortlessly using this Apify actor. It collects event titles, dates, venues, organizers, and links from Facebook pages or search results. Ideal for market research, event aggregation, or trend analysis with structured, exportable data in JSON, CSV, or Excel formats.
Pricing
$19.99/month + usage
Rating
5.0
(1)
Developer
Scraper Engine
Maintained by CommunityActor stats
2
Bookmarked
108
Total users
0
Monthly active users
6 days ago
Last modified
Categories
Share
Facebook Events Scraper — Dates, Locations and Attendance Data
Facebook Events Scraper turns a list of search keywords into structured JSON of public Facebook events — event name, date and time, venue location, organizer, and going/interested attendance counts, pulled straight from each event's own page. No Facebook login or cookies required. Results write to the Apify dataset live as each event finishes enriching. Start a run on the Store listing below to see it in action.
🎉 What is Facebook Events Scraper?
Facebook Events Scraper is an Apify Actor that accepts a list of search phrases and returns structured data for the public Facebook events matching them — names, dates, venues, organizers, and attendance counts as typed JSON. It runs entirely without a Facebook account, login, or session cookie: every field is read from event pages that are already visible to an anonymous visitor. It's built for market researchers, local-SEO teams, community organizers, and developers who need a live feed of public event activity without maintaining their own scraping pipeline.
🔓 What Facebook event data is publicly available to scrape?
Anyone can view a public Facebook event's name, date, description, venue, organizer, cover image, and approximate going/interested counts without logging in — Facebook only login-gates the search results page itself, not the event pages it links to.
| Data category | Publicly visible (no login) | Requires Facebook login |
|---|---|---|
| Event name, date sentence, description | Yes | |
| Venue name, address, coordinates | Yes, when the page embeds them | |
| Approximate going / interested counts | Yes (rounded, e.g. "1.4K") | Exact live counts |
| Organizer name and profile link | Yes, when stated on the page | Organizer's private profile fields |
| Cover image | Yes | |
| Recurring-occurrence links | Yes, when present in the page data | |
| Keyword-based event search results page | Yes — login-gated platform-wide as of 2026-08-01 | |
| Full guest list, comments, private RSVPs | Yes |
Facebook Events Scraper only returns publicly visible data — what any visitor sees on an event's own page. Nothing behind a login wall.
📋 What data can I extract with Facebook Events Scraper?
Every run returns one JSON row per event, covering identity and descriptive fields, date and scheduling fields, and engagement/media/metadata fields — 32 fields in total.
Identity & descriptive fields
| Field | Description |
|---|---|
inputUrl | Relative Facebook search URL used to discover this event, e.g. /events/search/?q=jazz%20night |
url | Canonical public Facebook event page URL |
id | Facebook's numeric event ID |
name | Event title, read from the event page's og:title tag |
description | Event description text, from the page's embedded JSON or og:description |
address | Composed address string (street, city, country), or the venue name when no street-level address is found |
location | Nested venue object: url, id, name, contextualName, placeType, latitude, longitude, countryCode, streetAddress, city |
organizedBy | Name of the primary organizer, when stated on the page |
organizators | Array of organizer objects: name, id, url, isVerified |
imageUrl | Event cover image URL, from og:image |
imageCaption | Reserved for a cover-image caption — not populated by the current pipeline (always null) |
ticketsInfo | Reserved for ticketing details — not populated by the current pipeline (always null) |
discoverySource | How the event was found — always "google_serp" in the current pipeline |
Date & scheduling fields
| Field | Description |
|---|---|
dateTimeSentence | Human-readable date/time sentence, uppercased, e.g. "FRIDAY, AUGUST 21, 2026" |
startTime | The same date sentence in original casing, used as a fallback start-time string |
utcStartDate | Reserved for an ISO-8601 UTC start timestamp — not populated by the current pipeline (always null) |
duration | Human-readable event duration, when the page states one |
eventFrequency | Recurrence label — always "SINGLE" in the current pipeline (recurring-series classification isn't wired in) |
hasChildEvents | true if recurring occurrences were found in the page's embedded JSON |
childEvents | Array of occurrence objects: id, url, name, dateTimeSentence |
isPast | Reserved to flag past events — always false in the current pipeline |
isCanceled | Reserved to flag canceled events — always false in the current pipeline |
Engagement, media & metadata fields
| Field | Description |
|---|---|
usersGoing | Approximate "going" count, parsed from the page's going/interested sentence (Facebook abbreviates as e.g. "1.4K") |
usersInterested | Approximate "interested" count, parsed the same way |
usersResponded | usersGoing + usersInterested |
isOnline | Reserved to flag online events — always false in the current pipeline |
eventType | Event visibility type — always "PUBLIC" (only public events are discoverable via a public search index) |
privacyInfo | Privacy sentence, either extracted from the page or composed from eventType + organizedBy |
discoveryCategories | Array of {url, label} category tags Facebook attaches to the event, when present |
externalLinks | Array of external URLs found in the event description |
externalLinksSource | Reserved field noting where externalLinks came from — not populated by the current pipeline (always null) |
scrapedAt | ISO-8601 UTC timestamp of when the row was pushed |
The dataset's default view surfaces 29 of these 32 fields; inputUrl, externalLinksSource, and discoverySource are hidden from the view table but present in every row and available through the full dataset export or the API.
🤖 Add-on: Need additional Facebook data?
Pair this with Facebook Group Posts And Details Scraper : Comments & Engagement Analytics to pull the discussion happening in the groups that promote these events, or run Google Maps Extractor alongside it to cross-reference event venues against verified local business listings. Both are Scraper Engine Actors that share the same JSON-first, no-login approach.
🆚 Why not build this yourself?
Facebook does not offer an open, keyless way to search public events by keyword. The Graph API's page-content and event endpoints require Meta app review and Page Public Content Access before they return anything beyond your own app's data, and general Graph API access has grown steadily more restricted for third-party developers (observed via Meta's developer documentation and related coverage, checked 2026-08-04). Facebook's own on-site events-search page went login-gated platform-wide on 2026-08-01 — even a logged-out browser now sees "Log in or sign up to view" instead of results. Building this yourself means chasing Facebook's internal GraphQL query IDs, handling constant selector and endpoint churn, and still hitting the same login wall the moment the search endpoint changes — exactly why this Actor now discovers events through Google's public search index instead of Facebook's own search. Facebook Events Scraper keeps that pivot, the retry logic, and the proxy routing maintained for you, behind one Actor call.
🚀 How to use Facebook Events Scraper
Facebook Events Scraper runs like any Apify Actor — no separate signup or API key beyond your Apify account.
- Open the Actor on its Apify Store listing and click Start, or launch it from the Apify Console or API.
- Provide the required input —
searchQueries, an array with at least one search phrase (e.g."jazz night","tech meetup"). - Optionally set
maxEvents(1–1000, default 10) to cap results per query, and narrowproxyConfigurationby country if needed — the proxy group itself always staysRESIDENTIAL. - Start the run.
- Read results live from the dataset as they're pushed, or download the finished run as JSON, CSV, Excel, XML, RSS, or HTML.
How to scale to bulk event extraction
searchQueries is the bulk-input mechanism — add one phrase per line and every query runs in the same call, merged into one dataset, with maxEvents applied per query rather than as a total cap. There is no separate bulk-URL or bulk-event-ID input: this Actor discovers events by keyword search only. If your workflow needs data for a fixed list of already-known event URLs rather than open-ended discovery, this Actor is not built for that use case.
💡 What can you do with Facebook event data?
- 📈 A market researcher tracking event density by niche uses
discoveryCategoriesandorganizedByto see which organizers and categories dominate a search term. - 🗺️ A local-SEO or city-guide editor building a "this week" listings page uses
dateTimeSentence,address, andlocationto auto-populate a local events calendar. - 🎟️ A promoter benchmarking demand for a themed event uses
usersGoingandusersInterestedto compare attendance signals across similar events before booking a venue. - 🏟️ A community manager scouting active hosts uses
organizedByandorganizatorsto shortlist organizers already running events in their niche. - 🤖 An AI engineer building a local-events assistant feeds
description,dateTimeSentence, andlocationstraight into a RAG pipeline or agent tool, without writing an HTML parser.
Because every field lands as typed JSON, the same output can be queried by an LLM agent or piped into a no-code workflow without extra parsing.
🛡️ How does Facebook Events Scraper handle rate limits and blocking?
Every event-page fetch routes through Apify Proxy's RESIDENTIAL group — this is hard-enforced in the code and cannot be disabled from the input, because datacenter and direct IPs have proven unreliable against facebook.com in live testing. The separate Google-search discovery step uses Apify's dedicated GOOGLE_SERP proxy group instead, kept fully independent from the RESIDENTIAL pool used for Facebook itself. Each request retries up to 3 times with exponential backoff (1s, 2s, 4s), rotating to a fresh proxy IP whenever a response looks blocked (a 403/429 status, a rate-limit message, or a tunnel/connection error). Event enrichment runs with up to 25 concurrent requests per run. Google-search discovery paginates until it collects maxEvents results, hits two consecutive empty result pages, or reaches Google's own pagination ceiling for that query — whichever comes first. ⚠️ If an individual event page still fails after 3 retries, the Actor does not drop it: it pushes the row anyway with whatever data it already has (at minimum the URL and ID), so one blocked page never breaks the rest of a run. The Actor fetches server-rendered HTML and JSON directly — it does not run a headless browser or solve CAPTCHAs.
⬇️ Input
| Parameter | Required | Type | Description | Example value |
|---|---|---|---|---|
searchQueries | Yes | array (string list) | One Facebook event search phrase per line; every line is processed as its own search theme, in order. | ["jazz night", "tech meetup"] |
maxEvents | No | integer | Maximum number of events to return per search query. Minimum 1, maximum 1000, default 10. | 25 |
proxyConfiguration | No | object (proxy editor) | Apify Proxy configuration. You can narrow by country, but the proxy group is always forced to RESIDENTIAL for event-page fetches regardless of what you select here. | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} |
⚠️ Residential is hard-enforced. Facebook's event pages have proven unreliable over datacenter and direct connections in live testing, so this Actor always uses the RESIDENTIAL proxy group for event-page fetches — even if you set proxyConfiguration to "no proxy" or a different group. You can still restrict RESIDENTIAL to a specific country through this input.
Example input
{"searchQueries": ["jazz night", "tech meetup", "art fair"],"maxEvents": 25,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
⬆️ Output
Every row is typed, normalized JSON with the same field names on every run, regardless of how Facebook's page layout changes. Facebook Events Scraper is charged per event row pushed to the dataset (the row_result event) — there is no separate uncharged status or error row. Results are available through the standard Apify dataset export: JSON, CSV, Excel, XML, RSS, or HTML, or straight from the dataset via the Apify API.
Example output
{"inputUrl": "/events/search/?q=jazz%20night","url": "https://www.facebook.com/events/1202620635007207/","id": "1202620635007207","name": "Downtown Jazz Night","eventFrequency": "SINGLE","dateTimeSentence": "FRIDAY, AUGUST 21, 2026","utcStartDate": null,"startTime": "Friday, August 21 2026","imageUrl": "https://scontent.xx.fbcdn.net/v/t39.30808-6/jazz_night_cover.jpg","imageCaption": null,"duration": "3 hr","description": "Jazz event in Seraing, Belgium by Blue Note Collective on Friday, August 21 2026 with 1.4K people interested and 145 people going. Tickets: https://example-tickets.com/jazz-night","address": "12 Rue des Arts, Seraing, BE","isCanceled": false,"hasChildEvents": false,"childEvents": [],"usersGoing": 145,"usersInterested": 1400,"usersResponded": 1545,"location": {"url": "https://www.facebook.com/lecomptoirseraing/","id": "104938271","name": "Le Comptoir, Seraing","contextualName": "Le Comptoir, Seraing","placeType": "PLACE","latitude": 50.6167,"longitude": 5.4,"countryCode": "BE","streetAddress": "12 Rue des Arts","city": "Seraing"},"ticketsInfo": null,"organizedBy": "Blue Note Collective","organizators": [{"name": "Blue Note Collective","id": "61556325142266","url": "https://www.facebook.com/profile.php?id=61556325142266","isVerified": false}],"eventType": "PUBLIC","privacyInfo": "Public · Hosted by Blue Note Collective","isPast": false,"isOnline": false,"discoveryCategories": [{"url": "https://www.facebook.com/events/discovery/category/music/","label": "Music"}],"externalLinks": ["https://example-tickets.com/jazz-night"],"externalLinksSource": null,"scrapedAt": "2026-08-04T09:15:00.000Z","discoverySource": "google_serp"}
⚙️ How does it work?
Facebook Events Scraper doesn't call Facebook's own search feature — that endpoint now returns "Log in or sign up to view" for anonymous requests, confirmed live as of 2026-08-01. Instead, for each search phrase, the Actor queries Google's public index (site:facebook.com/events <phrase>) through Apify's GOOGLE_SERP proxy group to find real, currently-public event URLs. It then fetches each event's own page — still viewable by anyone, logged in or not — through Apify's RESIDENTIAL proxy group, and parses the page's meta tags and embedded JSON with BeautifulSoup to pull out name, date, description, location, organizer, and attendance figures. No headless browser is used, and nothing but publicly visible content is read. Because fields are read from structural signals — meta tags, JSON keys — rather than fixed CSS selectors, the output schema stays stable even when Facebook changes its page layout.
🔌 Integrations
Facebook Events Scraper runs on the Apify platform, so it works with the same tools every Apify Actor does — no separate API key or signup flow beyond your Apify account.
Calling Facebook Events Scraper programmatically
from apify_client import ApifyClientclient = ApifyClient("<APIFY_API_TOKEN>")run = client.actor("facebook-events-scraper-pay-per-events").call(run_input={"searchQueries": ["jazz night", "tech meetup"],"maxEvents": 25,})for event in client.dataset(run["defaultDatasetId"]).iterate_items():print(event["name"], event["dateTimeSentence"])
Works in Go, Ruby, Node.js, cURL — any language that can make an HTTP request.
No-code tools (n8n, Make)
In n8n, use the HTTP Request node (or the official Apify node) pointed at this Actor's run endpoint with your API token, and parse the returned JSON directly. In Make, the Apify app's "Run an Actor" module starts the run, and a follow-up "Get Dataset Items" call retrieves the rows. Either way, no custom HTML parsing is needed on your end — the Actor already returns typed fields.
⚖️ Is it legal to scrape Facebook events?
Scraping publicly visible Facebook event pages — the same names, dates, venues, and attendance counts any logged-out visitor can see — is generally lawful; legal exposure in web scraping usually comes from how data is collected and used, not from reading public pages. Facebook Events Scraper returns only publicly available event data: it does not access private guest lists, comments, or messages, and it never logs in. Because the core entity here is a public event listing rather than a personal profile, the relevant framework is Facebook's Terms of Service and general database/content-scraping law rather than GDPR or CCPA, which govern personal data specifically — an event's core fields (name, date, venue, aggregate attendance count) are not personal data about an identifiable individual. Some fields, such as organizedBy, can name an individual host rather than a business page. Consult legal counsel if your use case involves bulk storage of personal data.
❓ Frequently asked questions
What Facebook event fields does Facebook Events Scraper return?
The core fields are name, dateTimeSentence, location, usersGoing/usersInterested, and organizedBy, plus 27 more covering description, images, categories, and recurrence — see the field tables above for the full list.
Does Facebook Events Scraper require a Facebook account or login?
No. Every field is read from an event's own public page, which Facebook still serves to logged-out visitors; the Actor never logs in, stores cookies, or uses a Facebook session.
How many events can I extract in one run?
Up to maxEvents (1–1000, default 10) per search query, times however many queries you list in searchQueries — there's no fixed cap on the number of queries per run. Actual counts depend on how many public event pages Google's index surfaces for each phrase.
What happens if a search query returns zero events?
The Actor logs a warning and moves on to the next query instead of failing the run. This happens when Google's public index has no indexed facebook.com/events page matching that phrase — try a broader or more common phrase if you consistently get zero results.
Can I scrape multiple Facebook event searches at once?
Yes — searchQueries accepts an array, and every line is processed in the same run and merged into one dataset. There's no separate bulk-URL or event-ID input mode; this Actor is keyword-search-only.
Why does Facebook Events Scraper use Google search instead of Facebook's own search?
Because Facebook's own anonymous events-search endpoint stopped returning results and now shows a login wall, confirmed live as of 2026-08-01. The Actor instead finds event URLs through Google's public index of facebook.com/events pages, then reads each event's own detail page — which is still public — for every field.
Does Facebook Events Scraper work with Claude, ChatGPT, and other AI agent tools?
Yes, as an HTTP endpoint — any agent framework that can call the Apify API or apify_client can trigger a run and read the resulting JSON. There is no dedicated MCP server published for this Actor.
Does Facebook Events Scraper return data in a format LLMs can use directly?
Yes. Every row is typed, normalized JSON with the same field names on every run — no HTML parsing or CSS selectors required. Pass it directly to an LLM, index it into a vector store, or feed it to an agent tool.
What happens when Facebook changes its layout or anti-bot system?
Field extraction is built around structural signals — meta tags and embedded JSON keys — rather than fixed CSS selectors, so minor layout changes typically don't break field mapping. The Actor is actively maintained; no specific update turnaround time is published.
Can I use Facebook Events Scraper without managing proxies or browser infrastructure?
Yes. Apify Proxy (RESIDENTIAL for event pages, GOOGLE_SERP for discovery) is configured and rotated automatically — you never provide or manage a proxy list. The Actor also doesn't run a headless browser; it fetches HTML and JSON directly, so there's no browser infrastructure to manage either.
Which Facebook event fields work best for AI training data and RAG indexing?
For RAG, index description, dateTimeSentence, and address — they carry the most free-text context. For structured training data, usersGoing, usersInterested, eventType, and hasChildEvents are the most consistently populated typed fields; reserved fields like utcStartDate, ticketsInfo, and imageCaption are not currently populated and should be excluded from training features.
🔗 Related scrapers
| Scraper | What it extracts |
|---|---|
| Facebook Group Posts And Details Scraper : Comments & Engagement Analytics | Posts, comments, and engagement data from public Facebook groups |
| LinkedIn Search Jobs Scraper By Multiple Keywords & Locations | Job listings from LinkedIn, by keyword and location search |
| Threads Search Post Scraper: Posts, Quotes & Replies | Posts, quotes, and replies from Threads keyword search |
| Google Maps Extractor | Local businesses and venues from Google Maps search |
💬 Your feedback
Found a bug, or a field that's coming back empty when it shouldn't? Open the Issues tab on this Actor's Apify Store page and let us know — that's the fastest way to get a fix into the next update.

