Facebook Events Scraper
Scrape public Facebook events by keyword, city or Page URL. Get name, start and end times, venue address, GPS, organiser, tickets and attendance.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
searchTerms,location,startUrls(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.0009 per event = $0.9 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Event | One public Facebook event delivered to your dataset in full: name, description, start and end time with timezone, venue with address and coordinates, organisers, ticket link, cover image, categories and the going / interested / responded counts. Sample rows, diagnostic rows, events dropped by your filters and events already returned earlier in the same run are never charged. | $0.0009 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-16, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
searchTerms | What to search Facebook events for - 'concert', 'startup meetup', 'food festival'. Up to 20 terms per run, each searched in turn. Facebook's public events search returns up to 8 events per term, so use several terms (and the city box below) to go wider. | array |
location | Optional. A city name such as 'Berlin' or 'New York', or - for an exact area - a Facebook events URL for that city (https://www.facebook.com/events/explore/{city}/{id}/). A city name is looked up against Facebook's own location list; if Facebook has no matching location it is folded into the search text instead and a free note row tells you so. | string |
startUrls | Optional. Any mix of: a public event URL (https://www.facebook.com/events/123456789012345/), a Page URL or handle whose hosted events you want, a Group URL, a Facebook events search URL you built in the browser, or an events explore URL for a city. Up to 50 per run. | array |
maxEvents | Total number of events to return across everything above. Keep it low while you are testing - you pay per event. | integer |
startingFrom | Optional and free. Drop events that start before this. Accepts 2026-09-01, a full ISO timestamp, an epoch, or a relative window such as '7 days'. Filtered events are never charged. | string |
startingBefore | Optional and free. Drop events that start after this. Same formats as above. | string |
category | Optional and free. Restrict the search to one of Facebook's own event categories. | string |
onlineOnly | Optional and free. Return only events Facebook marks as online. | boolean |
paidOnly | Optional and free. Ask Facebook's search for paid events only. | boolean |
includePastEvents | Optional and free. Off by default, so you get upcoming events. Turn it on to also read a Page's or Group's past events. | boolean |
proxyUrls | Leave this empty for a normal run. Fill it in only if you want the traffic to leave through proxy servers you already pay for, one URL per line, in the form http://user:pass@host:port. | array |
sessionCookies | Leave this empty unless you need it. Runs are logged out by default and that is enough for public Facebook content. Facebook shows some things only to a signed-in account, and it limits how fast any one account may read; supplying your own cookie uses your account and your own rate limit, shared with nobody. In Chrome: open facebook.com while signed in, press F12, then Application > Cookies > https://www.facebook.com, and paste the values as "c_user=…; xs=…". One line per account. Treat these like a password: anyone with them can act as that account, and Facebook may sign the session out or restrict the account for automated use. | array |
What you get
A structured dataset — each result includes fields like:
eventIdeventUrlnamedescriptionstartTimestartTimestampendTimeendTimestamptimezonedateTextvenueNamevenueAddressvenueCityvenueUrlExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Developer & Research Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
GitHub Scraper
Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.
arXiv Scraper
Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.
Crossref Scholarly Works Scraper
Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.
Where this tool sits
- Categories
- Developer & Research Tools
Facebook Events Scraper: public events by keyword, city, Page or link
Search Facebook events by keyword, narrow it to a city, or paste event, Page and Group links. Every event comes back as one row: name, description, start and end time with the timezone, venue and coordinates, organiser, ticket link and how many people said they are going.
The number to plan around: Facebook's public events search hands back about eight events per search term. One term is a sample, not a sweep. Several terms, a city, or a list of Pages is what makes a run worth doing.
| Input | Search terms, a city, or event, Page and Group links |
| Output | One row per event |
| Ceiling | 1,000 events per run |
| Account needed | None from you |
| Price | $0.90 per 1,000 events, flat on every plan |
🔍 What Facebook Events Scraper does
Each search term is run in turn, a city narrows them, and anything you paste into startUrls is followed as well. An event found twice, once by search and once from its organiser's Page, is delivered once and charged once.
Then every event that makes the cut is opened for the full detail. That is where the description, the exact times, the venue coordinates, the organisers and the ticket link come from, rather than the thin card the search results carry.
A city name is matched against Facebook's own location list. A handful of well-known names collide with same-named towns in the United States, so Rome, Hamburg, Brussels, Warsaw and Bristol can resolve to the smaller one. If the city matters, open Facebook events in your browser, pick the city there, and paste that events/explore/ URL into location instead. When a name resolves to nothing at all, the run folds it into the search text and tells you in a free note row.
📥 What you give it
{
"searchTerms": ["music festival", "food festival"],
"location": "Berlin",
"maxEvents": 20,
"startingFrom": "7 days"
}
| Field | Default | What it is |
|---|---|---|
searchTerms | none | What to search for: concert, startup meetup, food festival. Up to 20 terms, each searched in turn. |
location | none | A city name, or an events/explore/ URL for an exact area. |
startUrls | none | Any mix of event links, Page links or handles whose events you want, Group links, a search URL you built in the browser, or a city explore URL. Up to 50. |
maxEvents | 20 | Total events across everything above, 1 to 1,000. This is your spend ceiling. |
startingFrom, startingBefore | none | The date window. 2026-09-01, a full timestamp, an epoch, or something like 7 days. Filtered events are never charged. |
category | none | One of Facebook's own event categories, from music to gardening. |
onlineOnly | off | Only events Facebook marks as online. |
paidOnly | off | Only ticketed events. |
includePastEvents | off | Also read a Page's or Group's past events. Off means upcoming only. |
proxyUrls | none | Optional. One URL per line if you want the traffic to leave through servers you already pay for. |
sessionCookies | none | Optional, and most runs never touch it. Your own c_user and xs pair, so heavy runs use your account's own rate limit. Treat the values like a password. |
Run it with empty input and you get one labelled sample row, free, so you can see the shape before you spend anything.
📤 What you get back
A real row from a real run, with the cover link and the category link trimmed:
{
"ok": true,
"charged": true,
"recordType": "event",
"eventId": "2296861047800608",
"eventUrl": "https://www.facebook.com/events/2296861047800608/",
"name": "Pakistan Music Festival 2026",
"description": "Join us for the Pakistan Music Festival 2026, happening on 25, 26 & 27 September at 8 PM at the Arts Council of Pakistan, Karachi. ...",
"startTime": "2026-09-25T15:00:00.000Z",
"startTimestamp": 1790348400,
"endTime": "2026-09-27T18:00:00.000Z",
"endTimestamp": 1790532000,
"timezone": "UTC+05",
"dateText": "25 Sep at 20:00 – 27 Sep at 23:00 PKT",
"venueName": "Arts Council of Pakistan Karachi",
"venueAddress": null,
"venueCity": null,
"latitude": 24.85276668172,
"longitude": 67.020439147949,
"isOnline": false,
"onlineUrl": null,
"organizers": [
{ "id": "100067158235335", "name": "Arts Council of Pakistan Karachi", "url": "https://www.facebook.com/ACPKHI", "type": "User" }
],
"organizerName": "Arts Council of Pakistan Karachi",
"organizerUrl": "https://www.facebook.com/ACPKHI",
"ticketUrl": "http://www.acpkhi.com/events",
"priceRange": null,
"attendingCount": 67,
"interestedCount": 557,
"respondedCount": 624,
"coverImageUrl": "https://scontent-lax3-2.xx.fbcdn.net/v/t39.30808-6/801786067_13878375...",
"categories": [{ "label": "Music", "uri": "https://www.facebook.com/events/search/?filters=..." }],
"isCanceled": false,
"isPast": false,
"sourceType": "search",
"sourceQuery": "music festival",
"sourceUrl": "https://www.facebook.com/events/search/?q=music+festival",
"scrapedAt": "2026-09-21T01:29:28.847Z"
}
| Field | What it is |
|---|---|
eventId, eventUrl | Your key and the public link. |
startTime, endTime, timezone, dateText | ISO times in UTC, with the epoch versions beside them, the event's own timezone, and the date line exactly as Facebook prints it locally. |
venueName, venueAddress, venueCity, venueUrl | The place, as far as the organiser filled it in. Plenty of events name a venue and no street. |
latitude, longitude | Coordinates where Facebook has them, ready to map or to match against a radius. |
organizers, organizerName, organizerUrl | Every host with its id, name, link and whether it is a Page or a profile. The two flat fields are the first one. |
ticketUrl, priceRange | The outbound ticket link and the price line where the organiser published one. |
attendingCount, interestedCount, respondedCount | Going, interested, and the two added together. Facebook rounds these on busy events. |
isOnline, onlineUrl, isCanceled, isPast | Whether it is online and where, and whether it is cancelled or already over. |
sourceType, sourceQuery, sourceUrl | Which of your inputs found this event: search, city, page, group or url. Useful when you run twenty terms at once. |
🧾 Reading the output
Three kinds of row can land in your dataset.
| Row | How to spot it | Billed |
|---|---|---|
| An event | ok: true and charged: true | yes |
| The sample row | _sample: true | no |
| A diagnostic | _diagnostic: true and an errorCode | no |
Filter on charged == true and you have your data. That flag is what separates real rows from the sample and the diagnostics, not a receipt.
errorCode | What happened |
|---|---|
BAD_INPUT | An entry could not be read as an event, Page, Group or search link. |
LOCATION_UNRESOLVED | Facebook has no location by that name, so the city was folded into the search text. |
NO_RESULTS | The search ran and found nothing, or your filters dropped everything. The row carries the count it found first. |
NOT_FOUND | No public event at that link. |
BLOCKED | Facebook would not serve that page on this run. Re-running usually clears it. |
PARSE_FAILED | The page came back in a shape the run could not read. |
NETWORK | Facebook could not be reached. |
TIME_BUDGET | The run ran out of time before finishing that job. |
PROXY_INPUT_ADJUSTED | A proxyConfiguration setting this Actor does not use was dropped. The run carried on. |
CHARGE_ERROR | A billing event could not be recorded. Told to you rather than hidden. |
UNEXPECTED_ERROR | Anything else, with the message attached. |
One quirk of the Console's Overview table: it shows the name, times and venue, so coordinates, organisers, tickets and attendance read as missing there. Open the row or download the JSON and they are all present.
▶️ How to run it
1. Open Facebook Events Scraper and click Try for free. 2. Put what you are looking for into Search terms, one per line, and a city into City or location if it matters. 3. Set Maximum events. Start at 20 while you look at the output. 4. Click Start. 5. Download the dataset as JSON, CSV or Excel, or pull it from the Apify API.
💰 How much does it cost?
$0.90 per 1,000 events. The same rate on every Apify plan, no volume tiers.
You pay for events that come back with detail. The sample row, every diagnostic row, events dropped by your date window or your filters, and an event found twice through two different inputs are not charged, and neither is a search that finds nothing.
💡 What people use it for
- Building a what's-on list for one city and one month, with venues and ticket links attached.
- Finding sponsorship and stall opportunities: search a category, filter to ticketed, read
organizerUrl.
- Watching the events a set of Pages is hosting, by pasting the Pages rather than searching.
- Feeding a map:
latitudeandlongitudeare on the row, so events plot without geocoding.
🚧 What it does not do
- No guest lists. Facebook never publishes who is going, only how many. There is no field for
it because there is no data for it.
- Search is shallow. About eight events per term is what the public search returns. Depth comes
from more terms and more Pages, not from a bigger number in maxEvents.
categoryandpaidOnlyapply to search terms only. Events reached through a Page, Group,
city or event link come back whatever their category or price, and they are charged like any other row. Filter those in your own sheet.
- Private, group-only and invite-gated events are invisible, as they are to anyone not signed in
and invited.
- Recurring series are not expanded. A weekly event is one event, the way Facebook lists it.
- You can get fewer events than you asked for. Past events are only recognised once the full
detail is read, and a run does not go back for replacements after dropping them.
- Attendance counts are rounded on busy events, because Facebook rounds them before publishing.
- Some two-word phrases return nothing at all. Try the broader word on its own before assuming
there are no events.
🧭 Which Facebook scraper do you need?
| If you want | Use |
|---|---|
| Public events by keyword, city or link | This one |
| Recent posts from a Page | Facebook Posts Scraper |
| Posts from a public group | Facebook Groups Scraper |
| The comments under a post | Facebook Comments Scraper |
| The website, email and phone of the organiser's Page | Facebook Page Contact Info Scraper |
❓ Questions people ask
Do I need a Facebook account? No. Public events read fine without one. sessionCookies is there for people running heavily who would rather use their own account's rate limit.
How do I get more events for one city? Run several search terms against it, add the Pages of the venues you care about, and paste the city's events/explore/ URL rather than typing the name.
Why did my city return events somewhere else? A few city names match a same-named town. Paste the events/explore/ URL for the city instead, and the run uses exactly that area.
Can I get past events? From a Page or Group, yes, with includePastEvents. Search itself is about what is coming up.
Is scraping Facebook legal? This reads public events only. Organiser details are still personal data under GDPR and similar laws, so have a reason for collecting them. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.
Can I run it on a schedule? Yes, on Apify's scheduler, or start it from the API and read the dataset when it finishes.
🆘 If something breaks
Open the Issues tab on the actor page. Paste the search term or link you used and the run ID, and the log is enough for us to see what happened.