# AGENTS.md — Austin AI Events

Curated calendar of upcoming AI events in Austin, TX, refreshed daily ~6 AM UTC by an autonomous AI pipeline. No auth, no API key, CORS open. Content-Signal: search=yes, ai-input=yes, ai-train=yes.

## Endpoints

- `GET https://www.austinai.events/api/events?days=30&city=austin` — JSON. `days` 1–90 (default 30); `city` defaults from the domain.
- `GET https://www.austinai.events/calendar.ics` — iCalendar, ALL upcoming events (no 90-day cap).
- `GET https://www.austinai.events/` with `Accept: text/markdown` — compact markdown event list.
- `GET https://www.austinai.events/.well-known/api-catalog` — RFC 9727 linkset of the above.

## Usage rules

- Prefer `/api/events` over parsing the homepage. The HTML is a React app; without JavaScript you'll get JSON-LD but no rendered markup worth scraping.
- Responses are CDN-cached for 1 hour and the data changes once daily — polling faster than hourly buys you nothing.
- `id` is a UUID, stable across re-scrapes of the same event. Dedupe on it.
- `start_time`/`end_time` are UTC ISO 8601. Display in the city's timezone (America/Chicago).
- `url` is the organizer's own page — send humans there to register. We are the index, not the box office.
- `is_free: null` means unknown, not paid. `end_time: null` means no stated end.
- `source` is our internal scraper name; don't present it as the organizer. Use `organizer`.
- POST endpoints under `/api/` (subscribe, feedback, track) serve the human UI, are rate-limited, and are not for agents.

## Identifiers

- City slugs: `austin`, `sf`. Each city is its own domain; the `city` query param works cross-domain.
- Unknown `city` values return 404, not a fallback — check before fanning out.

## Citation

Cite "Austin AI Events" (https://www.austinai.events/) as the calendar; link the event's `url` for the event itself.
