Every concert, conference, festival, and minor-league game in a city eventually shows up in the events panel on Google Search. I wanted that panel as a feed for a side project, and there is no official way to get it: no endpoint, no export, just a JavaScript widget inside a search page. This post covers the manual scrape and where it falls apart, then the shortcut: the Google Events API on Apify, which turns a query like "concerts in Austin" into structured JSON.
Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.
Does Google Events have an API?
No. Google Calendar has an API for calendars you own, but the events panel in Search, the one that aggregates listings from ticket sellers and venue pages, has no public API and no feed. That is why searching for a Google Events API mostly turns up scrapers. In practice, a Google Events API is a scraper you consume like an API: send a query, a location, and a date filter, and get titles, dates, venues, and ticket links back as JSON.
What the Google Events API returns
The Google Events API returns event listings for a search query as structured JSON: title, start date, address, venue, ticket links, and an image for each event, about ten events per results page.
| Field | Example | Notes |
|---|---|---|
title |
"Austin City Limits Music Festival" |
Event name as listed |
date |
{"start_date": "Oct 3", "when": "Fri, Oct 3, 12:00 PM"} |
Display strings, not ISO timestamps |
address |
["Zilker Park", "Austin, TX"] |
Venue line plus city line |
venue |
{"name": "Zilker Park", "rating": 4.7} |
Missing on some events, treat as optional |
ticket_info |
[{"source": "Ticketmaster", "link": "...", "link_type": "tickets"}] |
Seller links, not numeric prices |
link |
https://... |
Stable key for diffing runs |
Each dataset row is one page of results with a nested events array, plus search_metadata (result counts, pages_processed, pagination_limit_reached) and a search_timestamp. Flatten the array before loading a spreadsheet.
Who this is for
City app builders who need a local happenings feed, event marketers watching what competitors book, researchers sizing a music or conference scene, and anyone giving an AI agent live event data.
The manual way, and where it breaks
The DIY version is a headless browser pointed at a search for "events in chicago", clicking into the events panel and parsing cards. It works once, then decays. The panel only renders inside a full browser session, so a plain HTTP request gets you nothing. The date filters are hit chips wired to internal parameters, so "this weekend" is not a URL you can bookmark. Leave the locale unset and Google localizes results to whatever region your proxy exits from, which flips text into another language mid-crawl. And the markup shifts often enough that selectors rot within weeks.
The faster way: run the Google Events scraper
Documented JSON in, documented JSON out, nothing to babysit.
Apify Console
- Open the Google Events API and click Try for free.
- Type a query like
concerts in Austin, optionally with alocationand a date filter. - Run it and download the dataset as JSON, CSV, or Excel.
REST
curl -X POST "https://api.apify.com/v2/acts/johnvc~google-events-api---access-google-events-data/runs?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "q": "concerts in Austin", "location": "Austin, Texas, United States", "advanced": "date:weekend", "max_pages": 1 }'
Run endpoint reference: the Apify API docs.
Get Google Events data in Python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("johnvc/google-events-api---access-google-events-data").call(
run_input={
"q": "tech conferences in San Francisco",
"gl": "us",
"hl": "en",
"advanced": "date:month",
"max_pages": 1,
}
)
for page in client.dataset(run["defaultDatasetId"]).iterate_items():
for event in page.get("events", []):
venue = (event.get("venue") or {}).get("name", "")
print(event["title"], event["date"]["when"], venue)
Set gl and hl on anything you run twice; without them the locale follows the serving region. The advanced field takes comma-separated tokens like date:today, date:weekend, date:next_week, date:month, or event_type:Virtual-Event, and invalid tokens are rejected at run start before any charges.
Find this weekend's concerts and festivals
The published task Find concerts and festivals in Austin this weekend is the one-city version: date:weekend plus a location, ten events per page, ready to export.
Feed a city app with local sports events
Aggregate local sports events for a city app shows the sports slice: one query per city on a recurring run becomes the data layer behind a "what's on" screen.
Watch conferences in one industry town
Track tech conferences in San Francisco narrows the query to an industry, which is how I would watch a competitor's conference calendar without refreshing a browser tab.
Track a city on a schedule
One run is a snapshot. Track Google Events for a city on a schedule wraps the same input in an Apify Schedule; key each run's events on link and diff against the previous run to catch new and dropped listings.
Use it from Claude and other MCP clients
The Actor is MCP-ready, so Claude, Claude Code, and Cursor can call it mid-conversation through the Apify MCP server (https://mcp.apify.com/?tools=actors,docs,johnvc/google-events-api---access-google-events-data). The task Give an AI agent live Google Events data has the setup, and you can read more about Claude at claude.ai.
FAQ about scraping Google Events
How much does the Google Events scraper cost, and is any of it free?
Billing is per page of results: a small per-run setup fee plus a couple of cents per page, with about ten events on a page. max_pages defaults to 1 and caps spend before a run starts. New Apify accounts come with free platform credit, so early runs usually cost nothing out of pocket.
Can an AI agent run the Google Events scraper?
Yes. Connect the Apify MCP server and the scraper appears as a callable tool in Claude, Claude Code, or Cursor, so "find jazz shows in New Orleans this month" becomes a live query instead of a guess.
Can I schedule the Google Events scraper to watch a city?
Yes, and tracking is the main reason people run it. Save your input as a task, attach a schedule, and diff runs by event link. Start from the Google Events API.
Does the Google Events scraper return ticket prices?
No. ticket_info carries seller links and link types, not numeric prices, so this is not a price tracker. Dates are also display strings like "Fri, Oct 3" rather than ISO timestamps, so parse them client-side before filtering.
Is the Google Events scraper useful for market research?
Yes, within its limits. It inventories upcoming events per city and category, which answers questions like how many festivals a market hosts or how often a venue books shows. It lists upcoming events only; history exists once you start tracking it.
More from Truffle Pig Data
Same Actor, other angles: Google Events API for AI agents on Medium, the Google Events Scraper API write-up on LinkedIn, and how to scrape Google Events into JSON on Peerlist.
Wrapping up
There is no official Google Events API, but a query, a locale, and a date token get you the same data as clean JSON. Point the Google Events API at your own city and see what comes back.
Top comments (0)