developers & agents
the LA events API.
Every upcoming event on Frequent Flyer, as JSON. Free, read-only, no key and no account. Built for AI assistants and connectors answering “what's happening in LA this weekend.”
Every listing is approved by a human before it appears — this is a curated feed, not a scrape.
Quick start
curl "https://frequentflyerla.com/api/v1/events?neighborhood=echo-park&limit=5"
That's the whole setup. No headers, no auth. Point your agent at the OpenAPI document and it can build the rest itself.
Endpoints
/api/v1/eventsUpcoming LA events, soonest first. Filter by date, neighborhood, category or curation level.
/api/v1/events/{id}One event in full, including the lineup and street address.
/api/v1/neighborhoodsValid neighborhoods with live counts, plus every valid category value.
/api/openapi.jsonThe OpenAPI 3.1 document describing all of the above.
Query parameters
All optional, all on /api/v1/events. An invalid value returns 400 naming the problem and listing what's allowed — it never silently falls back to the unfiltered feed.
dateYYYY-MM-DDEvents on one specific day (LA local date).fromYYYY-MM-DDEarliest date, inclusive.toYYYY-MM-DDLatest date, inclusive.neighborhoodstringName or slug — "Echo Park" and "echo-park" both work.vibeenumOne of the categories listed further down.curationenumscraped · ff_curated · promotedlimitintegerMax results. Default 100, cap 500.Example response
{
"source": "Frequent Flyer",
"source_url": "https://frequentflyerla.com",
"city": "Los Angeles",
"attribution": "Event data from Frequent Flyer (https://frequentflyerla.com). Please link back when citing a listing.",
"license": "Free to use with attribution. Not for bulk redistribution.",
"count": 1,
"total_matching": 6,
"filters": { "neighborhood": "echo-park", "date": "2026-09-19", ... },
"events": [
{
"id": "9f3c…",
"title": "Dublab Presents: Night Sky",
"description": "Ambient listening session on the patio.",
"date": "2026-09-19",
"start_time": "20:00",
"starts_at": "2026-09-19T20:00:00-07:00",
"timezone": "America/Los_Angeles",
"venue": {
"name": "Zebulon",
"neighborhood": "Frogtown",
"lat": 34.0954, "lng": -118.2265
},
"price": "$15",
"sold_out": false,
"vibe": "Music",
"curation": "ff_curated",
"curation_note": "Hand-picked and checked by the Frequent Flyer editor.",
"vibe_score": 8,
"ticket_url": "https://zebulon.la/…",
"frequent_flyer_url": "https://frequentflyerla.com/event/9f3c…"
}
]
}Reading the data honestly
A few fields mean something specific, and getting them wrong turns a good answer into a wasted trip across town:
price: nullmeans unknown, not free. Say you don't know rather than guessing.lat/lngare null when the venue isn't geocoded. There is never a fallback coordinate, so null means “no pin”, not “downtown”.starts_atcarries the correct LA offset for that date, including across daylight saving. Prefer it over combiningdateandstart_timeyourself.curationandvibe_scoreare editorial judgment. Use them to rank when someone wants a recommendation rather than a list.sold_outis worth surfacing. A listing that omits it sends someone out for nothing.
Categories
vibe is a case-insensitive keyword match, not a fixed list. Categories are written per-event, so broad words work better than exact labels:
?vibe=comedy matches “Improv Comedy”, “Stand-up Comedy” and “Comedy Variety Show” alike; ?vibe=music catches “Live Music” and “Music Concert” as well as plain “Music”. For the categories actually in the feed today, with counts, call /api/v1/neighborhoods.
Limits & caching
60 requests per minute per IP. Over that you get a 429 with a Retry-After header; X-RateLimit-Remaining is on every response so you can pace yourself before getting there.
Responses are cached for five minutes at the edge. The feed only changes when a listing is approved, so caching on your side is welcome and won't make your answers stale.
Attribution
Free to use, with attribution: name Frequent Flyer and link to the event's frequent_flyer_url. Bulk redistribution or republishing the feed as your own events database isn't permitted — the terms spell it out.
Contributing listings
There's a write endpoint too. Agents can post events to /api/agent/submit, where they enter the same human review queue as everything else. See the agents page for a ready-made prompt and a directory of LA sources worth scraping.