AN INDEPENDENT LOCAL COMMONSEL SEGUNDO / CALIFORNIA
ES↗el segundoA LOCAL GUIDE. AN OPEN UNIVERSITY.

WEBHOOKS / FOR BOTS AND BUILDERS

Local events,
pushed to your bot.

When a pickleball court opens up, today’s issue goes out, a city posts an agenda or the surf comes up, elsegundo.xyz can tell your bot right away. Signed webhooks for builders, plain feeds for everyone else.

Not an official City of El Segundo page. Not affiliated with rec.us, LA Metro, NWS, NOAA, AirNow, Heal the Bay or any city named here. Election-neutral: no candidates, and ballot measures only as the official agenda wording.

Schema elsegundo.xyz/webhooks/v1 · updated Oct 27, 2026, 3:50 PM PT · The event feeds start on merge. Webhook deliveries open once a signing key is set. Partner intake is coming later.

Court opened

The first webhook: a Rec Park pickleball court frees up.

A court hour at Rec Park that was booked in the previous /pickleball snapshot shows as open in the next one, for a future hour on a day both snapshots cover. Checked at :20 past each hour; new snapshots arrive about 7, 10 AM, 1, 4 and 7 PM PT, so a typical day has up to 5 chances.

  • Reads the snapshot /pickleball already stores. Makes no extra calls to rec.us.
  • Public availability only: open or not, per court per hour. No booker names or accounts are read or stored.
  • Credits rec.us and links to rec.us to book. We never book or hold courts.
  • Stops when the /pickleball kill switch is on (PICKLEBALL_LIVE=off or live_enabled:false), or when the snapshot is stale.
  • Rec Park is the only court with live data today. Other South Bay courts are listed on /pickleball without live availability.

Pick what you care about. Filter by day (dows), hours (hour_from, hour_to), courts (courts) and how many open at once (min_courts). Example: weekend mornings, two courts or more.

Availability from rec.us’s public court listing. Book on rec.us.

{
  "schema": "elsegundo.xyz/webhooks/v1",
  "id": "evt_921135886c11c07ef2345bce",
  "type": "court.opened",
  "version": 1,
  "created_at": "2026-10-27T15:20:00-07:00",
  "summary": "3 court hours opened up at Rec Park since the last check; the first is Tue 5 PM (3 courts). Book on rec.us.",
  "url": "https://elsegundo.xyz/pickleball/",
  "source": {
    "name": "rec.us public court listing",
    "url": "https://www.rec.us/locations/7527b987-0f0b-473e-9680-0c90758f6dcd",
    "retrieved_at": "2026-10-27T13:05:11-07:00",
    "credit": "Availability from rec.us’s public court listing. Book on rec.us."
  },
  "provenance": {
    "label": "availability",
    "sources": [
      {
        "publisher": "rec.us",
        "url": "https://www.rec.us/locations/7527b987-0f0b-473e-9680-0c90758f6dcd"
      }
    ],
    "note": "Aggregate open/not-open per court per hour from rec.us’s public listing, read 5 times a day by /pickleball. No booker identity is read or stored. A slot may be taken by the time you look."
  },
  "data": {
    "location": {
      "id": "7527b987-0f0b-473e-9680-0c90758f6dcd",
      "name": "Recreation Park pickleball courts, El Segundo",
      "page": "https://elsegundo.xyz/pickleball/",
      "book_url": "https://www.rec.us/locations/7527b987-0f0b-473e-9680-0c90758f6dcd"
    },
    "detected_between": {
      "from": "2026-10-27T10:05:09-07:00",
      "to": "2026-10-27T13:05:11-07:00"
    },
    "openings": [
      {
        "date": "2026-10-27",
        "dow": "Tue",
        "hour": 17,
        "start": "2026-10-27T17:00:00-07:00",
        "end": "2026-10-27T18:00:00-07:00",
        "newly_open_courts": [
          6,
          7,
          8
        ],
        "court_names": [
          "Pickleball Court 6",
          "Pickleball Court 7",
          "Pickleball Court 8"
        ],
        "open_courts_total": 4,
        "book_url": "https://www.rec.us/locations/7527b987-0f0b-473e-9680-0c90758f6dcd?date=2026-10-27"
      },
      {
        "date": "2026-10-27",
        "dow": "Tue",
        "hour": 21,
        "start": "2026-10-27T21:00:00-07:00",
        "end": "2026-10-27T22:00:00-07:00",
        "newly_open_courts": [
          3,
          4,
          7
        ],
        "court_names": [
          "Pickleball Court 3",
          "Pickleball Court 4",
          "Pickleball Court 7"
        ],
        "open_courts_total": 5,
        "book_url": "https://www.rec.us/locations/7527b987-0f0b-473e-9680-0c90758f6dcd?date=2026-10-27"
      },
      {
        "date": "2026-10-28",
        "dow": "Wed",
        "hour": 17,
        "start": "2026-10-28T17:00:00-07:00",
        "end": "2026-10-28T18:00:00-07:00",
        "newly_open_courts": [
          3
        ],
        "court_names": [
          "Pickleball Court 3"
        ],
        "open_courts_total": 1,
        "book_url": "https://www.rec.us/locations/7527b987-0f0b-473e-9680-0c90758f6dcd?date=2026-10-28"
      }
    ],
    "credit": "Availability from rec.us’s public court listing. Book on rec.us."
  },
  "not_official": "Not an official City of El Segundo page or service. Independent local guide; check the linked source before acting.",
  "follow": "https://x.com/elsegundotoday"
}

Event catalog

