Get the space (public reader)
GET
https://forumulate.com/api /public/orgs/{orgId}/spaces/{spaceId} A reader surface’s whole navigation in one call: the collections, the glossary, the locales and versions on offer, and the chat widgets configured for it. What a custom front end fetches first to render chrome before it knows which page the visitor wants.
Parameters
orgIdstringpathrequiredspaceIdstringpathrequiredlocalestringqueryrequiredpreviewstringquerysharestringqueryversionstringqueryforumulate-versionstringheaderAPI 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}?locale=&preview=&share=&version=" \
-H "forumulate-version: <value>"TypeScript
const res = await fetch('https://forumulate.com/api/public/orgs/{orgId}/spaces/{spaceId}?locale=&preview=&share=&version=', {
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}?locale=&preview=&share=&version=",
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}?locale=&preview=&share=&version=", 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}?locale=&preview=&share=&version=');
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}?locale=&preview=&share=&version=')
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.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/public/orgs/{orgId}/spaces/{spaceId}?locale=&preview=&share=&version="))
.header("forumulate-version", "<value>")
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());Responses
200 Success.
Example
{
"aiEnabled": true,
"analytics": {
"customHead": "string",
"fathom": "string",
"ga4": "string",
"gtm": "string",
"intercom": "string",
"matomo": "string",
"matomoHost": "string",
"plausible": "string",
"plausibleHost": "string",
"posthog": "string",
"posthogHost": "string",
"segment": "string",
"simpleAnalytics": "string",
"umami": "string",
"umamiHost": "string"
},
"careersApplyUrl": "string",
"chatWidgets": [
{
"connectOrigins": [
"string"
],
"consent": "analytics",
"origin": "string",
"placement": "anywhere",
"providerId": "string",
"providerName": "string",
"script": "string",
"src": "string",
"theme": {}
}
],
"collections": [
{
"coverUrl": "string",
"description": "string",
"id": "string",
"isDefault": true,
"name": "string",
"nav": {
"backStyle": "link",
"collapsed": true,
"hubCards": true,
"icon": "string",
"linkHub": true,
"navScope": "isolated"
},
"pages": [
{
"apiMethod": null,
"audience": null,
"badge": null,
"childCount": null,
"children": null,
"description": null,
"externalUrl": null,
"fields": null,
"hasLive": null,
"hideFromNav": null,
"icon": null,
"id": null,
"navFont": null,
"navKind": null,
"navTitle": null,
"pageKind": null,
"pagerLabel": null,
"parentId": null,
"readingMinutes": null,
"shapeKey": null,
"shapeLabel": null,
"slug": null,
"sortKey": null,
"status": null,
"tags": null,
"title": null,
"updatedAt": null
}
],
"seo": {
"description": "string",
"title": "string"
},
"slug": "string",
"translations": {}
}
],
"commentsEnabled": true,
"frontDoor": {},
"frontPage": {
"aside": {
"doc": {
"content": null,
"type": null
},
"phone": "after",
"width": "default"
},
"customization": {},
"doc": {
"content": [
null
],
"type": "doc"
},
"gap": "lg",
"hideTitle": true,
"paddingBottom": "string",
"paddingTop": "string",
"preset": "string",
"sidebar": {
"divider": {
"color": null,
"style": null,
"width": null
},
"doc": {
"content": null,
"type": null
},
"gap": null,
"phone": null,
"position": "left",
"source": "doc",
"startAfter": 0,
"width": "default"
},
"width": 0
},
"glossary": [
{
"definition": "string",
"term": "string"
}
],
"homeDoc": {
"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"
}
]
}
]
},
"homeDocTranslations": {},
"homePageId": "string",
"homePageSlug": "string",
"locale": "string",
"locales": [
{
"code": "string",
"isDefault": true,
"label": "string"
}
],
"organization": {
"id": "string",
"name": "string",
"slug": "string"
},
"piecePage": {
"after": {
"content": [
{
"attrs": null,
"content": null,
"type": null
}
],
"type": "doc"
},
"sidebar": {
"doc": {
"content": [
null
],
"type": "doc"
},
"position": "left"
}
},
"preset": "string",
"readerTools": {
"aiActions": true,
"copyMarkdown": true,
"mcp": true,
"pdf": true,
"search": true
},
"seo": {
"contentLanguage": "string",
"description": "string",
"indexHidden": true,
"locales": [
"string"
],
"localeUrlStyle": "path",
"noindex": true,
"schemaType": "string",
"siteName": "string",
"socialCard": {
"accent": "string",
"accentBar": true,
"background": "string",
"backgroundTo": "string",
"eyebrowColor": "string",
"font": "mono",
"footer": "string",
"logoUrl": "string",
"titleColor": "string"
},
"socialCardVersion": "string",
"socialImageUrl": "string",
"titleTemplate": "string",
"twitterSite": "string",
"verification": {
"bing": "string",
"google": "string"
}
},
"shape": {
"blockTypes": [
{
"description": "string",
"fields": [
null
],
"group": "string",
"icon": "string",
"key": "string",
"label": "string",
"variants": [
null
]
}
],
"params": [
{
"accept": [
null
],
"admin": {
"collapsed": null,
"collapsible": null,
"row": null,
"tab": null
},
"allowed": [
null
],
"allowedBlocks": [
null
],
"allowedGroups": [
null
],
"column": true,
"condition": null,
"default": {},
"expr": null,
"facet": true,
"fields": [
null
],
"from": "string",
"hasMany": true,
"hint": "string",
"indexed": true,
"internal": true,
"key": "string",
"label": "string",
"language": "string",
"localized": true,
"max": 0,
"maxLength": 0,
"meta": true,
"min": 0,
"minLength": 0,
"options": [
null
],
"pattern": "string",
"placeholder": "string",
"relationSpaceId": "string",
"required": true,
"rowLabelField": "string",
"schema": {},
"schemaProperty": "string",
"sortable": true,
"to": [
null
],
"type": "array",
"unique": true,
"visibility": "internal"
}
],
"sections": [
{
"example": "string",
"hint": "string",
"key": "string",
"kind": "list",
"label": "string",
"render": "labelled",
"required": true,
"role": "example",
"schemaProperty": "string"
}
],
"settings": {
"blockLibrary": true,
"defaultSort": "string",
"defaultVisibility": "internal",
"group": "string",
"icon": "string",
"listColumns": [
"string"
],
"orderable": true,
"previewUrl": "string",
"routable": true,
"searchableFields": [
"string"
],
"singleton": true,
"slugField": "string",
"strict": true,
"titleField": "string",
"versions": {
"max": 0
}
},
"space": {
"index": "board",
"nav": "categories",
"order": "activity",
"summary": [
"string"
],
"whoCreates": "anyone"
},
"unknown": [
"string"
]
},
"space": {
"description": "string",
"id": "string",
"name": "string",
"slug": "string",
"translations": {},
"type": "BLOG"
},
"theme": {},
"version": "string",
"versionCanonical": "latest",
"versions": [
{
"archived": true,
"badge": "string",
"banner": "none",
"hidden": true,
"isDefault": true,
"key": "string",
"label": "string"
}
]
}Schema
aiEnabledbooleanrequiredanalyticsobjectrequiredShow child parameters
customHeadstringfathomstringga4stringgtmstringintercomstringmatomostringmatomoHoststringplausiblestringplausibleHoststringposthogstringposthogHoststringsegmentstringsimpleAnalyticsstringumamistringumamiHoststringcareersApplyUrlstringrequiredchatWidgetsWidgetDescriptor[]requiredShow child parameters
connectOriginsstring[]requiredconsentstringrequiredoriginstringrequiredplacementstringrequiredproviderIdstringrequiredproviderNamestringrequiredscriptstringrequiredsrcstringthemeobjectrequiredcollectionsReaderCollection[]requiredShow child parameters
coverUrlstringdescriptionstringidstringrequiredisDefaultbooleanrequirednamestringrequirednavobjectShow child parameters
backStylestringcollapsedbooleanhubCardsbooleaniconstringlinkHubbooleannavScopestringpagesPageNode[]requiredShow child parameters
apiMethodstringaudienceobjectrequiredbadgeobjectchildCountnumberrequiredchildrenPageNode[]requireddescriptionstringrequiredexternalUrlstringrequiredfieldsobjectrequiredhasLivebooleanrequiredhideFromNavbooleanrequirediconstringrequiredidstringrequirednavFontstringnavKindstringnavTitlestringpageKindstringrequiredpagerLabelstringrequiredparentIdstringrequiredreadingMinutesnumberrequiredshapeKeystringrequiredshapeLabelstringrequiredslugstringrequiredsortKeystringrequiredstatusstringrequiredtagsstring[]requiredtitlestringrequiredupdatedAtstringrequiredseoobjectShow child parameters
descriptionstringtitlestringslugstringrequiredtranslationsobjectcommentsEnabledbooleanrequiredfrontDoorobjectrequiredfrontPageStoredFrontPagerequiredShow child parameters
asideobjectShow child parameters
docobjectrequiredphonestringwidthstringcustomizationobjectdocobjectrequiredShow child parameters
contentobject[]requiredtypestringrequiredgapstringhideTitlebooleanpaddingBottomstring | numberpaddingTopstring | number | IndexFrameStepspresetstringsidebarobjectShow child parameters
dividerobjectdocobjectrequiredgapstring | numberphonestring | objectpositionstringrequiredsourcestringstartAfternumberwidthstringwidthnumber | stringglossaryobject[]requiredShow child parameters
definitionstringrequiredtermstringrequiredhomeDocBlockDocrequiredShow child parameters
typestringrequiredcontentBlockNode[]requiredThe top-level block nodes.
Show child parameters
typestringrequiredThe node kind, e.g.
paragraph, heading, codeBlock, text. The full list is at GET /docs/block-schema.attrsobjectNode-specific attributes, e.g.
{ "level": 2 } for a heading.contentBlockNode[]Child nodes, for container blocks.
textstringThe literal text, for a
text node.marksobject[]Inline marks (bold, italic, link, …) on a
text node.homeDocTranslationsobjecthomePageIdstringrequiredhomePageSlugstringlocalestringrequiredlocalesDocLocale[]requiredShow child parameters
codestringrequiredisDefaultbooleanrequiredlabelstringrequiredorganizationobjectrequiredShow child parameters
idstringrequirednamestringrequiredslugstringrequiredpiecePageobjectShow child parameters
afterobjectShow child parameters
contentobject[]requiredtypestringrequiredsidebarobjectShow child parameters
docobjectrequiredpositionstringrequiredpresetstringrequiredreaderToolsobjectrequiredShow child parameters
aiActionsbooleanrequiredcopyMarkdownbooleanrequiredmcpbooleanrequiredpdfbooleanrequiredsearchbooleanrequiredseoobjectrequiredShow child parameters
contentLanguagestringrequireddescriptionstringrequiredindexHiddenbooleanrequiredlocalesstring[]localeUrlStylestringnoindexbooleanrequiredschemaTypestringsiteNamestringrequiredsocialCardobjectShow child parameters
accentstringaccentBarbooleanbackgroundstringbackgroundTostringeyebrowColorstringfontstringfooterstringlogoUrlstringtitleColorstringsocialCardVersionstringrequiredsocialImageUrlstringrequiredtitleTemplatestringrequiredtwitterSitestringrequiredverificationobjectrequiredShow child parameters
bingstringrequiredgooglestringrequiredshapeobjectrequiredShow child parameters
blockTypesBlockType[]requiredShow child parameters
descriptionstringfieldsSpaceTypeField[]requiredgroupstringiconstringkeystringrequiredlabelstringrequiredvariantsBlockVariant[]paramsSpaceTypeField[]requiredShow child parameters
acceptstring[]adminobjectallowedstring[]allowedBlocksstring[]allowedGroupsstring[]columnbooleanconditionstring | number | boolean | string | number | boolean | object[] | object[] | objectdefaultobjectexprstring | number | boolean | string | number | boolean | object[] | object[] | objectfacetbooleanfieldsSpaceTypeField[]fromstringhasManybooleanhintstringindexedbooleaninternalbooleankeystringrequiredlabelstringrequiredlanguagestringlocalizedbooleanmaxnumbermaxLengthnumbermetabooleanminnumberminLengthnumberoptionsstring[]patternstring400 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