curl --request POST \
--url https://public-api.sessionboard.com/v1/event/{eventId}/ask \
--header 'Content-Type: application/json' \
--header 'x-access-token: <api-key>' \
--data '
{
"question": "Which sessions on Tuesday cover AI?",
"lang": "en"
}
'import requests
url = "https://public-api.sessionboard.com/v1/event/{eventId}/ask"
payload = {
"question": "Which sessions on Tuesday cover AI?",
"lang": "en"
}
headers = {
"x-access-token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-access-token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({question: 'Which sessions on Tuesday cover AI?', lang: 'en'})
};
fetch('https://public-api.sessionboard.com/v1/event/{eventId}/ask', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://public-api.sessionboard.com/v1/event/{eventId}/ask",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'question' => 'Which sessions on Tuesday cover AI?',
'lang' => 'en'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-access-token: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://public-api.sessionboard.com/v1/event/{eventId}/ask"
payload := strings.NewReader("{\n \"question\": \"Which sessions on Tuesday cover AI?\",\n \"lang\": \"en\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-access-token", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://public-api.sessionboard.com/v1/event/{eventId}/ask")
.header("x-access-token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"question\": \"Which sessions on Tuesday cover AI?\",\n \"lang\": \"en\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://public-api.sessionboard.com/v1/event/{eventId}/ask")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-access-token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"question\": \"Which sessions on Tuesday cover AI?\",\n \"lang\": \"en\"\n}"
response = http.request(request)
puts response.read_body{
"status": "ok",
"answer": "Two sessions on Tuesday cover AI [1] [2].",
"citations": [
{
"index": 1,
"type": "session",
"id": "3f2a9c1e-5b7d-4e8a-9c0f-1a2b3c4d5e6f",
"title": "Applied AI in Clinical Practice",
"starts_at": "2026-11-10T14:00:00.000Z"
},
{
"index": 2,
"type": "session",
"id": "8d1e4b2a-6c3f-4a9e-b7d0-2e3f4a5b6c7d",
"title": "Panel: Where AI Helps and Where It Hurts",
"starts_at": "2026-11-10T16:30:00.000Z"
}
],
"actions": [],
"conversation_id": "7b0c0e0c-9a39-4b8f-9d5d-1e2f3a4b5c6d",
"message_id": "2c9e7a41-0b3d-4f6e-8a1c-5d4e3f2a1b0c"
}Ask a question about an event
Ask a question about one event in plain language and get an answer written for the
organizer. The answer is grounded in the event’s program (sessions, speakers, exhibitors,
sponsors), session transcripts, the event’s knowledge and pinned answers, and the
Sessionboard Help Center. [n] markers in answer point at citations[] entry index n;
citations are built from records, never from model text.
Read-only: nothing in the event changes and actions is always [].
Requires the read:ask scope, granted explicitly — a legacy token with an empty scope
list does not get it. The token’s event allow-list and the organization’s AI features
switch apply.
Slow. An answer takes several seconds and can take up to 90; set your client timeout
to at least 90 seconds. If Sessionboard does not answer in time the API returns 504.
To ask a follow-up in the same thread, send back the conversation_id from the previous
answer. A conversation continues only for the same token and user; any other
conversation_id starts a new conversation.
The API request log records the call with question redacted.
curl --request POST \
--url https://public-api.sessionboard.com/v1/event/{eventId}/ask \
--header 'Content-Type: application/json' \
--header 'x-access-token: <api-key>' \
--data '
{
"question": "Which sessions on Tuesday cover AI?",
"lang": "en"
}
'import requests
url = "https://public-api.sessionboard.com/v1/event/{eventId}/ask"
payload = {
"question": "Which sessions on Tuesday cover AI?",
"lang": "en"
}
headers = {
"x-access-token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-access-token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({question: 'Which sessions on Tuesday cover AI?', lang: 'en'})
};
fetch('https://public-api.sessionboard.com/v1/event/{eventId}/ask', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://public-api.sessionboard.com/v1/event/{eventId}/ask",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'question' => 'Which sessions on Tuesday cover AI?',
'lang' => 'en'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-access-token: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://public-api.sessionboard.com/v1/event/{eventId}/ask"
payload := strings.NewReader("{\n \"question\": \"Which sessions on Tuesday cover AI?\",\n \"lang\": \"en\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-access-token", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://public-api.sessionboard.com/v1/event/{eventId}/ask")
.header("x-access-token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"question\": \"Which sessions on Tuesday cover AI?\",\n \"lang\": \"en\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://public-api.sessionboard.com/v1/event/{eventId}/ask")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-access-token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"question\": \"Which sessions on Tuesday cover AI?\",\n \"lang\": \"en\"\n}"
response = http.request(request)
puts response.read_body{
"status": "ok",
"answer": "Two sessions on Tuesday cover AI [1] [2].",
"citations": [
{
"index": 1,
"type": "session",
"id": "3f2a9c1e-5b7d-4e8a-9c0f-1a2b3c4d5e6f",
"title": "Applied AI in Clinical Practice",
"starts_at": "2026-11-10T14:00:00.000Z"
},
{
"index": 2,
"type": "session",
"id": "8d1e4b2a-6c3f-4a9e-b7d0-2e3f4a5b6c7d",
"title": "Panel: Where AI Helps and Where It Hurts",
"starts_at": "2026-11-10T16:30:00.000Z"
}
],
"actions": [],
"conversation_id": "7b0c0e0c-9a39-4b8f-9d5d-1e2f3a4b5c6d",
"message_id": "2c9e7a41-0b3d-4f6e-8a1c-5d4e3f2a1b0c"
}Authorizations
Organization API token. Generate from Organization Settings → API Tokens.
Path Parameters
The event to ask about.
Body
The question, in plain language. Whitespace is collapsed before the length check:
under 2 or over 500 characters returns 422 (empty / too_long), and a value over
1000 characters is rejected with 400.
2 - 500The conversation_id from a previous answer, to ask a follow-up in the same thread.
Answer language as a language tag, e.g. en, fr, pt-BR.
16^[A-Za-z]{2,3}([-_][A-Za-z0-9]{2,8})?$Response
The answer and its sources.
ok The answer as Markdown. [n] marks citation n.
Show child attributes
Show child attributes
Always empty — this endpoint is read-only.
Send this back with a follow-up question to continue the conversation.
The id of this answer.

