Open API
The full, ranked event catalogue behind one grammar: describe what you want (q) or filter it (city, topic, seniority, …), then take the answer as JSON, markdown, a live calendar or through MCP. Reading is keyless and CORS-open; only writing needs a key. Every event keeps its original source link.
JSON
GET /api/events
Ranked results with match reasons — for programs.
Markdown
GET /at.md
The same feed as a paste-ready document — for docs, READMEs and LLM context.
iCal
GET /api/calendar
A live subscription — the URL is the calendar.
MCP
POST /api/mcp
Your AI assistant searches, ranks and RSVPs natively.
Write
POST /api/events
Push your events in, idempotent on your own id — needs a key.
The same question, three answers — swap the path, keep the query.
curl "https://www.hackevents.net/api/events?country=at&q=ai+startups&limit=5"
curl "https://www.hackevents.net/at.md?q=ai+startups"
webcal://www.hackevents.net/api/calendar?q=ai+startups&country=at
GET /api/events
A natural-language q ranks results and explains each match; structured params hard-filter. Compose freely.
curl "https://www.hackevents.net/api/events?\ country=at&\ q=biotech executive into longevity and investing&\ city=Zurich&limit=10"
Parameters
| country | ch | de | at (default ch) |
| q | free-text prompt — ranked, with match reasons |
| topic | comma list: ai-ml,robotics,biotech,… |
| seniority | comma list: student,junior,mid,senior,executive |
| city | Zurich, Geneva, Basel, … (+ near=1 for ~45 km around it) |
| format | in_person | online | hybrid |
| org | one organizer's events, exact match |
| who | founders — rooms where founders & execs actually go |
| limit | 1–100 (default 50) |
Response
{
"query": { "country": "at", "q": "...", "topics": ["biotech","ai-ml"], "limit": 10 },
"count": 10, "total": 41,
"understood": "You're a biotech executive, into ...",
"calendar": "https://www.hackevents.net/api/calendar?q=...&country=at",
"events": [
{
"id": "swiss-biotech-leaders-forum-basel",
"title": "Swiss Biotech Leaders Forum",
"start": "2026-07-30T07:00:00.000Z",
"format": "in_person", "rsvp": "invite",
"city": "Basel", "venue": "Congress Center Basel",
// geo.precision: exact = the event's own point; city/country = a centroid stand-in
"geo": { "lat": 47.5596, "lng": 7.5886, "precision": "city" },
"price": { "type": "paid", "amount": 380, "currency": "CHF" },
"topics": ["biotech","ai-ml"], "seniority": ["executive","senior"],
"organizer": "Swiss Biotech Association",
"source": "curated",
"sourceUrl": "https://lu.ma/swiss-biotech-leaders", // original link
"url": "https://www.hackevents.net/at/events/swiss-biotech-leaders-forum-basel",
"matchReasons": ["Matches Biotech + AI / ML", "9 founders & execs in the room"]
}
]
}GET /at.md · GET /api/md
Any feed URL again, rendered as a GitHub-flavoured markdown table — made to be pasted into a community doc, a README or a chat, and to be fetched by an LLM as context. Every page has a guessable .md twin:
| /at.md | the whole country feed |
| /at/cities/zurich.md | one city |
| /at/topics/robotics.md | one topic |
| /at.md?q=ai+startups | any prompt — same q as everywhere else |
| /api/md?org=…&country=… | one organizer's events (for their own site) |
# Tech events — robotics 12 upcoming events · AT · generated 21 Aug 2026 > Live source: https://www.hackevents.net/api/md?country=at&topic=robotics > — this document is a snapshot; the URL always has the current list. | When | Event | Where | Host | Crowd | |---|---|---|---|---| | Thu 03 Sep 2026 · 18:00 | [Robotics Meetup](https://www.hackevents.net/…) | Zurich | ETH AI Center | ~120 expected | | Sat 12 Sep 2026 · Full day | [Swiss Robotics Day](…) | Lausanne | EPFL | ~800 expected |
The document keeps the site's honesty rules: crowd figures are estimates and say so, an all-day event shows no invented clock time, and links land on the event page, which carries the original ticket link.
GET /api/calendar
Returns live text/calendar with reminders. The URL is the subscription: it re-queries on every refresh, so new matching events simply appear in Google / Apple / Outlook.
webcal://www.hackevents.net/api/calendar?q=learning%20python&country=at
https://www.hackevents.net/api/calendar?topic=robotics&city=Zurich&country=at https://www.hackevents.net/api/calendar?org=ETH%20AI%20Center&country=at
POST /api/mcp · streamable HTTP · protocol 2025-06-18
A native Model Context Protocol server — take your human to the best next tech event. Six tools: search_events, find_events, best_next_event, get_event, subscribe_calendar and rsvp — only the last one needs a key.
claude mcp add hackevents --transport http https://www.hackevents.net/api/mcp
{
"mcpServers": {
"hackevents": { "type": "http", "url": "https://www.hackevents.net/api/mcp" }
}
}Building on the raw API instead? Pass a user's sentence straight into q, read matchReasons and understood to explain your picks, link back via sourceUrl, and hand off the calendar URL as a living subscription.
POST /api/events · GET /api/events?mine=1
Hosts and platforms push events in and pull them back out — authenticated with a per-host API key. Keep your own system of record: pass a stable externalId and re-POSTing the same event updates your listing instead of duplicating it.
curl -X POST https://www.hackevents.net/api/events \
-H "Authorization: Bearer hk_live_…" \
-H "Content-Type: application/json" \
-d '{
"title": "Zurich AI Builders Night",
"startAt": "2026-09-15T18:30:00+02:00",
"city": "Zurich", "venue": "Impact Hub",
"topics": ["ai-ml"], "regMode": "waitlist", "capacity": 80,
"externalId": "your-system-id-123"
}'
# → { "id": "zurich-ai-builders-night", "url": "…", "created": true }
# Pull your own events back (incl. unlisted):
curl "https://www.hackevents.net/api/events?mine=1" \
-H "Authorization: Bearer hk_live_…"Body fields
| title * | event name |
| startAt * | ISO 8601 with offset, e.g. 2026-09-15T18:30:00+02:00 |
| endAt | ISO 8601 (optional) |
| city / venue | location (omit for online) |
| format | in_person | online | hybrid (default in_person) |
| topics | array, e.g. ["ai-ml","robotics"] |
| regMode | open | invite | waitlist (default open) |
| capacity | integer (optional) |
| price / priceAmount | free | paid, amount in CHF |
| url | your own event/registration link (optional) |
| visibility | public | unlisted |
| externalId | your id — key for idempotent updates |