7 events, one envelope. Every event carries its source and a label.

court.opened On at launch

A pickleball court opened up

When it fires: A court hour at Rec Park that was booked in the previous /pickleball snapshot shows as open in the next one, for a future hour on a day both snapshots cover.

How often: Checked at :20 past each hour; new snapshots arrive about 7, 10 AM, 1, 4 and 7 PM PT, so a typical day has up to 5 chances.

Filters: dows ["Sat","Sun"] · hour_from 8 (24-hour PT) · hour_to 12 (exclusive) · courts [1,2,3] · min_courts 2

  • Reads the snapshot /pickleball already stores. Makes no extra calls to rec.us.
  • Public availability only: open or not, per court per hour. No booker names or accounts are read or stored.
  • Credits rec.us and links to rec.us to book. We never book or hold courts.
  • Stops when the /pickleball kill switch is on (PICKLEBALL_LIVE=off or live_enabled:false), or when the snapshot is stale.
  • Rec Park is the only court with live data today. Other South Bay courts are listed on /pickleball without live availability.

elsegundo.xyz · El Segundo Recreation Park courts on rec.us (booking page) · rec.us Terms of Service · Example payload

today.published On at launch

Today’s issue is out

When it fires: /today.json shows a new edition date and its freshness is "fresh".

How often: Hourly check; at most one event per day.

  • Top five stories with their labels (fact, reported) and best source.
  • Includes open "For the bots" asks once /asks.json is live.

elsegundo.xyz · Example payload

ask.opened Starts when /asks.json ships

A new open ask

When it fires: An ask in /asks.json (schema elsegundo.xyz/asks/v1) is newly open. Types: remind, contribute, opt-in, volunteer.

How often: Hourly.

  • Starts sending once /asks.json ships (drafted separately, not published yet).
  • Responses go through /report/ or the ask’s own link; nothing auto-publishes.

Source: /asks.json once it ships · Example payload

transit.alert On at launch

Transit alert

When it fires: An item in the /metro guide’s "Right now" list or project tracker is new, changes, or is cleared. Covers the C and K Lines, SkyLink and LAX connections.

How often: Hourly. /metro.json changes by reviewed PR, so these follow our edits, not Metro’s live feed.

Filters: kinds ["service","airport","project"]

  • Each alert links the agency source it came from and keeps its fact or reported label.
  • Live Metro alerts would need a Metro/Swiftly key; see blockers.

elsegundo.xyz · Example payload

civic.agenda_posted On at launch

A meeting agenda was posted

When it fires: A new agenda appears in El Segundo’s or Redondo Beach’s Granicus agenda feed, or a Manhattan Beach Legistar meeting gets an agenda file.

How often: 5 times a day (7, 10 AM, 1, 4, 7 PM PT).

Filters: cities ["El Segundo","Manhattan Beach","Redondo Beach"]

  • Meeting title, date and the official agenda link only. No summaries of items.
  • Never names candidates. Ballot measures appear only in the city’s own agenda wording.
  • Official record: the city’s feed is the source.

City of El Segundo · City of Redondo Beach · City of Manhattan Beach · Granicus · Example payload

conditions.threshold Partly on at launch

Conditions crossed a threshold

When it fires: A new NWS alert for El Segundo; an NWS daytime forecast high of 90°F or more; Santa Monica Bay buoy wave height crossing 1.8 m (about 6 ft); AQI crossing 101; a nearby beach water grade moving into or out of C/D/F.

How often: Hourly (water grades twice a day).

Filters: kinds ["nws_alert","heat","surf","aqi","water_grade"]

  • NWS alerts, heat and surf work on merge. AQI needs a free AirNow key. Water grades wait for an OK on using Heal the Bay’s data feed.
  • Surf uses offshore buoy wave height, not breaking surf at a given beach. Heat uses a forecast, labeled model.

elsegundo.xyz · National Weather Service · NOAA National Data Buoy Center · AirNow API: current observations by ZIP code (requires a free API key) · AQI basics (101 and up is unhealthy for sensitive groups) · Beach Report Card with NowCast · Annual Beach and River Report Cards 2025-2026 (what A to F grades mean) · Example payload

record.changed On at launch

A shared record was added or corrected

When it fires: A resource, event or El Segundo business record is added, corrected (field by field, before and after) or removed.

How often: Twice a day (6 AM and 6 PM PT).

Filters: datasets ["resources","events","businesses"]

  • Provenance on every event: the record’s own source link, its checked date and our dataset URL.
  • Public, business and civic fields only. No people.
  • Business data © OpenStreetMap contributors (ODbL).

Resource directory dataset · Events hub dataset · Business map API (OpenStreetMap data) · OpenStreetMap · Example payload

How it works

Sources in, changes out.

Public sourcesrec.us grid, agendas, NWS… Our own data/today, /metro, records Hourly diffwhat changed? Event loglast 200, by id FeedsJSON · RSS Your botsigned POST
Our diagram. Nothing auto-publishes on the site: events describe changes that already happened at the source.
FieldMeaning
schemaAlways "elsegundo.xyz/webhooks/v1".
idevt_ plus 24 hex characters. Deterministic: the same change always has the same id. Use it to de-duplicate.
typeOne of the event types below.
versionPayload version for this type (1).
created_atWhen we detected it, Pacific time with offset.
summaryOne plain sentence.
urlThe human page to open.
sourceWhere the data came from: name, url, retrieved_at, and credit where required.
provenancelabel (fact, official record, schedule, reported, model, availability) and the sources behind it.
dataType-specific fields (see examples).
not_officialThe not-official note, on every event.
followhttps://x.com/elsegundotoday

