Auth: every function endpoint requires the header X-API-Key: <your key> (the value in .env).
/health, /docs, /redoc, and /openapi.json are open (no key).
Interactive docs are auto-generated by FastAPI:
| URL | What |
|---|---|
/docs |
Swagger UI (try-it-out) |
/redoc |
ReDoc reference |
/openapi.json |
Machine-readable OpenAPI 3.1 spec |
1. get_schedule β list conference sessions
GET /get_schedule?day=&track=&speaker=
Query parameters (all optional):
| name | type | description |
|---|---|---|
day |
string | Day label "Day 1" / "Day 2", or ISO date "2026-06-24" / "2026-06-25". |
track |
string | Track substring, e.g. "Leadership", "Performance", "Workshop". |
speaker |
string | Speaker-name substring, e.g. "Ohtani" or "Kumamon". |
JSON Schema β query params (paste into Perxona CallFunc βΊ query params):
{
"type": "object",
"properties": {
"day": { "type": "string", "description": "Day label ('Day 1') or ISO date ('2026-06-24')." },
"track": { "type": "string", "description": "Track substring, e.g. 'Performance' or 'Workshop'." },
"speaker": { "type": "string", "description": "Speaker name substring, e.g. 'Ohtani'." }
}
}
Example
curl -s "$BASE/get_schedule?day=Day%201&track=Performance" -H "X-API-Key: $KEY"
{
"count": 1,
"sessions": [
{ "id": "s2", "title": "Full-Stack Athlete: How to Pitch AND Hit in the Same Sprint", "speaker": "Shohei Ohtani",
"track": "Performance", "room": "Room A", "day": "Day 1", "date": "2026-06-24",
"start": "2026-06-24T11:00", "end": "2026-06-24T11:45" }
]
}
Output schema (paste into Perxona CallFunc βΊ Output data):
| field | type | description |
|---|---|---|
count |
integer | Number of sessions returned. |
sessions |
array of objects | Matching sessions; each item has the fields below. |
sessions[].id |
string | Session id. |
sessions[].title |
string | Session title. |
sessions[].speaker |
string | Speaker name. |
sessions[].track |
string | Track, e.g. "Performance". |
sessions[].room |
string | Room name. |
sessions[].day |
string | Day label, e.g. "Day 1". |
sessions[].date |
string | ISO date YYYY-MM-DD. |
sessions[].start |
string | Local start datetime, ISO 8601 (no offset). |
sessions[].end |
string | Local end datetime, ISO 8601 (no offset). |
{
"type": "object",
"properties": {
"count": { "type": "integer", "description": "Number of sessions returned." },
"sessions": {
"type": "array",
"description": "Matching sessions.",
"items": {
"type": "object",
"properties": {
"id": { "type": "string", "description": "Session id." },
"title": { "type": "string", "description": "Session title." },
"speaker": { "type": "string", "description": "Speaker name." },
"track": { "type": "string", "description": "Track, e.g. 'Performance'." },
"room": { "type": "string", "description": "Room name." },
"day": { "type": "string", "description": "Day label, e.g. 'Day 1'." },
"date": { "type": "string", "description": "ISO date YYYY-MM-DD." },
"start": { "type": "string", "description": "Local start datetime, ISO 8601 (no offset)." },
"end": { "type": "string", "description": "Local end datetime, ISO 8601 (no offset)." }
}
}
}
}
}
2. get_speaker β look up speaker(s)
GET /get_speaker?name=&id=
Query parameters (both optional; omit both to list everyone):
| name | type | description |
|---|---|---|
name |
string | Speaker-name substring (case-insensitive). |
id |
string | Exact speaker id, e.g. "spk_ohtani". |
JSON Schema β query params:
{
"type": "object",
"properties": {
"name": { "type": "string", "description": "Speaker name to search for (substring)." },
"id": { "type": "string", "description": "Exact speaker id, e.g. 'spk_ohtani'." }
}
}
Example
curl -s "$BASE/get_speaker?name=ohtani" -H "X-API-Key: $KEY"
{
"count": 1,
"speakers": [
{ "id": "spk_ohtani", "name": "Shohei Ohtani", "title": "Two-Way Player β Pitcher & Designated Hitter",
"company": "Los Angeles Dodgers", "bio": "The only engineer who is both the frontend AND the backend. Throws it at 100 mph, then hits it back even harder. Swears his real secret weapon is sleeping 10 hours a night β he calls it his cache layer.",
"topics": ["peak performance", "two-way ops", "discipline"],
"sessions": ["Full-Stack Athlete: How to Pitch AND Hit in the Same Sprint", "Batting Practice for Builders: Swinging at Every Pitch Life Throws"] }
]
}
Output schema (paste into Perxona CallFunc βΊ Output data):
| field | type | description |
|---|---|---|
count |
integer | Number of speakers returned. |
speakers |
array of objects | Matching speakers; each item has the fields below. |
speakers[].id |
string | Speaker id, e.g. "spk_ohtani". |
speakers[].name |
string | Full name. |
speakers[].title |
string | Job title. |
speakers[].company |
string | Company / organization. |
speakers[].bio |
string | Short biography. |
speakers[].topics |
array of strings | Topics the speaker covers. |
speakers[].sessions |
array of strings | Titles of sessions this speaker presents. |
{
"type": "object",
"properties": {
"count": { "type": "integer", "description": "Number of speakers returned." },
"speakers": {
"type": "array",
"description": "Matching speakers.",
"items": {
"type": "object",
"properties": {
"id": { "type": "string", "description": "Speaker id, e.g. 'spk_ohtani'." },
"name": { "type": "string", "description": "Full name." },
"title": { "type": "string", "description": "Job title." },
"company": { "type": "string", "description": "Company / organization." },
"bio": { "type": "string", "description": "Short biography." },
"topics": { "type": "array", "items": { "type": "string" }, "description": "Topics the speaker covers." },
"sessions": { "type": "array", "items": { "type": "string" }, "description": "Titles of sessions this speaker presents." }
}
}
}
}
}
3. book_meeting β book a 1:1 with a speaker (β Google Calendar)
POST /book_meeting
Content-Type: application/json
Body
| field | type | required | description |
|---|---|---|---|
attendee_name |
string | β | Who is requesting the meeting. |
speaker |
string | β | Speaker to meet (see get_speaker), e.g. "Shohei Ohtani" or "Tanjiro Kamado". |
date |
string | β | YYYY-MM-DD, typically 2026-06-24 or 2026-06-25 for the demo conference. |
start_time |
string | β | HH:MM (24h), interpreted in the server timezone. |
duration_minutes |
integer | β | 5β240, default 30. |
attendee_email |
string | β | Added to the event description. |
topic |
string | β | Meeting topic. |
JSON Schema β payload (paste into Perxona CallFunc βΊ payload):
{
"type": "object",
"required": ["attendee_name", "speaker", "date", "start_time"],
"properties": {
"attendee_name": { "type": "string", "description": "Name of the person requesting the meeting." },
"speaker": { "type": "string", "description": "Name of the speaker to meet, e.g. 'Shohei Ohtani'." },
"date": { "type": "string", "description": "Meeting date, YYYY-MM-DD (for the demo, usually 2026-06-24 or 2026-06-25)." },
"start_time": { "type": "string", "description": "Local start time, 24h HH:MM." },
"duration_minutes": { "type": "integer", "minimum": 5, "maximum": 240, "default": 30 },
"attendee_email": { "type": "string", "description": "Optional attendee email." },
"topic": { "type": "string", "description": "Optional meeting topic." }
}
}
Example
curl -s -X POST "$BASE/book_meeting" \
-H "X-API-Key: $KEY" -H "Content-Type: application/json" \
-d '{"attendee_name":"Sam Patel","speaker":"Shohei Ohtani","date":"2026-06-24","start_time":"16:00","duration_minutes":30,"topic":"Peak performance Q&A"}'
{
"booking_id": "bk-1a2b3c4d5e",
"status": "confirmed",
"mode": "google_calendar",
"summary": "1:1: Sam Patel β Shohei Ohtani β Peak performance Q&A",
"speaker": "Shohei Ohtani",
"start": "2026-06-24T16:00:00+08:00",
"end": "2026-06-24T16:30:00+08:00",
"timezone": "Asia/Taipei",
"event_link": "https://www.google.com/calendar/event?eid=β¦",
"message": "Meeting confirmed and added to the calendar for 2026-06-24 16:00."
}
Output schema (paste into Perxona CallFunc βΊ Output data):
| field | type | description |
|---|---|---|
booking_id |
string | Unique booking id, e.g. "bk-1a2b3c4d5e". |
status |
string | Always "confirmed" on success. |
mode |
string | "google_calendar" if written to a real calendar, else "mock". |
summary |
string | Event title. |
speaker |
string | Resolved speaker name. |
start |
string | Event start, ISO 8601 with timezone offset. |
end |
string | Event end, ISO 8601 with timezone offset. |
timezone |
string | IANA timezone, e.g. "Asia/Taipei". |
event_link |
string | null | Google Calendar event URL (null in mock mode). |
message |
string | Human-readable confirmation message. |
{
"type": "object",
"properties": {
"booking_id": { "type": "string", "description": "Unique booking id, e.g. 'bk-1a2b3c4d5e'." },
"status": { "type": "string", "description": "Always 'confirmed' on success." },
"mode": { "type": "string", "description": "'google_calendar' if written to a real calendar, else 'mock'." },
"summary": { "type": "string", "description": "Event title." },
"speaker": { "type": "string", "description": "Resolved speaker name." },
"start": { "type": "string", "description": "Event start, ISO 8601 with timezone offset." },
"end": { "type": "string", "description": "Event end, ISO 8601 with timezone offset." },
"timezone": { "type": "string", "description": "IANA timezone, e.g. 'Asia/Taipei'." },
"event_link": { "type": ["string", "null"], "description": "Google Calendar event URL (null in mock mode)." },
"message": { "type": "string", "description": "Human-readable confirmation message." }
}
}
Errors
| status | when |
|---|---|
401 |
Missing/invalid X-API-Key. |
422 |
Bad date/start_time format, or missing required body fields. |
502 |
Google configured but the Calendar insert failed (detail included). |