List an issue's kept versions
US Region: https://public-api.sessionboard.com · EU Region: https://public-api-eu.sessionboard.com
The issue as it was before each edit, newest first: version, summary (what the edit that replaced it changed, in plain words), replaced_by (who: a person or the assistant's name) and created_at. Requires read:marketing; refused for a key restricted to particular events. Also at GET /v1/marketing/newsletter/issues/{issueId}/versions.
Request example
curl --request GET \ --url 'https://public-api.sessionboard.com/v1/organization/{orgId}/marketing/newsletter/issues/{issueId}/versions' \ --header 'x-access-token: <api-token>'const response = await fetch('https://public-api.sessionboard.com/v1/organization/{orgId}/marketing/newsletter/issues/{issueId}/versions', { 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/newsletter/issues/{issueId}/versions", 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/newsletter/issues/{issueId}/versions", 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/newsletter/issues/{issueId}/versions", 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/newsletter/issues/{issueId}/versions")) .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.issueIdstringpathrequiredThe issue
Responses
200application/json
payload with issue_id and versions
payloadobjectShow child attributes
issue_idstringversionsDraftVersion[]Show child attributes
idstringversionintegersummarystring[]What the edit that replaced this version changed.
replaced_byobject | nullShow child attributes
labelstring | null- Example
"Claude"
vendorstring | nullatstring<date-time> | null
created_atstring<date-time>
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
Not found in your organization.
Response examples
{ "payload": { "issue_id": "<string>", "versions": [ { "id": "<string>", "version": 123, "summary": [ "<string>" ], "replaced_by": { "label": "Claude", "vendor": "<string>", "at": "2026-01-15T09:30:00Z" }, "created_at": "2026-01-15T09:30:00Z" } ] }}