Subscribe

A webhook URL, or just a feed.

No signup: follow a feed

/webhooks/feed.json (JSON Feed 1.1) · /webhooks/feed.xml (RSS 2.0). Both feeds carry the last 200 events with the full payload and accept ?type=<event type>. Cached 5 minutes. No signup. Example: /webhooks/feed.json?type=court.opened.

Webhook URL

  1. POST your URL, the events you want and any filters.
  2. We POST a signed {"type":"webhook.verify","challenge":"..."} to your URL. Answer 2xx with {"challenge":"<the same value>"} within 8 seconds.
  3. Save the secret and manage_token from the reply. They are shown once.
  4. Check webhook-signature on every delivery (see Signing).
curl -X POST https://elsegundo.xyz/api/v1/webhooks/subscribe \
  -H 'Content-Type: application/json' \
  -d '{"url":"https://bot.example.org/hooks/elsegundo","events":["court.opened","civic.agenda_posted"],"filters":{"court.opened":{"dows":["Sat","Sun"],"hour_from":8,"hour_to":12,"min_courts":2}},"label":"Neighborhood bot"}'

Unsubscribe: POST {"id","token"} to /api/v1/webhooks/unsubscribe, or answer any delivery with 410 Gone. Status: GET /api/v1/webhooks/subscription?id=… with Authorization: Bearer mt_….

URL rules. Public https only, port 443, no user:password, no IP addresses, no localhost or internal names, no elsegundo.xyz or netlify.app. The host must resolve to public addresses, checked again before every delivery.

Limits. 6 per minute per IP; 5 active per host; 500 in total. Privacy. We store your URL, chosen events and filters, an optional label, and delivery status. No email, no IP log in our records. Secrets are derived, not stored.

Try it

Events

Until signing is switched on, this answers “not open yet”. The feeds work now.

Signing

HMAC-SHA256, in the Standard Webhooks format.

Each delivery has webhook-id, webhook-timestamp, webhook-signature. The signature is v1,<base64 HMAC-SHA256> over {webhook-id}.{webhook-timestamp}.{raw request body}, keyed with your whsec_… secret. Reject anything older than 5 minutes. webhook-id equals the event id and stays the same across retries. Libraries from Standard Webhooks verify it as-is.

import { createHmac, timingSafeEqual } from 'node:crypto';
export function verify(secret, h, rawBody) {
  const key = Buffer.from(secret.replace(/^whsec_/, ''), 'base64');
  const ts = Number(h['webhook-timestamp']);
  if (Math.abs(Date.now() / 1000 - ts) > 300) return false;
  const mac = createHmac('sha256', key).update(`${h['webhook-id']}.${ts}.${rawBody}`).digest();
  return h['webhook-signature'].split(' ').some(s => {
    const got = Buffer.from(s.replace(/^v1,/, ''), 'base64');
    return got.length === mac.length && timingSafeEqual(got, mac);
  });
}

Delivery. POST, application/json, 10-second timeout. Any 2xx. Retries after 1 min, 5 min, 30 min, 2 h, 6 h, 12 h. Up to 7 attempts over about 21 hours, then the delivery is dropped to a dead-letter list. Redirects are not followed. Answer 410 Gone to unsubscribe yourself. After 50 failures in a row we pause the subscription. Best effort, not guaranteed. Use created_at and id.

Example payloads

Built by running the real diff code on saved data.

court.opened 1 example

Real availability from the Oct 27, 1:05 PM PT snapshot, diffed against an edited copy standing in for the 10:05 AM one.

{
  "schema": "elsegundo.xyz/webhooks/v1",
  "id": "evt_921135886c11c07ef2345bce",
  "type": "court.opened",
  "version": 1,
  "created_at": "2026-10-27T15:20:00-07:00",
  "summary": "3 court hours opened up at Rec Park since the last check; the first is Tue 5 PM (3 courts). Book on rec.us.",
  "url": "https://elsegundo.xyz/pickleball/",
  "source": {
    "name": "rec.us public court listing",
    "url": "https://www.rec.us/locations/7527b987-0f0b-473e-9680-0c90758f6dcd",
    "retrieved_at": "2026-10-27T13:05:11-07:00",
    "credit": "Availability from rec.us’s public court listing. Book on rec.us."
  },
  "provenance": {
    "label": "availability",
    "sources": [
      {
        "publisher": "rec.us",
        "url": "https://www.rec.us/locations/7527b987-0f0b-473e-9680-0c90758f6dcd"
      }
    ],
    "note": "Aggregate open/not-open per court per hour from rec.us’s public listing, read 5 times a day by /pickleball. No booker identity is read or stored. A slot may be taken by the time you look."
  },
  "data": {
    "location": {
      "id": "7527b987-0f0b-473e-9680-0c90758f6dcd",
      "name": "Recreation Park pickleball courts, El Segundo",
      "page": "https://elsegundo.xyz/pickleball/",
      "book_url": "https://www.rec.us/locations/7527b987-0f0b-473e-9680-0c90758f6dcd"
    },
    "detected_between": {
      "from": "2026-10-27T10:05:09-07:00",
      "to": "2026-10-27T13:05:11-07:00"
    },
    "openings": [
      {
        "date": "2026-10-27",
        "dow": "Tue",
        "hour": 17,
        "start": "2026-10-27T17:00:00-07:00",
        "end": "2026-10-27T18:00:00-07:00",
        "newly_open_courts": [
          6,
          7,
          8
        ],
        "court_names": [
          "Pickleball Court 6",
          "Pickleball Court 7",
          "Pickleball Court 8"
        ],
        "open_courts_total": 4,
        "book_url": "https://www.rec.us/locations/7527b987-0f0b-473e-9680-0c90758f6dcd?date=2026-10-27"
      },
      {
        "date": "2026-10-27",
        "dow": "Tue",
        "hour": 21,
        "start": "2026-10-27T21:00:00-07:00",
        "end": "2026-10-27T22:00:00-07:00",
        "newly_open_courts": [
          3,
          4,
          7
        ],
        "court_names": [
          "Pickleball Court 3",
          "Pickleball Court 4",
          "Pickleball Court 7"
        ],
        "open_courts_total": 5,
        "book_url": "https://www.rec.us/locations/7527b987-0f0b-473e-9680-0c90758f6dcd?date=2026-10-27"
      },
      {
        "date": "2026-10-28",
        "dow": "Wed",
        "hour": 17,
        "start": "2026-10-28T17:00:00-07:00",
        "end": "2026-10-28T18:00:00-07:00",
        "newly_open_courts": [
          3
        ],
        "court_names": [
          "Pickleball Court 3"
        ],
        "open_courts_total": 1,
        "book_url": "https://www.rec.us/locations/7527b987-0f0b-473e-9680-0c90758f6dcd?date=2026-10-28"
      }
    ],
    "credit": "Availability from rec.us’s public court listing. Book on rec.us."
  },
  "not_official": "Not an official City of El Segundo page or service. Independent local guide; check the linked source before acting.",
  "follow": "https://x.com/elsegundotoday"
}
today.published 1 example

