Read a forum topic

Embed
Preview of the card
<a href="https://forumulate.com/reference/forumulate-api-publicforumthread-topic"><img src="https://forumulate.com/reference/_api/public/orgs/046a9bc0-d530-43ae-9bae-af7945008cda/spaces/8042f004-e3d9-445f-b7a4-b6c1f86836e6/pages/d0a2409b-3f65-4c78-a6fe-de3cb47c5661/social-card.svg?v=3e7ae33eec8b" alt="Read a forum topic" width="600" height="315"></a>
GEThttps://forumulate.com/api/public/orgs/{orgId}/spaces/{spaceId}/forum/t/{slug}

One topic with its replies, by the slug in its public URL rather than an id — so a link a reader shares resolves without a lookup. Carries the reactions, the accepted answer and the reply tree. ?locale= serves the opening post’s published translation (replies stay as written), with locale (served) and locales (declared) for a switcher.

Parameters
orgIdstringpathrequired
spaceIdstringpathrequired
slugstringpathrequired
sharestringquery
localestringquery
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/public/orgs/{orgId}/spaces/{spaceId}/forum/t/{slug}?share=&locale=" \
  -H "forumulate-version: <value>"
TypeScript
const res = await fetch('https://forumulate.com/api/public/orgs/{orgId}/spaces/{spaceId}/forum/t/{slug}?share=&locale=', {
  method: 'GET',
  headers: {
    'forumulate-version': '<value>',
  },
});
const data = await res.json();
Python
import requests

