Facebook Events Scraper - $0.90 per 1,000 Events avatar

Facebook Events Scraper - $0.90 per 1,000 Events

Pricing

from $0.90 / 1,000 events

Go to Apify Store
Facebook Events Scraper - $0.90 per 1,000 Events

Facebook Events Scraper - $0.90 per 1,000 Events

Whoever created a public Facebook event filled in the time, the venue and the ticket link, and all of it comes back on one row: name, start and end time with timezone, venue address and GPS, organiser, cover image, going and interested counts. No login needed from you.

Pricing

from $0.90 / 1,000 events

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Facebook Events Scraper

Type what you're looking for ("concert", "startup meetup"), add a city if you want, or paste Facebook event, Page or Group URLs.

Each row is the whole event rather than a search snippet: the full description, the exact start and end time with its timezone, the venue with street address and coordinates, the organising Page, the ticket link, the cover image, and how many people are going or interested.

You never sign in and you never paste a cookie. See About logging in for what the run actually does.

  • Search by keyword, by city, by Page, by Group, or straight from an event URL. Mix them in one run.
  • The venue comes back as a real place: street address, latitude and longitude, not a label.
  • Date windows, categories, online-only and ticketed-only are input filters. Events they drop are never charged.
  • A city name is matched against Facebook's own location list, so "Berlin" returns events in Berlin rather than events with "Berlin" in the title.
  • Empty input returns one labelled sample row, free.
  • A private, deleted or misspelled event produces an uncharged diagnostic row, never a failed run.

Price

$0.90 per 1,000 events. Plus $0.001 per run as the platform start fee, billed per gigabyte of run memory, so exactly that on the default 1 GB.

No volume tiers, no minimum spend, no subscription.

EventsTotal
100$0.091
1,000$0.901
10,000$9.001
100,000$90.001

What gets charged

  • One event-scraped event per event row written to the dataset. Nothing else is metered per row.
  • Free: the sample row an empty run returns, and every diagnostic row. They all carry "charged": false.
  • Events dropped by your date window, category, online-only or ticketed-only filters are never charged. The filters run before billing.
  • Duplicate events found through more than one term or URL are dropped before they're charged.
  • Looking a city name up against Facebook's location list costs nothing.
  • A search that matches nothing produces one free note row and no event charges.
  • A run that finds nothing costs the start fee and nothing else.
  • Rows never leave the dataset without a charge and are never charged without a row. The billed event is a named one, so nothing is quietly attached to apify-default-dataset-item.

Input