Real Oct 27 edition; the two asks are illustrative until /asks.json ships.

{
  "schema": "elsegundo.xyz/webhooks/v1",
  "id": "evt_37151b4fb25f2ea8a047db98",
  "type": "today.published",
  "version": 1,
  "created_at": "2026-10-27T15:20:00-07:00",
  "summary": "South Bay Today for 2026-10-27 is up: 5 top stories and 2 open asks for bots.",
  "url": "https://elsegundo.xyz/today/",
  "source": {
    "name": "South Bay Today (elsegundo.xyz)",
    "url": "https://elsegundo.xyz/today.json",
    "retrieved_at": "2026-10-27T22:00:50.699Z"
  },
  "provenance": {
    "label": "fact",
    "sources": [
      {
        "publisher": "elsegundo.xyz",
        "url": "https://elsegundo.xyz/today/"
      }
    ],
    "note": "Each story keeps its own label (fact, reported) and links its best source. Asks come from /asks.json."
  },
  "data": {
    "edition": "2026-10-27",
    "title": "South Bay Today",
    "page_url": "https://elsegundo.xyz/today/",
    "json_url": "https://elsegundo.xyz/today.json",
    "feed_url": "https://elsegundo.xyz/today/feed.json",
    "markdown_url": "https://elsegundo.xyz/today.md",
    "updated_at": "2026-10-27T15:00:50-07:00",
    "top_stories": [
      {
        "rank": 1,
        "headline": "El Segundo Reaches Deal With Chevron to Increase Payments to City",
        "label": "reported",
        "source": "MyNewsLA.com",
        "url": "https://news.google.com/rss/articles/CBMipgFBVV95cUxPZTBwRi1jRWQ5NzM2VWcxV2pVRGtBVTU1WXpuNnAyQW4wcGEzUnFWa21WWnozVEJmekZ6NDBoamo3RFM5bTQybzFZV05JXzRhZFowUmZLZTBHX1JVc3IyX3RaVURPMTdVcVNwN29HVEVsQi1yTWlWa3dWWklMUUFkY3FiYkU0Z25zQ0N6RFNyd0ROS2pWcDR5MWx0cmhPT25ROXJuemt3?oc=5"
      },
      {
        "rank": 2,
        "headline": "Epicenter Acquires Culver City Flex Industrial Site For $11M",
        "label": "reported",
        "source": "Bisnow",
        "url": "https://news.google.com/rss/articles/CBMiuwFBVV95cUxNZlF1VFVRSnBKSnhEQnhqZWgteXczTndNSl9raEZYWGduQS11eUpJZ1cxQlVRR0pRN08wc24tSWNuczluNVdodFNHQXRoSEFsd2wwdnFvaHF2bVZPc0RXLWFqYllwRHNPV0RMSnFrTVZUdDBzR245ai02enZVaGJON19DQUZiNEIta0x6ampjbDFBbC1vNkdKSHpqTS1YLTE0aGJ0WjB1MHprTHdNa1NmLTNZdjd1c2NWTG5Z?oc=5"
      },
      {
        "rank": 3,
        "headline": "Redondo Beach bar still open for business despite major flooding",
        "label": "reported",
        "source": "Jocelyn Fiset",
        "url": "https://ktla.com/news/local-news/redondo-beach-bar-still-open-major-flooding/"
      },
      {
        "rank": 4,
        "headline": "News | LA investor bets on defense demand with Culver City industrial purchase",
        "label": "reported",
        "source": "CoStar",
        "url": "https://news.google.com/rss/articles/CBMiswFBVV95cUxNZE9adjZ6U2ppZWRjVlJxSWN0YjdEd3NWYVhFaThfcFJFRzJEc2VxSmw1S1JzUWNzakgzVDQ1OFlxeWZHYWxoU1pxenpMV2ZiU01rQnlocUlvQ012b053cjZkTC03Uy10aDM3eV9ERkVXaXNOVmVGYWlyWXdvRUlEUHJWZ0pOODhqdzB5NUFaanR4WFVTVU9YZWNsWmoyeFg4M2tZTzBTUEE3N2tBSnNEcXlhVQ?oc=5"
      },
      {
        "rank": 5,
        "headline": "LAX’s embattled ‘People Mover’ malfunctions with massive arc flash during routine test of train",
        "label": "reported",
        "source": "New York Post",
        "url": "https://news.google.com/rss/articles/CBMirgFBVV95cUxOeWlqOUhiNFIyRkNOYWhHM0dHdVUzNEw0cjIxMDBBWTJBV0F2MVB2TEd4UnRJS1JHa2V5Y3dIYXdkV0xBQ1B1d3RaM05kcnRob1pkelJVX1NoRGFBYzZ1VU80eHRkUmlZWDhEQVpxSnQ2UUs1TGFyNGIydjNaVzM4U2xoRlF6OE0yZGNhbnA2RVpjN1dHR1ZGUXZsTU9yanhhajFFajBKQWpnQ2U2d3c?oc=5"
      }
    ],
    "asks": [
      {
        "id": "ask-court-hours-check",
        "type": "contribute",
        "title": "Confirm this weekend's hours at one South Bay pickleball court",
        "url": "https://elsegundo.xyz/pickleball/"
      },
      {
        "id": "ask-council-reminder",
        "type": "remind",
        "title": "Remind your people: El Segundo City Council meets Nov 3",
        "url": "https://elsegundo.granicus.com/ViewPublisher.php?view_id=10"
      }
    ],
    "asks_url": "https://elsegundo.xyz/asks.json"
  },
  "not_official": "Not an official City of El Segundo page or service. Independent local guide; check the linked source before acting.",
  "follow": "https://x.com/elsegundotoday"
}
ask.opened 1 example

