Create the forum in a space

Embed
Preview of the card
<a href="https://forumulate.com/reference/forumulate-api-forumtopics-create"><img src="https://forumulate.com/reference/_api/public/orgs/046a9bc0-d530-43ae-9bae-af7945008cda/spaces/8042f004-e3d9-445f-b7a4-b6c1f86836e6/pages/6ce0fd52-1876-4da1-a9a6-2b1877cb9e59/social-card.svg?v=3e7ae33eec8b" alt="Create the forum in a space" width="600" height="315"></a>
POSThttps://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
orgIdstringpathrequired
spaceIdstringpathrequired
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:
Idempotency-Keystringheader
Makes this write safe to retry. Optional — send any unique string (a UUID is ideal) and the first request runs while its response is remembered under that key for 24 hours; an identical retry replays that same status and body instead of acting twice, so a timeout or a 5xx from the edge can be retried without creating a second row. A retry sent while the first request is still in flight is refused with 409. 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
titlestringrequired
contentobjectrequired
Show child parameters
typestringrequired
contentobject[]
= []
kindstring
DISCUSSION | QUESTION
tagsstring[]
categoryIdstring
featuredLinkstring
pollobject
Show child parameters
questionstringrequired
optionsstring[]
allowMultipleboolean
typestring
regular | number
rankedboolean
publicboolean
minValueinteger
Lowest number a voter may pick. With maxValue/step the range must span 2–20 steps.
maxValueinteger
Highest number a voter may pick. Must be greater than minValue.
stepinteger
Spacing between pickable numbers (default 1). Widen it to keep the range inside 20 steps.
allowedGroupIdstring
closesAtstring
When voting closes. Must be in the future — a past date created an already-closed poll.
resultsVisibilitystring
always | on_vote | on_close | staff
minChoicesinteger
maxChoicesinteger
chartTypestring
bar | pie
anonymousboolean
customizationobject
This piece’s own look and share card: customCss, 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
customCssstring
CSS for THIS piece only, after the space theme so it wins. Sanitised and scoped to the reader exactly like the space customCss (@import dropped, no way out of the <style>).
themeobject
A partial theme for this piece — colours, palettes, fonts, typography, colorScheme, components, contentWidth, layout, motion, and (on a blog post) post — 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
primaryColorstring
accentColorstring
paletteobject
paletteDarkobject
fontstring
customFontFamilystring
headingFontFamilystring
bodyFontFamilystring
monoFontFamilystring
colorSchemestring
contentWidthstring
layoutobject
componentsobject
motionobject
changelogobject
typographyobject
postobject
shareImageUrlstring
The og:image / twitter:image for this piece, separate from its cover. Wins over the cover and over the generated social card.
ogTitlestring
og:title / twitter:title.
ogDescriptionstring
og:description / twitter:description.
twitterCardstring
summary (thumbnail) or summary_large_image (the default).
jsonLdstring
Structured data for this piece, as JSON (object or array of objects). Replaces the automatic markup on this piece (Article/BlogPosting, Event, DiscussionForumPosting/QAPage, the roadmap item’s Article). null restores the automatic one.
createdAtstring
postAsstring
Moderators only (forum.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.
self | org
bylineobject
Moderators only. The name (with optional url, avatarUrl) the topic is published under, as on a blog post. null is the posting account.
Show child parameters
namestringrequired
urlstring
avatarUrlstring
bylinesobject[]
Moderators only. Credits in order, as on a blog post: {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
namestring
rolestring
urlstring
avatarUrlstring
biostring
authorstring
{
  "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
titlestringrequired
markdownstringrequired
The body as Markdown (CommonMark + tables/task lists), converted server-side. Alternative to content. 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.
kindstring
DISCUSSION | QUESTION
tagsstring[]
categoryIdstring
featuredLinkstring
pollobject
Show child parameters
questionstringrequired
optionsstring[]
allowMultipleboolean
typestring
regular | number
rankedboolean
publicboolean
minValueinteger
Lowest number a voter may pick. With maxValue/step the range must span 2–20 steps.
maxValueinteger
Highest number a voter may pick. Must be greater than minValue.
stepinteger
Spacing between pickable numbers (default 1). Widen it to keep the range inside 20 steps.
allowedGroupIdstring
closesAtstring
When voting closes. Must be in the future — a past date created an already-closed poll.
resultsVisibilitystring
always | on_vote | on_close | staff
minChoicesinteger
maxChoicesinteger
chartTypestring
bar | pie
anonymousboolean
customizationobject
This piece’s own look and share card: customCss, 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
customCssstring
CSS for THIS piece only, after the space theme so it wins. Sanitised and scoped to the reader exactly like the space customCss (@import dropped, no way out of the <style>).
themeobject
A partial theme for this piece — colours, palettes, fonts, typography, colorScheme, components, contentWidth, layout, motion, and (on a blog post) post — 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
primaryColorstring
accentColorstring
paletteobject
paletteDarkobject
fontstring
customFontFamilystring
headingFontFamilystring
bodyFontFamilystring
monoFontFamilystring
colorSchemestring
contentWidthstring
layoutobject
componentsobject
motionobject
changelogobject
typographyobject
postobject
shareImageUrlstring
The og:image / twitter:image for this piece, separate from its cover. Wins over the cover and over the generated social card.
ogTitlestring
og:title / twitter:title.
ogDescriptionstring
og:description / twitter:description.
twitterCardstring
summary (thumbnail) or summary_large_image (the default).
jsonLdstring
Structured data for this piece, as JSON (object or array of objects). Replaces the automatic markup on this piece (Article/BlogPosting, Event, DiscussionForumPosting/QAPage, the roadmap item’s Article). null restores the automatic one.
createdAtstring
postAsstring
Moderators only (forum.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.
self | org
bylineobject
Moderators only. The name (with optional url, avatarUrl) the topic is published under, as on a blog post. null is the posting account.
Show child parameters
namestringrequired
urlstring
avatarUrlstring
bylinesobject[]
Moderators only. Credits in order, as on a blog post: {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
namestring
rolestring
urlstring
avatarUrlstring
biostring
authorstring
{
  "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"
    }
  ]
}
Code samples
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.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}/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
201 Created.
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
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
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"
}
422 The body was understood and a value is unacceptable (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"
}
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