Public APIv1

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.

Base URLhttps://asktc.live/api/v1

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

bash
curl https://asktc.live/api/v1/events \
  -H "Authorization: Bearer aktc_your_api_key_here"
Get your API key from the Settings → API Keys.

Prefer talking to your AI agent instead?

ASKTC has a native MCP server — connect Claude, Cursor, or Windsurf and manage events from a conversation.

View MCP

Rate Limits

Rate limits are enforced per API key using a sliding window. When exceeded, the API returns 429 Too Many Requests.

PlanPer minutePer day
Pro30010,000
Enterprise1,000Unlimited
AI endpoints10 (all plans)

Rate limit headers are returned on every response: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.

Events

GET
/events

List all events owned by the authenticated user.

POST
/events

Create a new event.

titlestringrequired

The event title. Max 100 characters.

event_codestring

Custom join code (4–16 chars, A–Z 0–9). Auto-generated if omitted.

session_modeenum

One of panel, open_floor, thread. Defaults to panel.

descriptionstring

Optional event description. Max 500 characters.

is_asyncboolean

Enable async mode — the event accepts questions before and after the live session ends. Defaults to false.

async_closes_atISO 8601 string

Optional deadline for async submissions. Null = no deadline. Only relevant when is_async is true.

bash
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"}'
GET
/events/:code

Fetch a single event by event code.

PATCH
/events/:code

Update title, description, session_mode, or async settings. Ended events may only change is_async / async_closes_at.

is_asyncboolean

Enable or disable async collection outside the live window.

async_closes_atISO 8601 string | null

Deadline for async submissions, or null to clear.

DELETE
/events/:code

Permanently delete an event and all associated data.

PATCH
/events/:code/schedule

Set or clear the scheduled start time for an event.

scheduled_atISO 8601 string

Set to a future datetime to schedule, or null to clear.

Questions

GET
/events/:code/questions

Fetch all questions for an event, ordered by vote count. Includes answer_text and answered_episode when set.

POST
/events/:code/questions

Submit a question programmatically — agents, bots, Zapier. Works while live or while async collection is still open (deadline respected). Broadcasts via PartyKit.

contentstringrequired

The question text. Max 500 characters.

asked_bystring

Display name shown to the audience. Defaults to Anonymous.

emailstring

Asker's email address. If provided, they get a notification when their question is answered.

sourcestring

Origin of the question — text | telegram | whatsapp. Defaults to text.

statusstring

pending (default) or approved to auto-approve on submit.

PATCH
/events/:code/questions/:id

Moderate a question — approve, reject, mark answered, or push to the projector (agents can drive on_screen).

statusenum

One of pending, approved, on_screen (projector — demotes any previous on-screen question), answered, rejected, ask_later.

answer_textstring

Written answer. Sets status to answered when provided alone.

answered_episodestring

Podcast label, e.g. Episode 47. Included in the asker email when you notify them.

starredboolean

Star or unstar the question.

GET
/events/:code/questions/clusters

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

html
<!-- Paste this where you want the widget to appear -->
<script src="https://asktc.live/embed.js?code=DEVDAY26"></script>
codestringrequired

Your event join code. The widget uses this to route submissions.

heightnumber

Iframe height in pixels. Defaults to 520.

widthstring

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

Questions submitted via the embed are marked 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.

GET
/p/:slug

Public 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:

GET
/api/shows/me

Session auth. Returns the authenticated host’s show row (slug, title, active_event_id, …).

PUT
/api/shows/me

Session auth. Upsert show page. One show per account; slugs are globally unique.

titlestringrequired

Show display name.

slugstringrequired

URL segment, a-z 0-9 hyphens. Conflict → 409 already taken.

taglinestring

Short subtitle.

descriptionstring

About blurb.

active_event_iduuid

Event to collect on — prefer async.

GET
/api/shows/me/episodes

Session auth. List episodes for the host’s show.

POST
/api/shows/me/episodes

Session auth. Pro/Enterprise only (402 on Free). Add an episode to the public archive.