Illustrative ask; /asks.json is not published yet.

{
  "schema": "elsegundo.xyz/webhooks/v1",
  "id": "evt_71b2da75e8d11d35cf8b1686",
  "type": "ask.opened",
  "version": 1,
  "created_at": "2026-10-27T15:20:00-07:00",
  "summary": "New contribute ask: Confirm this weekend's hours at one South Bay pickleball court",
  "url": "https://elsegundo.xyz/pickleball/",
  "source": {
    "name": "elsegundo.xyz open asks",
    "url": "https://elsegundo.xyz/asks.json",
    "retrieved_at": null
  },
  "provenance": {
    "label": "fact",
    "sources": [
      {
        "publisher": "source",
        "url": "https://elsegundo.xyz/pickleball/"
      },
      {
        "publisher": "elsegundo.xyz",
        "url": "https://elsegundo.xyz/asks.json"
      }
    ]
  },
  "data": {
    "id": "ask-court-hours-check",
    "ask_type": "contribute",
    "title": "Confirm this weekend's hours at one South Bay pickleball court",
    "opens_at": "2026-10-27T15:00:00-07:00",
    "closes_at": "2026-10-31T18:00:00-07:00",
    "how_to_respond": "Send the court, the hours and the official page that lists them through /report/.",
    "url": "https://elsegundo.xyz/pickleball/"
  },
  "not_official": "Not an official City of El Segundo page or service. Independent local guide; check the linked source before acting.",
  "follow": "https://x.com/elsegundotoday"
}
transit.alert 2 examples

Real /metro items, marked new or updated against an edited earlier state.

[
  {
    "schema": "elsegundo.xyz/webhooks/v1",
    "id": "evt_57fb1af08ee666dc700c7f2a",
    "type": "transit.alert",
    "version": 1,
    "created_at": "2026-10-27T15:20:00-07:00",
    "summary": "New transit alert: D Line: three Wilshire stations closed until 4 AM Mon, Nov 2",
    "url": "https://elsegundo.xyz/metro/",
    "source": {
      "name": "elsegundo.xyz /metro guide",
      "url": "https://elsegundo.xyz/metro.json",
      "retrieved_at": "2026-10-27"
    },
    "provenance": {
      "label": "fact",
      "sources": [
        {
          "publisher": "The Source (LA Metro)",
          "url": "https://thesource.metro.net/three-d-line-stations-to-close-oct-23-through-nov-1-for-maintenance-work/",
          "title": "Three D Line stations to close Oct. 23 through Nov. 1 for maintenance work"
        }
      ]
    },
    "data": {
      "change": "new",
      "kind": "service",
      "id": "dline-closure",
      "title": "D Line: three Wilshire stations closed until 4 AM Mon, Nov 2",
      "text": "Wilshire/La Brea, Wilshire/Fairfax and Wilshire/La Cienega are closed for electrical work. D Line trains run Union Station to Wilshire/Western, with Line 855 shuttle buses every 10 minutes to the closed stations.",
      "status": null,
      "opening": null,
      "expires": "2026-11-02T04:00:00-08:00",
      "lines": []
    },
    "not_official": "Not an official City of El Segundo page or service. Independent local guide; check the linked source before acting.",
    "follow": "https://x.com/elsegundotoday"
  },
  {
    "schema": "elsegundo.xyz/webhooks/v1",
    "id": "evt_7fee60082fc1f2f35cf13307",
    "type": "transit.alert",
    "version": 1,
    "created_at": "2026-10-27T15:20:00-07:00",
    "summary": "Updated LAX connection note: LAX SkyLink (Automated People Mover)",
    "url": "https://elsegundo.xyz/metro/",
    "source": {
      "name": "elsegundo.xyz /metro guide",
      "url": "https://elsegundo.xyz/metro.json",
      "retrieved_at": "2026-10-27"
    },
    "provenance": {
      "label": "fact",
      "sources": [
        {
          "publisher": "LAX (Los Angeles World Airports)",
          "url": "https://www.flylax.com/sites/lax/files/2026-10/LAX-SkyLink_Myth-vs-Fact_Web_0.pdf",
          "title": "LAX SkyLink Myth vs Fact (information current as of Oct 23, 2026)"
        },
        {
          "publisher": "LAX (Los Angeles World Airports)",
          "url": "https://www.flylax.com/skylink",
          "title": "SkyLink"
        },
        {
          "publisher": "The Source (LA Metro)",
          "url": "https://thesource.metro.net/how-to-use-the-lax-metro-transit-center-with-new-bus-and-rail-connections/",
          "title": "How to use the LAX/Metro Transit Center with new bus and rail connections"
        }
      ]
    },
    "data": {
      "change": "updated",
      "kind": "airport",
      "id": "skylink",
      "title": "LAX SkyLink (Automated People Mover)",
      "text": "Testing, not open. No confirmed date (LAX)",
      "status": "Testing, not open",
      "opening": "No confirmed date (LAX)",
      "expires": null,
      "lines": []
    },
    "not_official": "Not an official City of El Segundo page or service. Independent local guide; check the linked source before acting.",
    "follow": "https://x.com/elsegundotoday"
  }
]
civic.agenda_posted 1 example

