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

GET/api/v1/events

Upcoming LA events, soonest first. Filter by date, neighborhood, category or curation level.

GET/api/v1/events/{id}

One event in full, including the lineup and street address.

GET/api/v1/neighborhoods

Valid neighborhoods with live counts, plus every valid category value.

GET/api/openapi.json

The 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 · promoted
limitintegerMax 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: null means unknown, not free. Say you don't know rather than guessing.
  • lat/lng are null when the venue isn't geocoded. There is never a fallback coordinate, so null means “no pin”, not “downtown”.
  • starts_at carries the correct LA offset for that date, including across daylight saving. Prefer it over combining date and start_time yourself.
  • curation and vibe_score are editorial judgment. Use them to rank when someone wants a recommendation rather than a list.
  • sold_out is 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:

musiccomedydjmarketfilmarttheaterreadingworkshopcommunitytriviafestival

?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.

Questions

support@frequentflyerla.com