What is waiting for your OK
US Region: https://public-api.sessionboard.com · EU Region: https://public-api-eu.sessionboard.com
Every request an AI assistant made that reaches people and is waiting for a person in Sessionboard: sending invitations or emails, launching a campaign, publishing a page or library, approving ad spend, opening nominations, publishing an agenda. Covers Marketing, Learning, Awards and Sessions. Each request says what it is (title), the person's own words when the assistant passed them (asked), who asked (assistant, requested_by), when (created_at) and the Sessionboard page where a person approves or declines it (url). Newest first, 50 at most. Read-only: approving and declining happen only in Sessionboard, never through the API. Requires read:marketing and a key that is not restricted to particular events. Also at GET /v1/marketing/approvals.
Request example
curl --request GET \ --url 'https://public-api.sessionboard.com/v1/organization/{orgId}/marketing/approvals' \ --header 'x-access-token: <api-token>'const response = await fetch('https://public-api.sessionboard.com/v1/organization/{orgId}/marketing/approvals', { 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/approvals", 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/approvals", 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/approvals", 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/approvals")) .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
statusstringqueryDefault
pending.- Allowed values
"pending", "approved", "declined", "failed", "all"
productstringqueryOnly this product's requests. Default every product.
- Allowed values
"marketing", "learning", "awards", "sessions"
surfacestringqueryOnly requests from one area of a product (for example
campaigns).- Max length
32
idstring<uuid>queryOne request, whatever its status (the
approval_idan action answered with).
Responses
200application/json
OK
payloadobjectShow child attributes
approvalsAssistantApproval[]Show child attributes
idstring<uuid>statusstring- Allowed values
"pending", "approved", "declined", "failed"
productstring- Allowed values
"marketing", "learning", "awards", "sessions"
surfacestringThe area of the product, for example
campaigns,pages,field_events.actionstringWhat the assistant asked to do, for example
launch.titlestringThe request in a sentence.
askedstring | nullThe person's own words, when the assistant passed them.
assistantobjectShow child attributes
vendorstringFor example
claude,chatgpt,mcp.labelstringclientstring | nullviastring | null
requested_byobjectShow child attributes
user_idinteger | nullnamestring | null
event_idinteger | nulltargetobject | nullShow child attributes
typestringidstring
created_atstring<date-time>decided_byobject | nullShow child attributes
user_idinteger | nullnamestring | null
decided_atstring<date-time> | nullerrorstring | nullWhy an approved request could not run.
urlstringThe Sessionboard page where a person approves or declines it.
pendingintegerRequests waiting in total (for the
productasked for).notestring
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).
Response examples
{ "payload": { "approvals": [ { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "status": "pending", "product": "marketing", "surface": "<string>", "action": "<string>", "title": "<string>", "asked": "<string>", "assistant": { "vendor": "<string>", "label": "<string>", "client": "<string>", "via": "<string>" }, "requested_by": { "user_id": 123, "name": "<string>" }, "event_id": 123, "target": { "type": "<string>", "id": "<string>" }, "created_at": "2026-01-15T09:30:00Z", "decided_by": { "user_id": 123, "name": "<string>" }, "decided_at": "2026-01-15T09:30:00Z", "error": "<string>", "url": "<string>" } ], "pending": 123, "note": "<string>" }}