Real El Segundo Granicus agenda item.

{
  "schema": "elsegundo.xyz/webhooks/v1",
  "id": "evt_3a8853ddaf6e94bea69dca9b",
  "type": "civic.agenda_posted",
  "version": 1,
  "created_at": "2026-10-27T15:20:00-07:00",
  "summary": "El Segundo: agenda posted for Special Council Meeting (2026-10-26).",
  "url": "https://elsegundo.granicus.com/AgendaViewer.php?view_id=10&clip_id=5077",
  "source": {
    "name": "El Segundo City Council agenda feed (Granicus)",
    "url": "https://elsegundo.granicus.com/ViewPublisherRSS.php?view_id=10&mode=agendas",
    "retrieved_at": null
  },
  "provenance": {
    "label": "official record",
    "sources": [
      {
        "publisher": "City of El Segundo",
        "url": "https://elsegundo.granicus.com/AgendaViewer.php?view_id=10&clip_id=5077"
      }
    ]
  },
  "data": {
    "city": "El Segundo",
    "body": "City Council",
    "meeting_title": "Special Council Meeting",
    "meeting_date": "2026-10-26",
    "meeting_time": null,
    "agenda_url": "https://elsegundo.granicus.com/AgendaViewer.php?view_id=10&clip_id=5077",
    "detail_url": null,
    "neutrality": "Meeting title, date and the official agenda link only. We do not summarize items, and never mention candidates; ballot measures appear only as the official agenda wording."
  },
  "not_official": "Not an official City of El Segundo page or service. Independent local guide; check the linked source before acting.",
  "follow": "https://x.com/elsegundotoday"
}
conditions.threshold 5 examples

NWS alert and water grades are real readings; the surf, heat and AQI numbers are synthetic so each kind shows.