titlestringrequired

Episode title.

episode_labelstring

e.g. Episode 47.

summarystring

Short notes.

external_urlstring

Spotify / Apple / YouTube link.

DELETE
/api/shows/me/episodes?id=

Session auth. Delete one episode by id.

Agents moderating podcast Q&A still use the v1 key on PATCH /events/:code/questions/:id with answered_episode. Show page CRUD is host-dashboard only for now.

Panelists

GET
/events/:code/panelists

List all panelists for an event.

POST
/events/:code/panelists

Add a panelist to an event.

namestringrequired

Panelist full name.

titlestring

Job title or role.

topicsstring

Comma-separated topics this panelist covers.

PATCH
/events/:code/panelists?id=

Update a panelist's name, title, or topics. Useful for correcting AI-extracted panelist details.

namestring

Updated display name.

titlestring

Updated role/title. Pass null to clear.

topicsstring

Updated comma-separated topics. Pass null to clear.

DELETE
/events/:code/panelists/:id

Remove a panelist from an event.

Moderators

GET
/events/:code/moderators

List all co-moderators for an event.

POST
/events/:code/moderators

Invite a co-moderator by user ID.

user_idstringrequired

The ASKTC user ID of the co-moderator.

DELETE
/events/:code/moderators/:id

Remove a co-moderator from an event.

Polls

GET
/events/:code/polls

List all polls for an event, including live vote counts per option.

statusstring

Filter by status — draft | active | closed.

POST
/events/:code/polls

Create a poll. Set status to 'active' to launch it immediately — any currently active poll will be closed automatically.

questionstringrequired

The poll question.

optionsstring[]required

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

statusstring

draft (default) or active to launch immediately.

is_quizboolean

Enable quiz mode with a correct answer. Defaults to false.

correct_optionnumber

0-based index of the correct option. Required when is_quiz is true.

PATCH
/events/:code/polls?id=

Update a poll's status — launch, close, or revert to draft. Broadcasts live via PartyKit.

statusstringrequired

draft | active | closed.

DELETE
/events/:code/polls?id=

Delete a poll and all its votes.

Breakout Rooms

GET
/events/:code/breakout

List all breakout rooms for an event.

POST
/events/:code/breakout

Create a breakout room.

namestringrequired

Room name.

capacitynumber

Max participants. Defaults to unlimited.

PATCH
/events/:code/breakout/:id

Update a breakout room's name or capacity.

DELETE
/events/:code/breakout/:id

Delete a breakout room.

AI

AI endpoints are rate-limited to 10 requests per minute across all plans.
POST
/ai/create-event

Create a fully structured event from a natural language prompt. AI picks session mode, detects async/podcast collection, optional deadline, and named panelists.

promptstringrequired

Plain English description (max 1000 chars). Say “podcast”, “collect over a week”, or similar to enable is_async.

event_codestring

Override the AI's suggested join code.

dry_runboolean

If true, returns the AI plan without creating anything. Use to preview before committing.

bash
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
  }'
json
{
  "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

GET
/events/:code/report

Full event summary — questions, polls, answer counts, top voted, participation stats.

POST
/events/:code/report/send

Email the event report to the host and any specified recipients.

emailsstring[]

Additional recipient emails beyond the host.

GET
/events/:code/sentiment

Aggregated sentiment breakdown across all audience questions — positive, neutral, negative percentages with top themes.

Errors

All errors return a JSON object with an error field.

StatusMeaning
400Bad Request — missing or invalid parameters.
401Unauthorized — missing or invalid API key.
403Forbidden — your plan doesn't support this endpoint.
404Not Found — event or resource doesn't exist.
409Conflict — event code already taken.
429Too Many Requests — rate limit exceeded.
500Internal Server Error — something went wrong on our end.
502Bad Gateway — AI service unavailable.
json
{
  "error": "Event code \"DEVDAY26\" is already taken. Pass a custom event_code or omit it to auto-generate."}

ASKTC API v1 · Built with 🧡 in Nigeria