How an event is doing (turnout and pacing)
US Region: https://public-api.sessionboard.com · EU Region: https://public-api-eu.sessionboard.com
"How's it doing?" for one event or webinar. Defaults to the next upcoming event; pass eventId for another one. Returns registrations so far, an estimate of registrations and turnout at the event date, and pace against the event's goal. The estimate comes with a range, a confidence label (low, medium, high) and a plain sentence saying how it was estimated. You also get the last comparable edition, registrations by day before the event (for a chart), the time of week the organization's emails get opened most, and two or three suggestions. Every number under prediction is an estimate. When there is not enough history, prediction.status is insufficient_history (or too_early) and no number is returned. With no goal set, the goal is the last comparable edition's numbers (goal.source: last_edition, goal.default: true). Cancelled registrations are not counted. Comparisons with other organizations are aggregate statistics only, never another organization's events or numbers. Requires read:marketing. Also at GET /v1/marketing/goals/turnout.
Request example
curl --request GET \ --url 'https://public-api.sessionboard.com/v1/organization/{orgId}/marketing/goals/turnout' \ --header 'x-access-token: <api-token>'const response = await fetch('https://public-api.sessionboard.com/v1/organization/{orgId}/marketing/goals/turnout', { method: 'GET', headers: { "x-access-token": "<api-token>" },});
const data = await response.json();console.log(data);import requests
response = requests.request( "GET", "https://public-api.sessionboard.com/v1/organization/{orgId}/marketing/goals/turnout", headers={ "x-access-token": "<api-token>" },)
print(response.json())<?php
$curl = curl_init();
curl_setopt_array($curl, [ CURLOPT_URL => "https://public-api.sessionboard.com/v1/organization/{orgId}/marketing/goals/turnout", CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPHEADER => [ "x-access-token: <api-token>", ],]);
$response = curl_exec($curl);curl_close($curl);
echo $response;package main
import ( "fmt" "io" "net/http")
func main() { req, _ := http.NewRequest("GET", "https://public-api.sessionboard.com/v1/organization/{orgId}/marketing/goals/turnout", nil) req.Header.Add("x-access-token", "<api-token>")
res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))}HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://public-api.sessionboard.com/v1/organization/{orgId}/marketing/goals/turnout")) .header("x-access-token", "<api-token>") .method("GET", HttpRequest.BodyPublishers.noBody()) .build();
HttpResponse<String> response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());Try it
Response headers
Authorizations
x-access-tokenstringheaderOrganization API token. Generate from Organization Settings → API Tokens.
AuthorizationBearer <token>headerorOAuth 2.1 access token. Obtained via the OAuth PKCE flow at
/oauth/token.
Send one of these. See Authentication.
Path parameters
orgIdstringpathrequiredYour organization ID. Any other organization returns
404.
Query parameters
eventIdintegerqueryThe event or webinar. Defaults to the next upcoming one, else the latest.
Responses
200application/json
OK
payloadEventTurnoutHow one event is doing. Every number under
predictionis an estimate.Show child attributes
eventobject | nullShow child attributes
idintegernamestringkindstringwebinar,gathering(in-person),liteorstandard.datestring<date> | nulltime_zonestring
show_cardbooleanTrue once the event has a registration.
goalobjectShow child attributes
registrationsinteger | nullattendanceinteger | nullsourcestring | nullturnoutset with this API;goala Goals registration goal on the event;last_editionthe default.- Allowed values
"turnout", "goal", "last_edition"
defaultbooleanTrue when nobody set a goal and it is the last edition's numbers.
predictionobjectShow child attributes
labelstring- Allowed values
"Estimate"
statusstring- Allowed values
"estimated", "insufficient_history", "too_early", "final", "no_date"
current_registrationsintegercurrent_attendedintegerdays_leftinteger | nullexpected_registrationsinteger | nullEstimate at the event date.
nullunlessstatusisestimatedorfinal.expected_turnoutinteger | nullrangeobject | nullShow child attributes
lowintegerhighinteger
confidencestring | null- Allowed values
"low", "medium", "high"
howstringHow the estimate was made, in a plain sentence.
sourcestring | nullbenchmarkmeans aggregate statistics across organizations (never one organization's numbers).- Allowed values
"org_history", "benchmark"
paceobjectShow child attributes
registrationsobject | nullShow child attributes
goalintegercurrentintegerstatusstring- Allowed values
"ahead", "on_track", "behind", "reached", "missed", "unknown"
expected_by_todayinteger | nullprojectedinteger | nullgap_at_eventinteger | nulllinestring
attendanceobject | null
last_editionobject | nullShow child attributes
idintegernamestringdatestring<date> | nullregistrationsintegerattendedinteger
seriesobject[]Registrations by day before the event, from the furthest day with data (at most 120) to the event day.
Show child attributes
days_beforeintegerdatestring<date> | nullthis_eventinteger | nulllast_editioninteger | nullgoal_pathinteger | nullprojectedinteger | null
send_timeobject | nullShow child attributes
statusstring- Allowed values
"suggested", "no_history"
labelstring- Example
"Tuesday 10am"
next_atstring<date-time> | nulllinestring
suggestionsobject[]Show child attributes
keystringtextstringaskstringA request an assistant can act on.
summarystringOne plain paragraph to lead with.
403
SCOPE_REQUIRED— the token lacksread:marketing(reads) orwrite:marketing(writes).ORG_WIDE_TOKEN_REQUIRED— the token is restricted to particular events; this operation reads the whole organization.FORBIDDEN— the organization's plan does not include Marketing, or the token's user cannot change goals (writes need an organization admin or the organization settings permission).
404
The event is not in your organization.
Response examples
{ "payload": { "event": { "id": 123, "name": "<string>", "kind": "<string>", "date": "2026-01-15", "time_zone": "<string>" }, "show_card": true, "goal": { "registrations": 123, "attendance": 123, "source": "turnout", "default": true }, "prediction": { "label": "Estimate", "status": "estimated", "current_registrations": 123, "current_attended": 123, "days_left": 123, "expected_registrations": 123, "expected_turnout": 123, "range": { "low": 123, "high": 123 }, "confidence": "low", "how": "<string>", "source": "org_history" }, "pace": { "registrations": { "goal": 123, "current": 123, "status": "ahead", "expected_by_today": 123, "projected": 123, "gap_at_event": 123, "line": "<string>" }, "attendance": {} }, "last_edition": { "id": 123, "name": "<string>", "date": "2026-01-15", "registrations": 123, "attended": 123 }, "series": [ { "days_before": 123, "date": "2026-01-15", "this_event": 123, "last_edition": 123, "goal_path": 123, "projected": 123 } ], "send_time": { "status": "suggested", "label": "Tuesday 10am", "next_at": "2026-01-15T09:30:00Z", "line": "<string>" }, "suggestions": [ { "key": "<string>", "text": "<string>", "ask": "<string>" } ], "summary": "<string>" }}