[
  {
    "schema": "elsegundo.xyz/webhooks/v1",
    "id": "evt_f1574f5cbe01091a21ab6e88",
    "type": "conditions.threshold",
    "version": 1,
    "created_at": "2026-10-27T15:20:00-07:00",
    "summary": "NWS: Coastal Flood Advisory until Thu, Oct 29, 1:00 PM PT.",
    "url": "https://elsegundo.xyz/#conditions",
    "source": {
      "name": "National Weather Service active alerts",
      "url": "https://api.weather.gov/alerts/active?point=33.9192,-118.4165",
      "retrieved_at": null
    },
    "provenance": {
      "label": "fact",
      "sources": [
        {
          "publisher": "National Weather Service",
          "url": "https://api.weather.gov/alerts/active?point=33.9192,-118.4165"
        }
      ]
    },
    "data": {
      "kind": "nws_alert",
      "event": "Coastal Flood Advisory",
      "headline": "Coastal Flood Advisory issued October 27 at 6:54AM PDT until October 29 at 1:00PM PDT by NWS Los Angeles/Oxnard CA",
      "ends": "2026-10-29T13:00:00-07:00",
      "alert_url": "https://api.weather.gov/alerts/urn:oid:2.49.0.1.840.0.37c31ccf7b9546160110964f4c4322180655466f.001.1"
    },
    "not_official": "Not an official City of El Segundo page or service. Independent local guide; check the linked source before acting.",
    "follow": "https://x.com/elsegundotoday"
  },
  {
    "schema": "elsegundo.xyz/webhooks/v1",
    "id": "evt_9d9234b86ff9a343543a57ea",
    "type": "conditions.threshold",
    "version": 1,
    "created_at": "2026-10-27T15:20:00-07:00",
    "summary": "Heat: NWS forecasts a high near 92°F for Saturday.",
    "url": "https://elsegundo.xyz/#conditions",
    "source": {
      "name": "National Weather Service forecast (LOX/148,40)",
      "url": "https://api.weather.gov/gridpoints/LOX/148,40/forecast",
      "retrieved_at": null
    },
    "provenance": {
      "label": "model",
      "sources": [
        {
          "publisher": "National Weather Service",
          "url": "https://api.weather.gov/gridpoints/LOX/148,40/forecast"
        }
      ]
    },
    "data": {
      "kind": "heat",
      "date": "2026-10-31",
      "period": "Saturday",
      "forecast_high_f": 92,
      "threshold_f": 90
    },
    "not_official": "Not an official City of El Segundo page or service. Independent local guide; check the linked source before acting.",
    "follow": "https://x.com/elsegundotoday"
  },
  {
    "schema": "elsegundo.xyz/webhooks/v1",
    "id": "evt_24e2acb463b9fbc5224d4bd3",
    "type": "conditions.threshold",
    "version": 1,
    "created_at": "2026-10-27T15:20:00-07:00",
    "summary": "Big surf: Santa Monica Bay buoy shows 2.1 m (6.9 ft) significant wave height.",
    "url": "https://elsegundo.xyz/#conditions",
    "source": {
      "name": "NDBC station 46221, Santa Monica Bay (CDIP)",
      "url": "https://www.ndbc.noaa.gov/data/realtime2/46221.txt",
      "retrieved_at": null
    },
    "provenance": {
      "label": "fact",
      "sources": [
        {
          "publisher": "NOAA National Data Buoy Center",
          "url": "https://www.ndbc.noaa.gov/data/realtime2/46221.txt"
        }
      ]
    },
    "data": {
      "kind": "surf",
      "station": "46221",
      "wave_height_m": 2.1,
      "wave_height_ft": 6.9,
      "dominant_period_s": 15,
      "observed_at": "2026-10-27T21:56:00Z",
      "threshold_m": 1.8,
      "note": "Offshore buoy wave height, not breaking surf at a given beach."
    },
    "not_official": "Not an official City of El Segundo page or service. Independent local guide; check the linked source before acting.",
    "follow": "https://x.com/elsegundotoday"
  },
  {
    "schema": "elsegundo.xyz/webhooks/v1",
    "id": "evt_f0f31d2d70da1be170f00317",
    "type": "conditions.threshold",
    "version": 1,
    "created_at": "2026-10-27T15:20:00-07:00",
    "summary": "Air quality: AQI 112 (Unhealthy for Sensitive Groups) near El Segundo.",
    "url": "https://elsegundo.xyz/#conditions",
    "source": {
      "name": "AirNow current observations, ZIP 90245",
      "url": "https://docs.airnowapi.org/CurrentObservationsByZip/query",
      "retrieved_at": null
    },
    "provenance": {
      "label": "fact",
      "sources": [
        {
          "publisher": "U.S. EPA AirNow",
          "url": "https://docs.airnowapi.org/CurrentObservationsByZip/query"
        }
      ]
    },
    "data": {
      "kind": "aqi",
      "aqi": 112,
      "category": "Unhealthy for Sensitive Groups",
      "observed_at": "2026-10-27 15:00 PST",
      "threshold": 101
    },
    "not_official": "Not an official City of El Segundo page or service. Independent local guide; check the linked source before acting.",
    "follow": "https://x.com/elsegundotoday"
  },
  {
    "schema": "elsegundo.xyz/webhooks/v1",
    "id": "evt_bf9d6d2eecb6594420aa9aaf",
    "type": "conditions.threshold",
    "version": 1,
    "created_at": "2026-10-27T15:20:00-07:00",
    "summary": "Beach water: Manhattan Beach Pier drain went from A to C (Heal the Bay).",
    "url": "https://elsegundo.xyz/#conditions",
    "source": {
      "name": "Heal the Bay Beach Report Card",
      "url": "https://brc.healthebay.org/",
      "retrieved_at": null
    },
    "provenance": {
      "label": "fact",
      "sources": [
        {
          "publisher": "Heal the Bay",
          "url": "https://brc.healthebay.org/"
        }
      ]
    },
    "data": {
      "kind": "water_grade",
      "beach_id": 44,
      "beach": "Manhattan Beach Pier drain",
      "grade": "C",
      "previous_grade": "A",
      "grade_updated": "2026-10-23T00:00:00.000Z",
      "direction": "worse"
    },
    "not_official": "Not an official City of El Segundo page or service. Independent local guide; check the linked source before acting.",
    "follow": "https://x.com/elsegundotoday"
  }
]
record.changed 2 examples

Real records; the earlier state is edited so a correction and an addition show.