{
"searchTerms": [
"startup meetup",
"tech conference"
],
"location": "Berlin",
"maxEvents": 20,
"startingFrom": "2026-09-01",
"startingBefore": "2026-12-31"
}
FieldWhat it does
searchTermsWhat to search for. Up to 20 terms per run, each searched in turn. Facebook's public events search hands back up to 8 events per term, so several narrow terms beat one broad one.
locationA city name such as Berlin, or a Facebook events URL for a city (https://www.facebook.com/events/explore/<city>/<id>/) when you want an exact area. Applies to every search term in the run.
startUrlsAny mix of event URLs, Page URLs or handles, Group URLs, events search URLs and city explore URLs. Up to 50 per run.
maxEventsTotal events across everything above. Default 20, hard ceiling 1,000. Keep it low while testing, since you pay per event.
startingFromFree. Drop events starting before this. Accepts 2026-09-01, a full ISO timestamp, an epoch, or a relative window like 7 days.
startingBeforeFree. Drop events starting after this. Same formats.
categoryFree. One of Facebook's own event categories: music, sports, comedy, theatre, art, food and the rest.
onlineOnlyFree. Only events Facebook marks as online.
paidOnlyFree. Only ticketed events.
includePastEventsFree. Off by default. Turn it on to also read a Page's or Group's past events.
proxyUrlsLeave empty. Only for callers who want traffic to leave through proxy servers they already pay for, as http://user:pass@host:port.
sessionCookiesLeave empty unless you're running heavily. See About logging in.

Run it with empty input and you get one labelled sample row, free.

Output

One row per event. This is a real row from a real run:

{
"ok": true,
"charged": true,
"recordType": "event",
"eventId": "1045755418043207",
"eventUrl": "https://www.facebook.com/events/1045755418043207/",
"name": "Devassas Concert",
"description": "Rock concerts with Devassas (portuguese band - punk, grunge, metal) and Die Ausreden (powerpunk) at Regenbogenfabrik, in Berlin!\nSee ya!",
"startTime": "2026-08-21T17:00:00.000Z",
"startTimestamp": 1787331600,
"endTime": null,
"endTimestamp": null,
"timezone": "UTC+02",
"dateText": "Friday, August 21, 2026 at 7:00 PM CEST",
"venueName": "Regenbogenfabrik",
"venueAddress": "Lausitzer Straße 21a, 10999 Berlin, Germany",
"venueCity": "Berlin, Germany",
"venueUrl": "https://facebook.com/Regenbogenfabrik",
"latitude": 52.495993170936,
"longitude": 13.426580093814,
"isOnline": false,
"onlineUrl": null,
"organizers": [
{
"id": "61580124287250",
"name": "Devassas Band",
"url": "https://www.facebook.com/people/Devassas-Band/61580124287250/",
"type": "User"
}
],
"organizerName": "Devassas Band",
"organizerUrl": "https://www.facebook.com/people/Devassas-Band/61580124287250/",
"ticketUrl": null,
"priceRange": null,
"attendingCount": 4,
"interestedCount": 2,
"respondedCount": 6,
"coverImageUrl": "https://scontent.xx.fbcdn.net/v/t39.30808-6/772604334_122136197643004142_4062119575631978264_n.jpg",
"categories": [],
"isCanceled": false,
"isPast": false,
"sourceType": "search",
"sourceQuery": "concert",
"sourceUrl": "https://www.facebook.com/events/search/?q=concert",
"scrapedAt": "2026-08-16T13:39:24.434Z"
}

Field notes

  • eventId is Facebook's numeric id. Stable, and the thing to key on when you re-run and merge.
  • startTime is the exact start in ISO 8601 UTC, read from the event itself rather than from a "Sat, 21 Aug" label. startTimestamp is the same moment in epoch seconds, dateText is the sentence Facebook prints.
  • endTime is null when the host never set one, which is common. That isn't an error and it isn't guessed.
  • timezone is the event's own timezone as Facebook stores it, so you can rebuild a local start time from startTimestamp.
  • venueAddress is the one-line address Facebook shows. For an event whose venue is a free-text line rather than a Page, this and venueName can be the same string. That's what the host typed.
  • latitude and longitude are the venue coordinates. Null for online events and for the small number whose host typed a place name Facebook couldn't resolve.
  • organizers lists every host Facebook names, each with name, Page or profile URL, id and type. organizerName and organizerUrl repeat the first one so a spreadsheet has a plain column to sort on.
  • ticketUrl is the external ticketing link the host attached. Null when tickets aren't sold through a link. priceRange carries the price band when Facebook shows one.
  • attendingCount and interestedCount are the going and interested numbers as Facebook publishes them, which are rounded on large events ("1.2K interested" becomes 1200). respondedCount is the exact total where Facebook gives one. All three are null when the host hides the guest list.
  • sourceType, sourceQuery and sourceUrl say how the event was found (search, city, page, group or url), so rows from a multi-term run can be grouped afterwards.

Real rows carry "charged": true. Sample rows carry "_sample": true, diagnostic rows carry "_diagnostic": true and an errorCode. Neither is billed.

How it works

Facebook renders its public event pages, its public events search and a Page's hosted-events tab on the server. The Actor reads those renders directly and takes the data from the structured payload inside the page rather than from on-screen text, which is why a start time is a real timestamp and a venue is a real place object with coordinates.

Traffic leaves through a rotating pool of addresses. When Facebook answers one address with a stub, the run takes a different address and asks again instead of giving up or charging you. Each page read stops as soon as the event data has arrived rather than downloading the rest of the render.

About logging in

You never supply a Facebook account and you never paste a cookie. Reads go out logged out, and that's what answers a normal run.

When Facebook refuses the same render on several addresses in a row, the run continues with a Facebook session that ships inside the Actor. That session is shared by everyone running this Actor, and Facebook rate-limits per account rather than per caller, so under heavy load it's a small shared budget rather than an unlimited one.

If you'd rather that fallback used your own account, paste your cookie into sessionCookies as c_user=<value>; xs=<value>, one line per account. Treat those values like a password. Anyone holding them can act as that account, and Facebook may sign the session out or restrict an account it decides is automated.

What people use it for

  • Event aggregators and "what's on" sites filling a city listing without hand-entering anything.
  • Venue and promoter research. Who is putting on what, where, and how many people said they're coming.
  • Sponsorship and sales pipelines of upcoming conferences, meetups and festivals in a territory.
  • Local media and tourism boards watching what's happening in a city over a date window.
  • Tracking your own or a partner Page's event calendar into a spreadsheet.

Limits

  • Facebook's logged-out surfaces are shallow by design. One search term returns up to 8 events, one city page up to 12, a Page or Group about 8. Runs are therefore built to go wide (many terms, many cities, many Pages in one run) rather than deep on one term.
  • Private events, events restricted to a Group's members, and events behind an age or country gate aren't public. They come back as an uncharged diagnostic row rather than a partial one.
  • The guest list itself is never public. The three counters come from what Facebook prints on the event, they're rounded on large events, and they're null when the host hides them.
  • endTime and ticketUrl are null whenever the host didn't set them. That's most casual events, and no value is invented to fill the column.
  • A city name is matched against Facebook's own location list. Where Facebook has no matching location, the name is folded into the search text instead. You still get results near that place, but matched on words rather than geography, and a free note row says so. Paste a Facebook events URL for the city to force an exact area.
  • Facebook occasionally answers a stub instead of a page. The run takes a fresh address and asks again, and only after several attempts writes an uncharged BLOCKED row. Re-running a minute later normally clears it.
  • Search results are ranked by Facebook, not by date. Use the date window if you need a specific period.
  • The logged-out events index doesn't answer every phrase. Most ordinary event wording works, but some two-word phrases ("wine tasting", "pub quiz", "beer festival") come back empty from every address, with or without a city, while a single word from the same phrase ("tasting") returns plenty. An empty term gets you a free NO_RESULTS row. Try a shorter or more common wording.
  • Recurring events come back as the occurrence Facebook links to. The series isn't expanded into one row per date.

Questions

Do I need a Facebook account, cookies or a token?

No. You supply nothing. Only public events are read, the way an anonymous visitor sees them. The Actor carries its own fallback session for the case where Facebook refuses several addresses in a row.

One of my search terms returns nothing at all. Is it broken?

Probably not. Facebook's public events index answers most phrases but genuinely returns nothing for some, from every address and with or without a city. A single word from the same phrase usually works where the two-word version doesn't. An empty term costs you nothing.

Why do I only get 8 events for a search term?

That's what Facebook's public events search hands an anonymous visitor for one term. Add more terms, add a city, or point the run at specific Pages. The run limit is on total events, not on sources, so going wide costs nothing extra per source.

Can I get events near a specific city rather than everywhere?

Yes. Put the city in location. It's matched against Facebook's own location list, so results are geographic rather than keyword matches. For full control, paste a Facebook events URL for that city instead.

What if an event is private or has been deleted?

One uncharged row with "_diagnostic": true and a NOT_FOUND code saying so. The run still finishes successfully.

Does an empty run cost me anything?

Only the start fee. Diagnostic rows, sample rows and events dropped by your filters are all free.

Can I pull a Page's past events too?

Yes. Set includePastEvents to true and pass the Page URL in startUrls. A Page's public events tab mixes upcoming and past events. With the setting off, anything that has already started is dropped before it's charged.