ASKTC API Reference
Build live Q&A, audience engagement, and event automation into your product. The ASKTC API is REST-based, returns JSON, and uses API key authentication.
Overview
API Key Auth
All requests require a Bearer token in the Authorization header.
REST + JSON
Standard HTTP methods. All responses are JSON.
AI-powered
Create events from plain English, cluster questions, and analyse sentiment.
Real-time ready
Pair with ASKTC's PartyKit layer for live audience data.
Authentication
All API requests must include your API key as a Bearer token in the Authorization header. API keys start with aktc_.
curl https://asktc.live/api/v1/events \
-H "Authorization: Bearer aktc_your_api_key_here"Prefer talking to your AI agent instead?
ASKTC has a native MCP server — connect Claude, Cursor, or Windsurf and manage events from a conversation.
Rate Limits
Rate limits are enforced per API key using a sliding window. When exceeded, the API returns 429 Too Many Requests.
| Plan | Per minute | Per day |
|---|---|---|
| Pro | 300 | 10,000 |
| Enterprise | 1,000 | Unlimited |
| AI endpoints | 10 (all plans) | — |
Rate limit headers are returned on every response: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.
Events
/eventsList all events owned by the authenticated user.
/eventsCreate a new event.
titlestringrequiredThe event title. Max 100 characters.
event_codestringCustom join code (4–16 chars, A–Z 0–9). Auto-generated if omitted.
session_modeenumOne of panel, open_floor, thread. Defaults to panel.
descriptionstringOptional event description. Max 500 characters.
is_asyncbooleanEnable async mode — the event accepts questions before and after the live session ends. Defaults to false.
async_closes_atISO 8601 stringOptional deadline for async submissions. Null = no deadline. Only relevant when is_async is true.
curl -X POST https://asktc.live/api/v1/events \
-H "Authorization: Bearer aktc_..." \
-H "Content-Type: application/json" \
-d '{"title": "DevDay Lagos 2026", "session_mode": "panel", "event_code": "DEVDAY26"}'/events/:codeFetch a single event by event code.
/events/:codeUpdate title, description, session_mode, or async settings. Ended events may only change is_async / async_closes_at.
is_asyncbooleanEnable or disable async collection outside the live window.
async_closes_atISO 8601 string | nullDeadline for async submissions, or null to clear.
/events/:codePermanently delete an event and all associated data.
/events/:code/scheduleSet or clear the scheduled start time for an event.
scheduled_atISO 8601 stringSet to a future datetime to schedule, or null to clear.
Questions
/events/:code/questionsFetch all questions for an event, ordered by vote count. Includes answer_text and answered_episode when set.
/events/:code/questionsSubmit a question programmatically — agents, bots, Zapier. Works while live or while async collection is still open (deadline respected). Broadcasts via PartyKit.
contentstringrequiredThe question text. Max 500 characters.
asked_bystringDisplay name shown to the audience. Defaults to Anonymous.
emailstringAsker's email address. If provided, they get a notification when their question is answered.
sourcestringOrigin of the question — text | telegram | whatsapp. Defaults to text.
statusstringpending (default) or approved to auto-approve on submit.
/events/:code/questions/:idModerate a question — approve, reject, mark answered, or push to the projector (agents can drive on_screen).
statusenumOne of pending, approved, on_screen (projector — demotes any previous on-screen question), answered, rejected, ask_later.
answer_textstringWritten answer. Sets status to answered when provided alone.
answered_episodestringPodcast label, e.g. Episode 47. Included in the asker email when you notify them.
starredbooleanStar or unstar the question.
/events/:code/questions/clustersAI-powered — group semantically similar questions into clusters. Useful for surfacing themes across hundreds of submissions.
Embed Widget
Drop a live Q&A question box onto any website with a single script tag — no API key required. Questions submitted through the embed land in your moderator queue exactly like audience submissions from the ASKTC room.
<!-- Paste this where you want the widget to appear -->
<script src="https://asktc.live/embed.js?code=DEVDAY26"></script>codestringrequiredYour event join code. The widget uses this to route submissions.
heightnumberIframe height in pixels. Defaults to 520.
widthstringIframe width. Accepts px or %. Defaults to 100%.
The widget iframe is served from /embed/:code and accepts questions on events that are live or in async mode. It is CORS-open — safe to embed on any domain.
pending and go through the same moderation flow as audience submissions. Enable async mode on your event to keep accepting embed submissions after the live session ends.The embed UI includes Top questions (ranked + upvote) and Ask tabs — same engine as the room and hosted show page. Optional query theme=dark on the embed URL for dark surfaces.
Show Pages
Hosted show notes for podcasters who do not have a website: https://asktc.live/p/{slug}. Listeners ask and upvote via the same ranking widget as the embed. Optional episode archive lists past shows.
/p/:slugPublic HTML show page (not JSON). Renders show profile, linked async collect (embed), and episode list.
Host setup is in the dashboard (Show page) — session cookie auth, not the API key. Management endpoints:
/api/shows/meSession auth. Returns the authenticated host’s show row (slug, title, active_event_id, …).
/api/shows/meSession auth. Upsert show page. One show per account; slugs are globally unique.
titlestringrequiredShow display name.
slugstringrequiredURL segment, a-z 0-9 hyphens. Conflict → 409 already taken.
taglinestringShort subtitle.
descriptionstringAbout blurb.
active_event_iduuidEvent to collect on — prefer async.
/api/shows/me/episodesSession auth. List episodes for the host’s show.
/api/shows/me/episodesSession auth. Pro/Enterprise only (402 on Free). Add an episode to the public archive.
titlestringrequiredEpisode title.
episode_labelstringe.g. Episode 47.
summarystringShort notes.
external_urlstringSpotify / Apple / YouTube link.
/api/shows/me/episodes?id=Session auth. Delete one episode by id.
PATCH /events/:code/questions/:id with answered_episode. Show page CRUD is host-dashboard only for now.Panelists
/events/:code/panelistsList all panelists for an event.
/events/:code/panelistsAdd a panelist to an event.
namestringrequiredPanelist full name.
titlestringJob title or role.
topicsstringComma-separated topics this panelist covers.
/events/:code/panelists?id=Update a panelist's name, title, or topics. Useful for correcting AI-extracted panelist details.
namestringUpdated display name.
titlestringUpdated role/title. Pass null to clear.
topicsstringUpdated comma-separated topics. Pass null to clear.
/events/:code/panelists/:idRemove a panelist from an event.
Moderators
/events/:code/moderatorsList all co-moderators for an event.
/events/:code/moderatorsInvite a co-moderator by user ID.
user_idstringrequiredThe ASKTC user ID of the co-moderator.
/events/:code/moderators/:idRemove a co-moderator from an event.
Polls
/events/:code/pollsList all polls for an event, including live vote counts per option.
statusstringFilter by status — draft | active | closed.
/events/:code/pollsCreate a poll. Set status to 'active' to launch it immediately — any currently active poll will be closed automatically.
questionstringrequiredThe poll question.
optionsstring[]requiredAt least 2 answer options, max 10.
option_imagesstring[]Parallel array of image URLs, one per option — turns this into an image-choice poll. Upload images to your own host first (the dashboard uploads to ASKTC's own storage automatically; via the API you supply the URLs).
statusstringdraft (default) or active to launch immediately.
is_quizbooleanEnable quiz mode with a correct answer. Defaults to false.
correct_optionnumber0-based index of the correct option. Required when is_quiz is true.
/events/:code/polls?id=Update a poll's status — launch, close, or revert to draft. Broadcasts live via PartyKit.
statusstringrequireddraft | active | closed.
/events/:code/polls?id=Delete a poll and all its votes.
Breakout Rooms
/events/:code/breakoutList all breakout rooms for an event.
/events/:code/breakoutCreate a breakout room.
namestringrequiredRoom name.
capacitynumberMax participants. Defaults to unlimited.
/events/:code/breakout/:idUpdate a breakout room's name or capacity.
/events/:code/breakout/:idDelete a breakout room.
AI
/ai/create-eventCreate a fully structured event from a natural language prompt. AI picks session mode, detects async/podcast collection, optional deadline, and named panelists.
promptstringrequiredPlain English description (max 1000 chars). Say “podcast”, “collect over a week”, or similar to enable is_async.
event_codestringOverride the AI's suggested join code.
dry_runbooleanIf true, returns the AI plan without creating anything. Use to preview before committing.
curl -X POST https://asktc.live/api/v1/ai/create-event \
-H "Authorization: Bearer aktc_..." \
-H "Content-Type: application/json" \
-d '{
"prompt": "A fintech panel at Lagos Tech Week with Ada Obi covering regulation and Emeka Nwosu on infrastructure",
"dry_run": false
}'{
"event": {
"id": "evt_...",
"title": "Lagos Tech Week — Fintech Panel",
"event_code": "LAGOSTECHWK",
"session_mode": "panel",
"status": "waiting",
"is_async": false,
"async_closes_at": null,
"created_at": "2026-08-02T10:00:00Z"},
"panelists": [
{ "id": "p_...", "name": "Ada Obi", "title": null, "topics": "regulation"},
{ "id": "p_...", "name": "Emeka Nwosu","title": null, "topics": "infrastructure"}
],
"plan": {
"reasoning": "Named panelists detected; panel mode selected.",
"suggested_event_code": "LAGOSTECHWK"},
"dry_run": false
}Reports & Analytics
/events/:code/reportFull event summary — questions, polls, answer counts, top voted, participation stats.
/events/:code/report/sendEmail the event report to the host and any specified recipients.
emailsstring[]Additional recipient emails beyond the host.
/events/:code/sentimentAggregated sentiment breakdown across all audience questions — positive, neutral, negative percentages with top themes.
Errors
All errors return a JSON object with an error field.
| Status | Meaning |
|---|---|
| 400 | Bad Request — missing or invalid parameters. |
| 401 | Unauthorized — missing or invalid API key. |
| 403 | Forbidden — your plan doesn't support this endpoint. |
| 404 | Not Found — event or resource doesn't exist. |
| 409 | Conflict — event code already taken. |
| 429 | Too Many Requests — rate limit exceeded. |
| 500 | Internal Server Error — something went wrong on our end. |
| 502 | Bad Gateway — AI service unavailable. |
{
"error": "Event code \"DEVDAY26\" is already taken. Pass a custom event_code or omit it to auto-generate."}