Create the forum in a space
https://forumulate.com/api /orgs/{orgId}/spaces/{spaceId}/forum Starts a topic as the caller — a member, or a persona service account posting with its own token. Owners and admins may backdate it with createdAt for a migration; anyone else sending it is refused rather than silently stamped now.
Requires token scope: write (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
orgIdstringpathrequiredspaceIdstringpathrequiredforumulate-versionstringheaderforumulate-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:Idempotency-Keystringheader409. The key is scoped to the method and path, so the same key on a different endpoint is a different request. Error responses of 5xx are never cached — those retries re-run. A key is bound to the BODY it was first used with: reusing it with a different body is a 409 idempotency.key_reused, not a replay, because replaying would tell you a write landed that never ran. Generate one key per request, never per process or per session.Request body application/json
content and markdown are ALTERNATIVES: send one of them. markdown is converted into the same block document content carries, so the resource that comes back is identical either way. Sending both is a 422 — nothing silently wins, because a client that sent the wrong field would otherwise see a 201 and the wrong body.
Example
{
"title": "string",
"content": {
"type": "string",
"content": []
},
"kind": "DISCUSSION",
"tags": [
"string"
],
"categoryId": "string",
"featuredLink": "string",
"poll": {
"question": "string",
"options": [
"string"
],
"allowMultiple": true,
"type": "regular",
"ranked": true,
"public": true,
"minValue": 0,
"maxValue": 0,
"step": 0,
"allowedGroupId": "string",
"closesAt": "2024-01-01T00:00:00Z",
"resultsVisibility": "always",
"minChoices": 0,
"maxChoices": 0,
"chartType": "bar"
},
"anonymous": true,
"customization": {
"customCss": null,
"theme": null,
"shareImageUrl": null,
"ogTitle": null,
"ogDescription": null,
"twitterCard": null,
"jsonLd": null
},
"createdAt": "2024-01-01T00:00:00Z",
"postAs": "self",
"byline": {
"name": "string",
"url": null,
"avatarUrl": null
},
"bylines": [
{
"name": null,
"role": null,
"url": null,
"avatarUrl": null,
"bio": null,
"author": null
}
]
}Option 1
titlestringrequiredcontentobjectrequiredShow child parameters
typestringrequiredcontentobject[]kindstringtagsstring[]categoryIdstringfeaturedLinkstringpollobjectShow child parameters
questionstringrequiredoptionsstring[]allowMultiplebooleantypestringrankedbooleanpublicbooleanminValueintegermaxValueintegerstepintegerallowedGroupIdstringclosesAtstringresultsVisibilitystringminChoicesintegermaxChoicesintegerchartTypestringanonymousbooleancustomizationobjectcustomCss, theme (partial), shareImageUrl, ogTitle, ogDescription, twitterCard, jsonLd. Keys merge on write; null clears one key, or every key when sent for the whole object.Show child parameters
customCssstringcustomCss (@import dropped, no way out of the <style>).themeobjectpost — layered over the space’s (which is over the site’s). On a post, release, event or legal document PATCH it MERGES key by key like the space theme’s PATCH, and null clears at any depth ({"paletteDark": null}); a page’s metadata replaces it whole. Unknown keys are refused by name. null clears all of it.Show child parameters
primaryColorstringaccentColorstringpaletteobjectpaletteDarkobjectfontstringcustomFontFamilystringheadingFontFamilystringbodyFontFamilystringmonoFontFamilystringcolorSchemestringcontentWidthstringlayoutobjectcomponentsobjectmotionobjectchangelogobjecttypographyobjectpostobjectshareImageUrlstringogTitlestringogDescriptionstringtwitterCardstringsummary (thumbnail) or summary_large_image (the default).jsonLdstringnull restores the automatic one.createdAtstringpostAsstringforum.moderate; 403 otherwise). org publishes the topic under the organization: its name, and its email-branding logo as the picture. self (the default) is the posting account. Cannot be combined with byline or bylines (422). Readers see the byline in place of the account on the topic and in the list; the console and API keep authorId, so the post stays accountable to a person.bylineobjecturl, avatarUrl) the topic is published under, as on a blog post. null is the posting account.Show child parameters
namestringrequiredurlstringavatarUrlstringbylinesobject[]{name, role?, url?, avatarUrl?, bio?} or {author: <key>} from this space’s author registry (PUT /orgs/{orgId}/spaces/{spaceId}/blog/authors/{key}; an unknown key is a 422). The first entry is what readers see as the author.Show child parameters
namestringrolestringurlstringavatarUrlstringbiostringauthorstring{
"title": "string",
"content": {
"type": "string",
"content": []
},
"kind": "DISCUSSION",
"tags": [
"string"
],
"categoryId": "string",
"featuredLink": "string",
"poll": {
"question": "string",
"options": [
"string"
],
"allowMultiple": true,
"type": "regular",
"ranked": true,
"public": true,
"minValue": 0,
"maxValue": 0,
"step": 0,
"allowedGroupId": "string",
"closesAt": "2024-01-01T00:00:00Z",
"resultsVisibility": "always",
"minChoices": 0,
"maxChoices": 0,
"chartType": "bar"
},
"anonymous": true,
"customization": {
"customCss": "string",
"theme": {
"primaryColor": null,
"accentColor": null,
"palette": null,
"paletteDark": null,
"font": null,
"customFontFamily": null,
"headingFontFamily": null,
"bodyFontFamily": null,
"monoFontFamily": null,
"colorScheme": null,
"contentWidth": null,
"layout": null,
"components": null,
"motion": null,
"changelog": null,
"typography": null,
"post": null
},
"shareImageUrl": null,
"ogTitle": "string",
"ogDescription": "string",
"twitterCard": "summary",
"jsonLd": "string"
},
"createdAt": "2024-01-01T00:00:00Z",
"postAs": "self",
"byline": {
"name": "string",
"url": "string",
"avatarUrl": "string"
},
"bylines": [
{
"name": "string",
"role": "string",
"url": null,
"avatarUrl": null,
"bio": "string",
"author": "string"
}
]
}Option 2
titlestringrequiredmarkdownstringrequiredcontent. Blocks beyond plain Markdown (callouts, tabs, cards, steppers, columns, buttons, …) are written as :::name{attrs} directives — every directive, its attributes and how it closes: GET /docs/markdown-dialect. Up to 2,000,000 characters of Markdown — the same ceiling the importer, the create and the update doors all use, so an imported page can always be written back.kindstringtagsstring[]categoryIdstringfeaturedLinkstringpollobjectShow child parameters
questionstringrequiredoptionsstring[]allowMultiplebooleantypestringrankedbooleanpublicbooleanminValueintegermaxValueintegerstepintegerallowedGroupIdstringclosesAtstringresultsVisibilitystringminChoicesintegermaxChoicesintegerchartTypestringanonymousbooleancustomizationobjectcustomCss, theme (partial), shareImageUrl, ogTitle, ogDescription, twitterCard, jsonLd. Keys merge on write; null clears one key, or every key when sent for the whole object.Show child parameters
customCssstringcustomCss (@import dropped, no way out of the <style>).themeobjectpost — layered over the space’s (which is over the site’s). On a post, release, event or legal document PATCH it MERGES key by key like the space theme’s PATCH, and null clears at any depth ({"paletteDark": null}); a page’s metadata replaces it whole. Unknown keys are refused by name. null clears all of it.Show child parameters
primaryColorstringaccentColorstringpaletteobjectpaletteDarkobjectfontstringcustomFontFamilystringheadingFontFamilystringbodyFontFamilystringmonoFontFamilystringcolorSchemestringcontentWidthstringlayoutobjectcomponentsobjectmotionobjectchangelogobjecttypographyobjectpostobjectshareImageUrlstringogTitlestringogDescriptionstringtwitterCardstringsummary (thumbnail) or summary_large_image (the default).jsonLdstringnull restores the automatic one.createdAtstringpostAsstringforum.moderate; 403 otherwise). org publishes the topic under the organization: its name, and its email-branding logo as the picture. self (the default) is the posting account. Cannot be combined with byline or bylines (422). Readers see the byline in place of the account on the topic and in the list; the console and API keep authorId, so the post stays accountable to a person.bylineobjecturl, avatarUrl) the topic is published under, as on a blog post. null is the posting account.Show child parameters
namestringrequiredurlstringavatarUrlstringbylinesobject[]{name, role?, url?, avatarUrl?, bio?} or {author: <key>} from this space’s author registry (PUT /orgs/{orgId}/spaces/{spaceId}/blog/authors/{key}; an unknown key is a 422). The first entry is what readers see as the author.Show child parameters
namestringrolestringurlstringavatarUrlstringbiostringauthorstring{
"title": "string",
"markdown": "string",
"kind": "DISCUSSION",
"tags": [
"string"
],
"categoryId": "string",
"featuredLink": "string",
"poll": {
"question": "string",
"options": [
"string"
],
"allowMultiple": true,
"type": "regular",
"ranked": true,
"public": true,
"minValue": 0,
"maxValue": 0,
"step": 0,
"allowedGroupId": "string",
"closesAt": "2024-01-01T00:00:00Z",
"resultsVisibility": "always",
"minChoices": 0,
"maxChoices": 0,
"chartType": "bar"
},
"anonymous": true,
"customization": {
"customCss": "string",
"theme": {
"primaryColor": null,
"accentColor": null,
"palette": null,
"paletteDark": null,
"font": null,
"customFontFamily": null,
"headingFontFamily": null,
"bodyFontFamily": null,
"monoFontFamily": null,
"colorScheme": null,
"contentWidth": null,
"layout": null,
"components": null,
"motion": null,
"changelog": null,
"typography": null,
"post": null
},
"shareImageUrl": null,
"ogTitle": "string",
"ogDescription": "string",
"twitterCard": "summary",
"jsonLd": "string"
},
"createdAt": "2024-01-01T00:00:00Z",
"postAs": "self",
"byline": {
"name": "string",
"url": "string",
"avatarUrl": "string"
},
"bylines": [
{
"name": "string",
"role": "string",
"url": null,
"avatarUrl": null,
"bio": "string",
"author": "string"
}
]
}cURL
curl -X POST "https://forumulate.com/api/orgs/{orgId}/spaces/{spaceId}/forum" \
-H "forumulate-version: <value>" \
-H "Idempotency-Key: <value>" \
-H "Content-Type: application/json" \
-d '{"title":"string","content":{"type":"string","content":[]},"kind":"DISCUSSION","tags":["string"],"categoryId":"string","featuredLink":"string","poll":{"question":"string","options":["string"],"allowMultiple":true,"type":"regular","ranked":true,"public":true,"minValue":0,"maxValue":0,"step":0,"allowedGroupId":"string","closesAt":"2024-01-01T00:00:00Z","resultsVisibility":"always","minChoices":0,"maxChoices":0,"chartType":"bar"},"anonymous":true,"customization":{"customCss":null,"theme":null,"shareImageUrl":null,"ogTitle":null,"ogDescription":null,"twitterCard":null,"jsonLd":null},"createdAt":"2024-01-01T00:00:00Z","postAs":"self","byline":{"name":"string","url":null,"avatarUrl":null},"bylines":[{"name":null,"role":null,"url":null,"avatarUrl":null,"bio":null,"author":null}]}'TypeScript
const res = await fetch('https://forumulate.com/api/orgs/{orgId}/spaces/{spaceId}/forum', {
method: 'POST',
headers: {
'forumulate-version': '<value>',
'Idempotency-Key': '<value>',
'Content-Type': 'application/json',
},
body: JSON.stringify({"title":"string","content":{"type":"string","content":[]},"kind":"DISCUSSION","tags":["string"],"categoryId":"string","featuredLink":"string","poll":{"question":"string","options":["string"],"allowMultiple":true,"type":"regular","ranked":true,"public":true,"minValue":0,"maxValue":0,"step":0,"allowedGroupId":"string","closesAt":"2024-01-01T00:00:00Z","resultsVisibility":"always","minChoices":0,"maxChoices":0,"chartType":"bar"},"anonymous":true,"customization":{"customCss":null,"theme":null,"shareImageUrl":null,"ogTitle":null,"ogDescription":null,"twitterCard":null,"jsonLd":null},"createdAt":"2024-01-01T00:00:00Z","postAs":"self","byline":{"name":"string","url":null,"avatarUrl":null},"bylines":[{"name":null,"role":null,"url":null,"avatarUrl":null,"bio":null,"author":null}]}),
});
const data = await res.json();Python
import requests
res = requests.request(
"POST",
"https://forumulate.com/api/orgs/{orgId}/spaces/{spaceId}/forum",
headers={
"forumulate-version": "<value>",
"Idempotency-Key": "<value>",
"Content-Type": "application/json",
},
json={"title": "string", "content": {"type": "string", "content": []}, "kind": "DISCUSSION", "tags": ["string"], "categoryId": "string", "featuredLink": "string", "poll": {"question": "string", "options": ["string"], "allowMultiple": True, "type": "regular", "ranked": True, "public": True, "minValue": 0, "maxValue": 0, "step": 0, "allowedGroupId": "string", "closesAt": "2024-01-01T00:00:00Z", "resultsVisibility": "always", "minChoices": 0, "maxChoices": 0, "chartType": "bar"}, "anonymous": True, "customization": {"customCss": None, "theme": None, "shareImageUrl": None, "ogTitle": None, "ogDescription": None, "twitterCard": None, "jsonLd": None}, "createdAt": "2024-01-01T00:00:00Z", "postAs": "self", "byline": {"name": "string", "url": None, "avatarUrl": None}, "bylines": [{"name": None, "role": None, "url": None, "avatarUrl": None, "bio": None, "author": None}]},
)
data = res.json()Go
package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
req, _ := http.NewRequest("POST", "https://forumulate.com/api/orgs/{orgId}/spaces/{spaceId}/forum", strings.NewReader(`{"title":"string","content":{"type":"string","content":[]},"kind":"DISCUSSION","tags":["string"],"categoryId":"string","featuredLink":"string","poll":{"question":"string","options":["string"],"allowMultiple":true,"type":"regular","ranked":true,"public":true,"minValue":0,"maxValue":0,"step":0,"allowedGroupId":"string","closesAt":"2024-01-01T00:00:00Z","resultsVisibility":"always","minChoices":0,"maxChoices":0,"chartType":"bar"},"anonymous":true,"customization":{"customCss":null,"theme":null,"shareImageUrl":null,"ogTitle":null,"ogDescription":null,"twitterCard":null,"jsonLd":null},"createdAt":"2024-01-01T00:00:00Z","postAs":"self","byline":{"name":"string","url":null,"avatarUrl":null},"bylines":[{"name":null,"role":null,"url":null,"avatarUrl":null,"bio":null,"author":null}]}`))
req.Header.Set("forumulate-version", "<value>")
req.Header.Set("Idempotency-Key", "<value>")
req.Header.Set("Content-Type", "application/json")
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}/forum');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['forumulate-version: <value>', 'Idempotency-Key: <value>', 'Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"title":"string","content":{"type":"string","content":[]},"kind":"DISCUSSION","tags":["string"],"categoryId":"string","featuredLink":"string","poll":{"question":"string","options":["string"],"allowMultiple":true,"type":"regular","ranked":true,"public":true,"minValue":0,"maxValue":0,"step":0,"allowedGroupId":"string","closesAt":"2024-01-01T00:00:00Z","resultsVisibility":"always","minChoices":0,"maxChoices":0,"chartType":"bar"},"anonymous":true,"customization":{"customCss":null,"theme":null,"shareImageUrl":null,"ogTitle":null,"ogDescription":null,"twitterCard":null,"jsonLd":null},"createdAt":"2024-01-01T00:00:00Z","postAs":"self","byline":{"name":"string","url":null,"avatarUrl":null},"bylines":[{"name":null,"role":null,"url":null,"avatarUrl":null,"bio":null,"author":null}]}');
$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}/forum')
req = Net::HTTP::Post.new(uri)
req['forumulate-version'] = '<value>'
req['Idempotency-Key'] = '<value>'
req['Content-Type'] = 'application/json'
req.body = '{"title":"string","content":{"type":"string","content":[]},"kind":"DISCUSSION","tags":["string"],"categoryId":"string","featuredLink":"string","poll":{"question":"string","options":["string"],"allowMultiple":true,"type":"regular","ranked":true,"public":true,"minValue":0,"maxValue":0,"step":0,"allowedGroupId":"string","closesAt":"2024-01-01T00:00:00Z","resultsVisibility":"always","minChoices":0,"maxChoices":0,"chartType":"bar"},"anonymous":true,"customization":{"customCss":null,"theme":null,"shareImageUrl":null,"ogTitle":null,"ogDescription":null,"twitterCard":null,"jsonLd":null},"createdAt":"2024-01-01T00:00:00Z","postAs":"self","byline":{"name":"string","url":null,"avatarUrl":null},"bylines":[{"name":null,"role":null,"url":null,"avatarUrl":null,"bio":null,"author":null}]}'
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
http.request(req)
end
puts res.bodyJava
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}/forum"))
.header("forumulate-version", "<value>")
.header("Idempotency-Key", "<value>")
.header("Content-Type", "application/json")
.method("POST", BodyPublishers.ofString("{\"title\":\"string\",\"content\":{\"type\":\"string\",\"content\":[]},\"kind\":\"DISCUSSION\",\"tags\":[\"string\"],\"categoryId\":\"string\",\"featuredLink\":\"string\",\"poll\":{\"question\":\"string\",\"options\":[\"string\"],\"allowMultiple\":true,\"type\":\"regular\",\"ranked\":true,\"public\":true,\"minValue\":0,\"maxValue\":0,\"step\":0,\"allowedGroupId\":\"string\",\"closesAt\":\"2024-01-01T00:00:00Z\",\"resultsVisibility\":\"always\",\"minChoices\":0,\"maxChoices\":0,\"chartType\":\"bar\"},\"anonymous\":true,\"customization\":{\"customCss\":null,\"theme\":null,\"shareImageUrl\":null,\"ogTitle\":null,\"ogDescription\":null,\"twitterCard\":null,\"jsonLd\":null},\"createdAt\":\"2024-01-01T00:00:00Z\",\"postAs\":\"self\",\"byline\":{\"name\":\"string\",\"url\":null,\"avatarUrl\":null},\"bylines\":[{\"name\":null,\"role\":null,\"url\":null,\"avatarUrl\":null,\"bio\":null,\"author\":null}]}"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());Responses
Example
{
"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
},
"warnings": [
"string"
],
"data": {
"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
}
}Schema
topicobjectrequiredShow child parameters
answerCountnumberanswerPostIdstringrequiredassignedGroupIdstringrequiredassigneeIdstringrequiredauthorAvatarSeedstringauthorAvatarUrlstringauthorIdstringrequiredauthorKindstringauthorNamestringrequiredauthorPointsnumberauthorsobject[]requiredShow child parameters
namestringrequireduserIdstringrequiredauthorTitlestringauthorUsernamestringbookmarkedbooleanbylineBylinerequiredShow child parameters
avatarUrlstringnamestringurlstringbylinesBylineView[]Show child parameters
authorstringrequiredavatarUrlstringrequiredbiostringrequiredhandlestringnamestringrequiredrolestringrequiredurlstringrequireduserIdstringrequiredcategoryIdstringrequiredcommentsEnabledbooleanrequiredcontentChangedAtstringcoverUrlstringrequiredcustomizationPieceCustomizationrequiredShow child parameters
customCssstringjsonLdstringogDescriptionstringogTitlestringshareImageUrlstringthemeobjecttwitterCardstringdeletedAtstringexcerptstringrequiredexpiresAtstringfeaturedbooleanrequiredfeaturedLinkstringrequiredfieldsobjectrequiredfirstImageUrlstringfurtherReadingobject[]requiredShow child parameters
hrefstringrequiredlabelstringrequiredidstringrequiredisNewbooleankindstringrequiredlastActivityAtstringrequiredlastPostedAtstringlastPosterNamestringlikeCountnumberlinkedTopicsLinkedTopic[]requiredShow child parameters
createdAtstringrequiredfromPostNumbernumberrequiredidstringrequiredslugstringrequiredtitlestringrequiredlistedbooleanrequiredmergedIntoIdstringrequirednumbernumberrequiredonThisPagestringrequiredopobjectrequiredShow child parameters
actionCodestringrequiredactionDataobjectrequiredauthorAvatarSeedstringauthorAvatarUrlstringauthorBadgesobject[]authorBadgeTiersobjectrequest.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"
}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"
}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"
}*.not_found).{
"error": {
"code": "string",
"message": "string",
"details": {},
"docs": "string",
"reason": "string",
"slugs": [
"string"
],
"conflict": {
"etag": "string",
"ops": [
null
]
}
},
"requestId": "string"
}validation.failed). error.details names the field paths.{
"error": {
"code": "string",
"message": "string",
"details": {},
"docs": "string",
"reason": "string",
"slugs": [
"string"
],
"conflict": {
"etag": "string",
"ops": [
null
]
}
},
"requestId": "string"
}{
"error": {
"code": "string",
"message": "string",
"details": {},
"docs": "string",
"reason": "string",
"slugs": [
"string"
],
"conflict": {
"etag": "string",
"ops": [
null
]
}
},
"requestId": "string"
}{
"error": {
"code": "string",
"message": "string",
"details": {},
"docs": "string",
"reason": "string",
"slugs": [
"string"
],
"conflict": {
"etag": "string",
"ops": [
null
]
}
},
"requestId": "string"
}