res = requests.request(
    "GET",
    "https://forumulate.com/api/public/orgs/{orgId}/spaces/{spaceId}/forum/t/{slug}?share=&locale=",
    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/public/orgs/{orgId}/spaces/{spaceId}/forum/t/{slug}?share=&locale=", 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/public/orgs/{orgId}/spaces/{spaceId}/forum/t/{slug}?share=&locale=');
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/public/orgs/{orgId}/spaces/{spaceId}/forum/t/{slug}?share=&locale=')
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/public/orgs/{orgId}/spaces/{spaceId}/forum/t/{slug}?share=&locale="))
    .header("forumulate-version", "<value>")
    .GET()
    .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
Responses
200 Success.
Example
{
  "aiSummaryAvailable": true,
  "bookmarkAutoDelete": true,
  "bookmarked": true,
  "bookmarkedPostIds": [
    "string"
  ],
  "bookmarkName": "string",
  "bookmarkNote": "string",
  "bookmarkRemindAt": "string",
  "bookmarkReminderPreset": "string",
  "bounty": {
    "amount": 0,
    "awardedPostId": "string",
    "awardedTo": "string",
    "expiresAt": "string",
    "id": "string",
    "offeredBy": "string",
    "offeredByName": "string",
    "state": "string"
  },
  "canAccept": true,
  "canFlag": true,
  "canModerate": true,
  "canOfferBounty": true,
  "locale": "string",
  "locales": [
    {
      "available": true,
      "code": "string",
      "isDefault": true,
      "label": "string"
    }
  ],
  "myReactions": {},
  "notifyLevel": "string",
  "poll": {
    "allowedGroupId": "string",
    "allowMultiple": true,
    "average": 0,
    "chartType": "bar",
    "closed": true,
    "closedAt": "2024-01-01T00:00:00Z",
    "closesAt": "2024-01-01T00:00:00Z",
    "id": "string",
    "maxChoices": 0,
    "maxValue": 0,
    "minChoices": 0,
    "minValue": 0,
    "myVotes": [
      "string"
    ],
    "options": [
      {
        "id": null,
        "text": null,
        "votes": null
      }
    ],
    "pollType": "multiple",
    "public": true,
    "question": "string",
    "rankedResult": {
      "rounds": null,
      "totalBallots": null,
      "winnerId": null
    },
    "resultsHidden": true,
    "resultsVisibility": "always",
    "step": 0,
    "totalVotes": 0,
    "type": "number",
    "voterCount": 0
  },
  "polls": [
    {
      "allowedGroupId": "string",
      "allowMultiple": true,
      "average": 0,
      "chartType": "bar",
      "closed": true,
      "closedAt": "2024-01-01T00:00:00Z",
      "closesAt": "2024-01-01T00:00:00Z",
      "id": "string",
      "maxChoices": 0,
      "maxValue": 0,
      "minChoices": 0,
      "minValue": 0,
      "myVotes": [
        "string"
      ],
      "options": [
        {
          "id": null,
          "text": null,
          "votes": null
        }
      ],
      "pollType": "multiple",
      "public": true,
      "question": "string",
      "rankedResult": {
        "rounds": null,
        "totalBallots": null,
        "winnerId": null
      },
      "resultsHidden": true,
      "resultsVisibility": "always",
      "step": 0,
      "totalVotes": 0,
      "type": "number",
      "voterCount": 0
    }
  ],
  "postVotes": "off",
  "reactionEmojis": [
    "string"
  ],
  "readerSettings": {
    "contentLocalization": {
      "defaultLocale": "string",
      "enabled": true
    },
    "inlineOnebox": true,
    "threadedReplies": true
  },
  "readState": {
    "lastReadPostNumber": 0,
    "unreadCount": 0
  },
  "suggested": [
    {
      "id": "string",
      "replyCount": 0,
      "slug": "string",
      "title": "string"
    }
  ],
  "topic": {
    "answerCount": 0,
    "answerPostId": "string",
    "assignedGroupId": "string",
    "assigneeId": "string",
    "authorAvatarSeed": "string",
    "authorAvatarUrl": "string",
    "authorId": "string",
    "authorKind": "anonymous",
    "authorName": "string",
    "authorPoints": 0,
    "authors": [
      {
        "name": "string",
        "userId": "string"
      }
    ],
    "authorTitle": "string",
    "authorUsername": "string",
    "bookmarked": true,
    "byline": {
      "avatarUrl": "string",
      "name": "string",
      "url": "string"
    },
    "bylines": [
      {
        "author": null,
        "avatarUrl": null,
        "bio": null,
        "handle": "string",
        "name": "string",
        "role": null,
        "url": null,
        "userId": null
      }
    ],
    "categoryId": "string",
    "commentsEnabled": true,
    "contentChangedAt": "2024-01-01T00:00:00Z",
    "coverUrl": "string",
    "customization": {
      "customCss": "string",
      "jsonLd": "string",
      "ogDescription": "string",
      "ogTitle": "string",
      "shareImageUrl": "string",
      "theme": {
        "accentColor": null,
        "bodyFontFamily": null,
        "changelog": null,
        "colorScheme": null,
        "components": null,
        "contentWidth": null,
        "customFontFamily": null,
        "font": null,
        "headingFontFamily": null,
        "layout": null,
        "monoFontFamily": null,
        "motion": null,
        "palette": null,
        "paletteDark": null,
        "post": null,
        "primaryColor": null,
        "typography": null
      },
      "twitterCard": "summary"
    },
    "deletedAt": "2024-01-01T00:00:00Z",
    "excerpt": "string",
    "expiresAt": "2024-01-01T00:00:00Z",
    "featured": true,
    "featuredLink": "string",
    "fields": {},
    "firstImageUrl": "string",
    "furtherReading": [
      {
        "href": "string",
        "label": "string"
      }
    ],
    "id": "string",
    "isNew": true,
    "kind": "ARTICLE",
    "lastActivityAt": "2024-01-01T00:00:00Z",
    "lastPostedAt": "string",
    "lastPosterName": "string",
    "likeCount": 0,
    "linkedTopics": [
      {
        "createdAt": "2024-01-01T00:00:00Z",
        "fromPostNumber": 0,
        "id": "string",
        "slug": "string",
        "title": "string"
      }
    ],
    "listed": true,
    "mergedIntoId": "string",
    "number": 0,
    "onThisPage": "always",
    "op": {
      "actionCode": "string",
      "actionData": {},
      "authorAvatarSeed": "string",
      "authorAvatarUrl": "string",
      "authorBadges": [
        {
          "icon": null,
          "name": null,
          "slug": null
        }
      ],
      "authorBadgeTiers": {
        "bronze": 0,
        "gold": 0,
        "silver": 0
      },
      "authorFlair": {
        "bgColor": null,
        "color": null,
        "icon": null,
        "label": "string"
      },
      "authorId": "string",
      "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": "2024-01-01T00:00:00Z",
      "flagCount": 0,
      "id": "string",
      "isOp": true,
      "likeCount": 0,
      "parentAuthorName": "string",
      "parentPostId": "string",
      "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": "string",
        "avatarUrl": null,
        "kind": "anonymous",
        "name": "string",
        "role": "frequent",
        "username": null
      }
    ],
    "promotedPage": {
      "id": "string",
      "spaceId": "string",
      "title": "string"
    },
    "promotedPageId": "string",
    "publishedAt": "2024-01-01T00:00:00Z",
    "readingMinutes": 0,
    "releaseVersion": "string",
    "replies": [
      {
        "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
      }
    ],
    "replyCount": 0,
    "replyPreviews": [
      {
        "author": "string",
        "authorAvatar": null,
        "authorSeed": "string",
        "text": "string"
      }
    ],
    "review": {
      "note": "string",
      "requestedAt": "2024-01-01T00:00:00Z",
      "requestedBy": "string",
      "reviewedAt": "2024-01-01T00:00:00Z",
      "reviewedBy": "string",
      "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": "string",
        "label": "string",
        "pagePalette": null,
        "pageScheme": "dark",
        "slug": "string",
        "textColor": null,
        "textColorDark": null
      }
    ],
    "tags": [
      "string"
    ],
    "title": "string",
    "unread": 0,
    "updatedAt": "2024-01-01T00:00:00Z",
    "viewCount": 0,
    "voteCount": 0
  },
  "translationAvailable": true,
  "viewerId": "string",
  "viewerLevel": 0
}
Schema
aiSummaryAvailablebooleanrequired
bookmarkAutoDeletebooleanrequired
bookmarkedbooleanrequired
bookmarkedPostIdsstring[]required
bookmarkNamestringrequired
bookmarkNotestringrequired
bookmarkRemindAtstringrequired
bookmarkReminderPresetstringrequired
bountyBountyViewrequired
Show child parameters
amountnumberrequired
awardedPostIdstringrequired
awardedTostringrequired
expiresAtstringrequired
idstringrequired
offeredBystringrequired
offeredByNamestringrequired
statestringrequired
canAcceptbooleanrequired
canFlagbooleanrequired
canModeratebooleanrequired
canOfferBountybooleanrequired
localestring
localesReleaseLocaleLink[]
Show child parameters
availablebooleanrequired
codestringrequired
isDefaultbooleanrequired
labelstringrequired
myReactionsobjectrequired
notifyLevelstringrequired
pollPollSummaryrequired
Show child parameters
allowedGroupIdstringrequired
allowMultiplebooleanrequired
averagenumberrequired
chartTypestringrequired
bar | pie
closedbooleanrequired
closedAtstringrequired
closesAtstringrequired
idstringrequired
maxChoicesnumberrequired
maxValuenumberrequired
minChoicesnumberrequired
minValuenumberrequired
myVotesstring[]required
optionsPollOptionResult[]required
Show child parameters
idstringrequired
textstringrequired
votesnumberrequired
pollTypestringrequired
multiple | number | ranked | single
publicbooleanrequired
questionstringrequired
rankedResultRankedResultrequired
Show child parameters
roundsRankedRound[]required
totalBallotsnumberrequired
winnerIdstringrequired
resultsHiddenbooleanrequired
resultsVisibilitystringrequired
always | on_close | on_vote | staff
stepnumberrequired
totalVotesnumberrequired
typestringrequired
number | regular
voterCountnumberrequired
pollsPollSummary[]required
Show child parameters
allowedGroupIdstringrequired
allowMultiplebooleanrequired
averagenumberrequired
chartTypestringrequired
bar | pie
closedbooleanrequired
closedAtstringrequired
closesAtstringrequired
idstringrequired
maxChoicesnumberrequired
maxValuenumberrequired
minChoicesnumberrequired
minValuenumberrequired
myVotesstring[]required
optionsPollOptionResult[]required
Show child parameters
idstringrequired
textstringrequired
votesnumberrequired
pollTypestringrequired
multiple | number | ranked | single
publicbooleanrequired
questionstringrequired
rankedResultRankedResultrequired
Show child parameters
roundsRankedRound[]required
totalBallotsnumberrequired
winnerIdstringrequired
resultsHiddenbooleanrequired
resultsVisibilitystringrequired
always | on_close | on_vote | staff
stepnumberrequired
totalVotesnumberrequired
typestringrequired
number | regular
voterCountnumberrequired
postVotesstringrequired
off | up | updown
reactionEmojisstring[]required
readerSettingsobjectrequired
Show child parameters
contentLocalizationobjectrequired
Show child parameters
defaultLocalestringrequired
enabledbooleanrequired
inlineOneboxbooleanrequired
threadedRepliesbooleanrequired
readStateobjectrequired
Show child parameters
lastReadPostNumbernumberrequired
unreadCountnumberrequired
suggestedobject[]required
Show child parameters
idstringrequired
replyCountnumberrequired
slugstringrequired
titlestringrequired
topicobjectrequired
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
flagCountnumber
idstringrequired
isOpbooleanrequired
likeCountnumber
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"
}
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