Get the changelog in a space

Embed
Preview of the card
<a href="https://forumulate.com/reference/forumulate-api-changelog-list"><img src="https://forumulate.com/reference/_api/public/orgs/046a9bc0-d530-43ae-9bae-af7945008cda/spaces/8042f004-e3d9-445f-b7a4-b6c1f86836e6/pages/99a21f58-b577-47b2-9a27-d16b97461d15/social-card.svg?v=3e7ae33eec8b" alt="Get the changelog in a space" width="600" height="315"></a>
GEThttps://forumulate.com/api/orgs/{orgId}/spaces/{spaceId}/changelog

Requires token scope: read (the coarse method gate) for Atlas key (ak_), Personal Access Token (cft_) or OAuth (cfo_) auth — in addition to any catalog scope (GET /pats/scopes) the route’s capability needs. Session/cookie auth is governed by RBAC capabilities instead.

Parameters
orgIdstringpathrequired
spaceIdstringpathrequired
limitintegerquery
Releases per page, newest first. Defaults to 50. 100 is the most this endpoint serves — a larger value is capped, not refused. A value that is not a whole number of 1 or more is a 422, never a silent default.
= 50
offsetintegerquery
Where in the archive to start. cursor from page is the same walk, opaque. Defaults to 0. 100000 is the most this endpoint serves — a larger value is capped, not refused. A value that is not a whole number of 0 or more is a 422, never a silent default.
= 0
cursorstringquery
reviewstringquery
in_review | changes_requested | approved
forumulate-versionstringheader
API version negotiation. Send forumulate-version: 2026-12-01 on every request from a new integration; it is optional only so that integrations written before versioning keep working. Each version includes everything before it:
Code samples
cURL
curl -X GET "https://forumulate.com/api/orgs/{orgId}/spaces/{spaceId}/changelog?limit=&offset=&cursor=&review=" \
  -H "forumulate-version: <value>"
TypeScript
const res = await fetch('https://forumulate.com/api/orgs/{orgId}/spaces/{spaceId}/changelog?limit=&offset=&cursor=&review=', {
  method: 'GET',
  headers: {
    'forumulate-version': '<value>',
  },
});
const data = await res.json();
Python
import requests

res = requests.request(
    "GET",
    "https://forumulate.com/api/orgs/{orgId}/spaces/{spaceId}/changelog?limit=&offset=&cursor=&review=",
    headers={
    "forumulate-version": "<value>",
    },
)
data = res.json()
Go
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://forumulate.com/api/orgs/{orgId}/spaces/{spaceId}/changelog?limit=&offset=&cursor=&review=", nil)
	req.Header.Set("forumulate-version", "<value>")
	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
PHP
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://forumulate.com/api/orgs/{orgId}/spaces/{spaceId}/changelog?limit=&offset=&cursor=&review=');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['forumulate-version: <value>']);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
Ruby
require 'net/http'
require 'uri'

uri = URI('https://forumulate.com/api/orgs/{orgId}/spaces/{spaceId}/changelog?limit=&offset=&cursor=&review=')
req = Net::HTTP::Get.new(uri)
req['forumulate-version'] = '<value>'
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
  http.request(req)
end
puts res.body
Java
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://forumulate.com/api/orgs/{orgId}/spaces/{spaceId}/changelog?limit=&offset=&cursor=&review="))
    .header("forumulate-version", "<value>")
    .GET()
    .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