[
  {
    "schema": "elsegundo.xyz/webhooks/v1",
    "id": "evt_131cc84f5511a01a382a360a",
    "type": "record.changed",
    "version": 1,
    "created_at": "2026-10-27T15:20:00-07:00",
    "summary": "Resource corrected: Parks & Facilities Directory.",
    "url": "https://elsegundo.xyz/#directory",
    "source": {
      "name": "elsegundo.xyz resources",
      "url": "https://elsegundo.xyz/resources.json",
      "retrieved_at": null
    },
    "provenance": {
      "label": "fact",
      "sources": [
        {
          "publisher": "record source",
          "url": "https://www.elsegundorecparks.gov/parks-facilities/parks-facilities-directory"
        },
        {
          "publisher": "elsegundo.xyz",
          "url": "https://elsegundo.xyz/resources.json"
        }
      ],
      "record_source_date": "2026-10-24",
      "verification": "Official or operator source reviewed; some City pages reviewed via their search index"
    },
    "data": {
      "dataset": "resources",
      "record_id": "parks-facilities-directory",
      "change": "corrected",
      "changes": [
        {
          "field": "url",
          "before": "https://www.elsegundorecparks.gov/parks-facilities",
          "after": "https://www.elsegundorecparks.gov/parks-facilities/parks-facilities-directory"
        },
        {
          "field": "verified_date",
          "before": "2026-10-10",
          "after": "2026-10-24"
        }
      ],
      "record": {
        "title": "Parks & Facilities Directory",
        "category": "Play & parks",
        "url": "https://www.elsegundorecparks.gov/parks-facilities/parks-facilities-directory",
        "locality": "El Segundo",
        "verified_date": "2026-10-24"
      }
    },
    "not_official": "Not an official City of El Segundo page or service. Independent local guide; check the linked source before acting.",
    "follow": "https://x.com/elsegundotoday"
  },
  {
    "schema": "elsegundo.xyz/webhooks/v1",
    "id": "evt_803e1efd5623d312fca26b13",
    "type": "record.changed",
    "version": 1,
    "created_at": "2026-10-27T15:20:00-07:00",
    "summary": "Business added: Citizens Business Bank.",
    "url": "https://elsegundo.xyz/businesses/",
    "source": {
      "name": "elsegundo.xyz businesses",
      "url": "https://elsegundo.xyz/api/v1/businesses?limit=100&city=El%20Segundo",
      "retrieved_at": null
    },
    "provenance": {
      "label": "fact",
      "sources": [
        {
          "publisher": "record source",
          "url": "https://www.openstreetmap.org/way/439602995"
        },
        {
          "publisher": "elsegundo.xyz",
          "url": "https://elsegundo.xyz/api/v1/businesses?limit=100&city=El%20Segundo"
        }
      ],
      "record_source_date": "2026-10-24",
      "verification": "Mapped listing; current operation not independently verified"
    },
    "data": {
      "dataset": "businesses",
      "record_id": "osm-way-439602995",
      "change": "added",
      "changes": null,
      "record": {
        "name": "Citizens Business Bank",
        "category": "Local services",
        "type": "bank",
        "address": "275 Main Street, El Segundo, 90245",
        "website": null,
        "sourceUrl": "https://www.openstreetmap.org/way/439602995",
        "sourceDate": "2026-10-24"
      }
    },
    "not_official": "Not an official City of El Segundo page or service. Independent local guide; check the linked source before acting.",
    "follow": "https://x.com/elsegundotoday"
  }
]

Sending us events

Coming later.

Partner intake is coming later. This release does not publish an intake route. Send tips and corrections through Share a local update.

What’s on, what’s not

Plain status, sources and limits.

Still missing: Hermosa Beach, Torrance, Hawthorne, Inglewood, LA City and LA County agendas are not wired yet; their public feeds weren’t found or answered with errors on Oct 27. Only Rec Park has live court data; other South Bay courts stay static. Transit alerts follow our /metro edits, not Metro’s live alert feed.

Kill switches. WEBHOOKS_LIVE=off: Stops the diff job, deliveries, subscribe and intake. Feeds keep serving the last log. WEBHOOKS_OFF_TYPES: Comma list of event types to stop, for example court.opened,conditions.threshold. PICKLEBALL_LIVE=off: Also stops court.opened.

Corrections. Spot a wrong event or a missing source? Send it through Share a local update.

Follow @elsegundotoday on X for local updates. For builders: /webhooks.json, the JSON Schema, /developers.

All 28 sources
  1. rec.us: El Segundo Recreation Park courts on rec.us (booking page) · checked 2026-10-27
  2. rec.us: rec.us Terms of Service · checked 2026-10-27
  3. elsegundo.xyz: Pickleball near El Segundo (live court grid) · checked 2026-10-27
  4. elsegundo.xyz: South Bay Today · checked 2026-10-27
  5. elsegundo.xyz: Metro: South Bay transit guide (metro.json) · checked 2026-10-27
  6. elsegundo.xyz: Conditions Oracle API (NWS and NOAA data) · checked 2026-10-27
  7. elsegundo.xyz: Resource directory dataset · checked 2026-10-27
  8. elsegundo.xyz: Events hub dataset · checked 2026-10-27
  9. elsegundo.xyz: Business map API (OpenStreetMap data) · checked 2026-10-27
  10. National Weather Service: API Web Service documentation · checked 2026-10-27
  11. NOAA National Data Buoy Center: Station 46221, Santa Monica Bay, CA (CDIP 028) · checked 2026-10-27
  12. U.S. EPA AirNow: AirNow API: current observations by ZIP code (requires a free API key) · checked 2026-10-27
  13. U.S. EPA AirNow: AQI basics (101 and up is unhealthy for sensitive groups) · checked 2026-10-27
  14. Heal the Bay: Beach Report Card with NowCast · checked 2026-10-27
  15. Heal the Bay: Annual Beach and River Report Cards 2025-2026 (what A to F grades mean) · checked 2026-10-27
  16. City of El Segundo: El Segundo City Council meetings and agendas (Granicus) · checked 2026-10-27
  17. City of Redondo Beach: Redondo Beach meetings and agendas (Granicus) · checked 2026-10-27
  18. City of Manhattan Beach: Manhattan Beach meeting calendar (Legistar) · checked 2026-10-27
  19. Granicus: Legistar Web API help · checked 2026-10-27
  20. Standard Webhooks: Standard Webhooks specification (signing scheme and headers) · checked 2026-10-27
  21. JSON Feed: JSON Feed Version 1.1 · checked 2026-10-27
  22. RSS Advisory Board: RSS 2.0 Specification · checked 2026-10-27
  23. Netlify: Scheduled Functions (30-second limit; run only on published deploys) · checked 2026-10-27
  24. Netlify: Netlify Blobs · checked 2026-10-27
  25. Netlify: Rate limiting (function rateLimit config) · checked 2026-10-27
  26. Netlify: Environment variables overview · checked 2026-10-27
  27. OWASP: Server Side Request Forgery · checked 2026-10-27