Companion Doc

Perxona CallFunc Demo β€” API Reference

Base URL (local): http://localhost:8090 Base URL (public): your Cloudflare tunnel, e.g. https://<random>.trycloudflare.com

Readable HTML layout Audience: Reference schemas and payloads
Blue blocks Concrete actions to take in the console.
Amber blocks Common gotchas, limits, and caveats.
Green blocks Checks that tell you things are working.
Purple blocks Prompt snippets you can hand to AI tools.

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