Responses
200 Success.
Example
{
  "releases": [
    {
      "answerCount": 0,
      "answerPostId": null,
      "assignedGroupId": null,
      "assigneeId": null,
      "authorAvatarSeed": "string",
      "authorAvatarUrl": "string",
      "authorId": null,
      "authorKind": "anonymous",
      "authorName": null,
      "authorPoints": 0,
      "authors": [
        null
      ],
      "authorTitle": "string",
      "authorUsername": "string",
      "bookmarked": true,
      "byline": null,
      "bylines": [
        null
      ],
      "categoryId": null,
      "commentsEnabled": true,
      "contentChangedAt": "2024-01-01T00:00:00Z",
      "coverUrl": null,
      "customization": null,
      "deletedAt": "2024-01-01T00:00:00Z",
      "excerpt": "string",
      "expiresAt": "2024-01-01T00:00:00Z",
      "featured": true,
      "featuredLink": null,
      "fields": {},
      "firstImageUrl": "string",
      "furtherReading": [
        null
      ],
      "id": "string",
      "isNew": true,
      "kind": "ARTICLE",
      "lastActivityAt": "2024-01-01T00:00:00Z",
      "lastPostedAt": "string",
      "lastPosterName": "string",
      "likeCount": 0,
      "linkedTopics": [
        null
      ],
      "listed": true,
      "mergedIntoId": null,
      "number": null,
      "onThisPage": "always",
      "op": {
        "actionCode": null,
        "actionData": null,
        "authorAvatarSeed": null,
        "authorAvatarUrl": null,
        "authorBadges": null,
        "authorBadgeTiers": null,
        "authorFlair": null,
        "authorId": null,
        "authorKind": null,
        "authorName": null,
        "authorPoints": null,
        "authorRole": null,
        "authorStatus": null,
        "authorTitle": null,
        "authorTrust": null,
        "authorUsername": null,
        "content": null,
        "createdAt": null,
        "editedAt": null,
        "flagCount": null,
        "id": null,
        "isOp": null,
        "likeCount": null,
        "parentAuthorName": null,
        "parentPostId": null,
        "parentPostNumber": null,
        "postNumber": null,
        "reactions": null,
        "status": null,
        "voteCount": null,
        "whisper": null,
        "wiki": null
      },
      "pinned": true,
      "pinnedGlobally": true,
      "pinnedUntil": null,
      "posters": [
        null
      ],
      "promotedPage": null,
      "promotedPageId": null,
      "publishedAt": null,
      "readingMinutes": 0,
      "releaseVersion": null,
      "replies": [
        null
      ],
      "replyCount": 0,
      "replyPreviews": [
        null
      ],
      "review": {
        "note": null,
        "requestedAt": null,
        "requestedBy": null,
        "reviewedAt": null,
        "reviewedBy": null,
        "state": null
      },
      "roadmapStatus": null,
      "scheduledFor": null,
      "seo": {
        "noindex": null,
        "seoDescription": null,
        "seoTitle": null
      },
      "series": null,
      "shippedTopicIds": [
        null
      ],
      "slowModeSeconds": 0,
      "slug": "string",
      "state": "ARCHIVED",
      "status": "archived",
      "subtitle": "string",
      "tagInfo": [
        null
      ],
      "tags": [
        null
      ],
      "title": "string",
      "unread": 0,
      "updatedAt": "2024-01-01T00:00:00Z",
      "viewCount": 0,
      "voteCount": 0
    }
  ]
}
Option 1
releasesArticleDetail[]required
Show child parameters
answerCountnumber
answerPostIdstringrequired
assignedGroupIdstringrequired
assigneeIdstringrequired
authorAvatarSeedstring
authorAvatarUrlstring
authorIdstringrequired
authorKindstring
anonymous | guest | member | persona | service | staged
authorNamestringrequired
authorPointsnumber
authorsobject[]required
Show child parameters
namestringrequired
userIdstringrequired
authorTitlestring
authorUsernamestring
bookmarkedboolean
bylineBylinerequired
Show child parameters
avatarUrlstring
namestring
urlstring
bylinesBylineView[]
Show child parameters
authorstringrequired
avatarUrlstringrequired
biostringrequired
handlestring
namestringrequired
rolestringrequired
urlstringrequired
userIdstringrequired
categoryIdstringrequired
commentsEnabledbooleanrequired
contentChangedAtstring
coverUrlstringrequired
customizationPieceCustomizationrequired
Show child parameters
customCssstring
jsonLdstring
ogDescriptionstring
ogTitlestring
shareImageUrlstring
themeobject
twitterCardstring
summary | summary_large_image
deletedAtstring
excerptstringrequired
expiresAtstring
featuredbooleanrequired
featuredLinkstringrequired
fieldsobjectrequired
firstImageUrlstring
furtherReadingobject[]required
Show child parameters
hrefstringrequired
labelstringrequired
idstringrequired
isNewboolean
kindstringrequired
ARTICLE | DISCUSSION | FEATURE | QUESTION | RELEASE
lastActivityAtstringrequired
lastPostedAtstring
lastPosterNamestring
likeCountnumber
linkedTopicsLinkedTopic[]required
Show child parameters
createdAtstringrequired
fromPostNumbernumberrequired
idstringrequired
slugstringrequired
titlestringrequired
listedbooleanrequired
mergedIntoIdstringrequired
numbernumberrequired
onThisPagestringrequired
always | auto | never
opobjectrequired
Show child parameters
actionCodestringrequired
actionDataobjectrequired
authorAvatarSeedstring
authorAvatarUrlstring
authorBadgesobject[]
authorBadgeTiersobject
authorFlairobject
authorIdstringrequired
authorKindstring
anonymous | guest | member | persona | service | staged
authorNamestringrequired
authorPointsnumber
authorRolestring
moderator | staff
authorStatusobject
authorTitlestring
authorTrustnumberrequired
authorUsernamestring
contentobjectrequired
A page as a block document: TipTap/ProseMirror JSON, the canonical content model shared by the editor, the reader and the Markdown converters. Send this as content when creating a page or on PUT /pages/{pageId}/content. It is the shape GET /pages/{pageId}/markdown round-trips from. Author in Markdown instead by sending body (whole page) or sections (Markdown per named slot) — use exactly ONE of the three. Every block has a Markdown spelling: :::name{attrs} directives for callouts, tabs, cards, steppers, columns and buttons, listed at GET /docs/markdown-dialect.
createdAtstringrequired
editedAtstringrequired
flagCountnumberrequired
idstringrequired
isOpbooleanrequired
likeCountnumber
parentAuthorNamestring
parentPostIdstringrequired
parentPostNumbernumber
postNumbernumberrequired
reactionsobjectrequired
statusstringrequired
hidden | pending | visible
voteCountnumberrequired
whisperbooleanrequired
wikibooleanrequired
pinnedbooleanrequired
pinnedGloballybooleanrequired
pinnedUntilstringrequired
postersForumPoster[]
Show child parameters
avatarSeedstringrequired
avatarUrlstringrequired
kindstringrequired
anonymous | guest | member | persona | service | staged
namestringrequired
rolestringrequired
frequent | latest | op
usernamestringrequired
promotedPageobjectrequired
Show child parameters
idstringrequired
spaceIdstringrequired
titlestringrequired
promotedPageIdstringrequired
publishedAtstringrequired
readingMinutesnumberrequired
releaseVersionstringrequired
repliesPostSummary[]required
Show child parameters
actionCodestringrequired
actionDataobjectrequired
authorAvatarSeedstring
authorAvatarUrlstring
authorBadgesobject[]
authorBadgeTiersobject
authorFlairobject
authorIdstringrequired
authorKindstring
anonymous | guest | member | persona | service | staged
authorNamestringrequired
authorPointsnumber
authorRolestring
moderator | staff
authorStatusobject
authorTitlestring
authorTrustnumberrequired
authorUsernamestring
contentobjectrequired
A page as a block document: TipTap/ProseMirror JSON, the canonical content model shared by the editor, the reader and the Markdown converters. Send this as content when creating a page or on PUT /pages/{pageId}/content. It is the shape GET /pages/{pageId}/markdown round-trips from. Author in Markdown instead by sending body (whole page) or sections (Markdown per named slot) — use exactly ONE of the three. Every block has a Markdown spelling: :::name{attrs} directives for callouts, tabs, cards, steppers, columns and buttons, listed at GET /docs/markdown-dialect.
createdAtstringrequired
editedAtstringrequired
flagCountnumberrequired
idstringrequired
isOpbooleanrequired
likeCountnumber
parentAuthorNamestring
parentPostIdstringrequired
parentPostNumbernumber
postNumbernumberrequired
reactionsobjectrequired
statusstringrequired
hidden | pending | visible
voteCountnumberrequired
whisperbooleanrequired
wikibooleanrequired
replyCountnumberrequired
replyPreviewsReplyPreview[]
Show child parameters
authorstringrequired
authorAvatarstringrequired
authorSeedstringrequired
textstringrequired
reviewobject
Show child parameters
notestringrequired
requestedAtstringrequired
requestedBystringrequired
reviewedAtstringrequired
reviewedBystringrequired
statestringrequired
approved | changes_requested | in_review
roadmapStatusstringrequired
scheduledForstringrequired
seoobjectrequired
Show child parameters
noindexboolean
seoDescriptionstring
seoTitlestring
seriesstringrequired
shippedTopicIdsstring[]required
slowModeSecondsnumber
slugstringrequired
statestringrequired
ARCHIVED | CLOSED | DRAFT | PUBLISHED
statusstringrequired
archived | closed | draft | published
subtitlestring
tagInfoTagDisplay[]
Show child parameters
colorstringrequired
colorDarkstringrequired
coverUrlstringrequired
descriptionstringrequired
gradientarrayrequired
iconstring
labelstringrequired
pagePaletteobjectrequired
pageSchemestringrequired
dark | light
slugstringrequired
textColorstringrequired
textColorDarkstringrequired
tagsstring[]required
titlestringrequired
unreadnumber
updatedAtstringrequired
viewCountnumberrequired
voteCountnumberrequired
{
  "releases": [
    {
      "answerCount": 0,
      "answerPostId": "string",
      "assignedGroupId": "string",
      "assigneeId": "string",
      "authorAvatarSeed": "string",
      "authorAvatarUrl": "string",
      "authorId": "string",
      "authorKind": "anonymous",
      "authorName": "string",
      "authorPoints": 0,
      "authors": [
        {
          "name": null,
          "userId": null
        }
      ],
      "authorTitle": "string",
      "authorUsername": "string",
      "bookmarked": true,
      "byline": {
        "avatarUrl": null,
        "name": null,
        "url": null
      },
      "bylines": [
        {
          "author": null,
          "avatarUrl": null,
          "bio": null,
          "handle": null,
          "name": null,
          "role": null,
          "url": null,
          "userId": null
        }
      ],
      "categoryId": "string",
      "commentsEnabled": true,
      "contentChangedAt": "2024-01-01T00:00:00Z",
      "coverUrl": "string",
      "customization": {
        "customCss": null,
        "jsonLd": null,
        "ogDescription": null,
        "ogTitle": null,
        "shareImageUrl": null,
        "theme": null,
        "twitterCard": null
      },
      "deletedAt": "2024-01-01T00:00:00Z",
      "excerpt": "string",
      "expiresAt": "2024-01-01T00:00:00Z",
      "featured": true,
      "featuredLink": "string",
      "fields": {},
      "firstImageUrl": "string",
      "furtherReading": [
        {
          "href": null,
          "label": null
        }
      ],
      "id": "string",
      "isNew": true,
      "kind": "ARTICLE",
      "lastActivityAt": "2024-01-01T00:00:00Z",
      "lastPostedAt": "string",
      "lastPosterName": "string",
      "likeCount": 0,
      "linkedTopics": [
        {
          "createdAt": null,
          "fromPostNumber": null,
          "id": null,
          "slug": null,
          "title": null
        }
      ],
      "listed": true,
      "mergedIntoId": "string",
      "number": 0,
      "onThisPage": "always",
      "op": {
        "actionCode": null,
        "actionData": null,
        "authorAvatarSeed": "string",
        "authorAvatarUrl": "string",
        "authorBadges": [
          null
        ],
        "authorBadgeTiers": {
          "bronze": null,
          "gold": null,
          "silver": null
        },
        "authorFlair": {
          "bgColor": null,
          "color": null,
          "icon": null,
          "label": null
        },
        "authorId": null,
        "authorKind": "anonymous",
        "authorName": "string",
        "authorPoints": 0,
        "authorRole": "moderator",
        "authorStatus": {
          "emoji": null,
          "message": null
        },
        "authorTitle": "string",
        "authorTrust": 0,
        "authorUsername": "string",
        "content": {
          "type": "doc",
          "content": [
            {
              "type": "heading",
              "attrs": {
                "level": 1
              },
              "content": [
                {
                  "type": "text",
                  "text": "Getting started"
                }
              ]
            },
            {
              "type": "paragraph",
              "content": [
                {
                  "type": "text",
                  "text": "Install the SDK, then create your first page."
                }
              ]
            },
            {
              "type": "codeBlock",
              "attrs": {
                "language": "bash"
              },
              "content": [
                {
                  "type": "text",
                  "text": "npm i @forumulate/sdk"
                }
              ]
            }
          ]
        },
        "createdAt": "2024-01-01T00:00:00Z",
        "editedAt": null,
        "flagCount": 0,
        "id": "string",
        "isOp": true,
        "likeCount": 0,
        "parentAuthorName": "string",
        "parentPostId": null,
        "parentPostNumber": 0,
        "postNumber": 0,
        "reactions": {},
        "status": "hidden",
        "voteCount": 0,
        "whisper": true,
        "wiki": true
      },
      "pinned": true,
      "pinnedGlobally": true,
      "pinnedUntil": "2024-01-01T00:00:00Z",
      "posters": [
        {
          "avatarSeed": null,
          "avatarUrl": null,
          "kind": null,
          "name": null,
          "role": null,
          "username": null
        }
      ],
      "promotedPage": {
        "id": null,
        "spaceId": null,
        "title": null
      },
      "promotedPageId": "string",
      "publishedAt": "2024-01-01T00:00:00Z",
      "readingMinutes": 0,
      "releaseVersion": "string",
      "replies": [
        {
          "actionCode": null,
          "actionData": null,
          "authorAvatarSeed": null,
          "authorAvatarUrl": null,
          "authorBadges": null,
          "authorBadgeTiers": null,
          "authorFlair": null,
          "authorId": null,
          "authorKind": null,
          "authorName": null,
          "authorPoints": null,
          "authorRole": null,
          "authorStatus": null,
          "authorTitle": null,
          "authorTrust": null,
          "authorUsername": null,
          "content": null,
          "createdAt": null,
          "editedAt": null,
          "flagCount": null,
          "id": null,
          "isOp": null,
          "likeCount": null,
          "parentAuthorName": null,
          "parentPostId": null,
          "parentPostNumber": null,
          "postNumber": null,
          "reactions": null,
          "status": null,
          "voteCount": null,
          "whisper": null,
          "wiki": null
        }
      ],
      "replyCount": 0,
      "replyPreviews": [
        {
          "author": null,
          "authorAvatar": null,
          "authorSeed": null,
          "text": null
        }
      ],
      "review": {
        "note": null,
        "requestedAt": null,
        "requestedBy": null,
        "reviewedAt": null,
        "reviewedBy": null,
        "state": "approved"
      },
      "roadmapStatus": "string",
      "scheduledFor": "2024-01-01T00:00:00Z",
      "seo": {
        "noindex": true,
        "seoDescription": "string",
        "seoTitle": "string"
      },
      "series": "string",
      "shippedTopicIds": [
        "string"
      ],
      "slowModeSeconds": 0,
      "slug": "string",
      "state": "ARCHIVED",
      "status": "archived",
      "subtitle": "string",
      "tagInfo": [
        {
          "color": null,
          "colorDark": null,
          "coverUrl": null,
          "description": null,
          "gradient": null,
          "icon": null,
          "label": null,
          "pagePalette": null,
          "pageScheme": null,
          "slug": null,
          "textColor": null,
          "textColorDark": null
        }
      ],
      "tags": [
        "string"
      ],
      "title": "string",
      "unread": 0,
      "updatedAt": "2024-01-01T00:00:00Z",
      "viewCount": 0,
      "voteCount": 0
    }
  ]
}
Option 2
pageobjectrequired
The paging envelope a collection carries when the caller states Forumulate-Version. Each operation’s own response schema says whether it has one: a collection either carries page, or answers both this and its pre-envelope shape and picks by the header. No listing pages with keys of its own any more — the allowlists in openapi-collection-shape.test.ts are empty, which is what stops a new one from appearing. Read hasMore and nextCursor: the snake_case pair beside them is deprecated and is not sent to a caller who states 2026-11-01 or later.
Show child parameters
limitintegerrequired
The limit this page was built with — what was asked for, capped. NOT the number of rows returned: a final page under the limit is normal, and hasMore is the only thing that says whether to keep walking.
400 The request could not be understood — a malformed header, path or query value (request.malformed). A value that was understood but is not acceptable is a 422 validation.failed.
{
  "error": {
    "code": "string",
    "message": "string",
    "details": {},
    "docs": "string",
    "reason": "string",
    "slugs": [
      "string"
    ],
    "conflict": {
      "etag": "string",
      "ops": [
        null
      ]
    }
  },
  "requestId": "string"
}
401 No credential, or one that is expired or revoked (auth.required). Send a Bearer token or the session cookie.
{
  "error": {
    "code": "string",
    "message": "string",
    "details": {},
    "docs": "string",
    "reason": "string",
    "slugs": [
      "string"
    ],
    "conflict": {
      "etag": "string",
      "ops": [
        null
      ]
    }
  },
  "requestId": "string"
}
403 Authenticated, and not allowed — always rbac.forbidden, whether what is missing is the capability, the token scope, or a resource the token is pinned away from. The message names the capability and, for a scope refusal, the scopes that would grant it. A refusal because of the PLAN is a 402 with quota.exceeded, not this.
{
  "error": {
    "code": "string",
    "message": "string",
    "details": {},
    "docs": "string",
    "reason": "string",
    "slugs": [
      "string"
    ],
    "conflict": {
      "etag": "string",
      "ops": [
        null
      ]
    }
  },
  "requestId": "string"
}
404 No such thing — one of the ids in the path does not resolve, or resolves to something this caller may not see (*.not_found).
{
  "error": {
    "code": "string",
    "message": "string",
    "details": {},
    "docs": "string",
    "reason": "string",
    "slugs": [
      "string"
    ],
    "conflict": {
      "etag": "string",
      "ops": [
        null
      ]
    }
  },
  "requestId": "string"
}
429 Rate limited — see the RateLimit-* headers.
{
  "error": {
    "code": "string",
    "message": "string",
    "details": {},
    "docs": "string",
    "reason": "string",
    "slugs": [
      "string"
    ],
    "conflict": {
      "etag": "string",
      "ops": [
        null
      ]
    }
  },
  "requestId": "string"
}
default Error — the stable { error: { code, message } } envelope.
{
  "error": {
    "code": "string",
    "message": "string",
    "details": {},
    "docs": "string",
    "reason": "string",
    "slugs": [
      "string"
    ],
    "conflict": {
      "etag": "string",
      "ops": [
        null
      ]
    }
  },
  "requestId": "string"
}
The Forumulate teamUpdated