Set an event's registration and attendance goal
US Region: https://public-api.sessionboard.com · EU Region: https://public-api-eu.sessionboard.com
Sets the event's registration goal, attendance goal, or both. null clears one; with no goal set, the last comparable edition's numbers are used. Answers with the same body as GET /v1/organization/{orgId}/marketing/goals/turnout, so pace against the new goal shows at once. An event has at most one open registration goal: when it has one (made on the Goals page or with plan_goal), registrationsGoal changes that goal's number and the answer's goal.source is goal; nothing new is created. Sends and spends nothing. Requires write:marketing. Also at POST /v1/marketing/goals/turnout/{eventId}/goal.
Request example
curl --request POST \ --url 'https://public-api.sessionboard.com/v1/organization/{orgId}/marketing/goals/turnout/{eventId}/goal' \ --header 'x-access-token: <api-token>' \ --header 'Content-Type: application/json' \ --data '{ "registrationsGoal": 1, "attendanceGoal": 1}'const response = await fetch('https://public-api.sessionboard.com/v1/organization/{orgId}/marketing/goals/turnout/{eventId}/goal', { method: 'POST', headers: { "x-access-token": "<api-token>", "Content-Type": "application/json" }, body: JSON.stringify({ "registrationsGoal": 1, "attendanceGoal": 1 }),});
const data = await response.json();console.log(data);import requests
response = requests.request( "POST", "https://public-api.sessionboard.com/v1/organization/{orgId}/marketing/goals/turnout/{eventId}/goal", headers={ "x-access-token": "<api-token>", "Content-Type": "application/json" }, json={ "registrationsGoal": 1, "attendanceGoal": 1 },)
print(response.json())<?php
$curl = curl_init();
curl_setopt_array($curl, [ CURLOPT_URL => "https://public-api.sessionboard.com/v1/organization/{orgId}/marketing/goals/turnout/{eventId}/goal", CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => '{ "registrationsGoal": 1, "attendanceGoal": 1}', CURLOPT_HTTPHEADER => [ "x-access-token: <api-token>", "Content-Type: application/json", ],]);
$response = curl_exec($curl);curl_close($curl);
echo $response;package main
import ( "fmt" "io" "net/http" "strings")
func main() { req, _ := http.NewRequest("POST", "https://public-api.sessionboard.com/v1/organization/{orgId}/marketing/goals/turnout/{eventId}/goal", strings.NewReader(`{ "registrationsGoal": 1, "attendanceGoal": 1}`)) req.Header.Add("x-access-token", "<api-token>") 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))}HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://public-api.sessionboard.com/v1/organization/{orgId}/marketing/goals/turnout/{eventId}/goal")) .header("x-access-token", "<api-token>") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"registrationsGoal\": 1,\n \"attendanceGoal\": 1\n}")) .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.eventIdintegerpathrequiredThe event or webinar.
Request body
At least one of the two. Each key is also accepted in snake_case (registrations_goal, attendance_goal).
registrationsGoalinteger | nullRegistrations wanted by the event date.
nullclears it.- Minimum
1- Maximum
10000000
attendanceGoalinteger | nullPeople wanted at the event.
nullclears it.- Minimum
1- Maximum
10000000
{ "registrationsGoal": 1, "attendanceGoal": 1}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.
400
Neither goal was given, or a goal is not a whole number from 1 to 10,000,000.
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>" }}