Get the site (public reader)
GET
https://forumulate.com/api /public/orgs/{orgId}/sites/{slug} What an anonymous visitor is served for a whole site: its configuration, the member spaces, their published page trees and the tabs they are grouped into. One request for the navigation of everything under the address, which is why a reader shell fetches it first.
Parameters
orgIdstringpathrequiredslugstringpathrequiredpreviewstringqueryforumulate-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}/sites/{slug}?preview=" \
-H "forumulate-version: <value>"TypeScript
const res = await fetch('https://forumulate.com/api/public/orgs/{orgId}/sites/{slug}?preview=', {
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}/sites/{slug}?preview=",
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}/sites/{slug}?preview=", 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}/sites/{slug}?preview=');
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}/sites/{slug}?preview=')
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}/sites/{slug}?preview="))
.header("forumulate-version", "<value>")
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());Responses
200 Success.
Example
{
"config": {
"copyright": "string",
"cta": {
"href": "string",
"label": "string"
},
"footer": {
"art": {
"blur": 0,
"clip": "none",
"color": "string",
"direction": "down-left",
"fade": "both",
"fit": "contain",
"glowAlign": null,
"glowBelow": 0,
"glowWidth": null,
"height": null,
"image": "string",
"offsetY": 0,
"opacity": 0,
"placement": "above",
"position": "center",
"preset": "glow"
},
"background": {
"color": "string",
"colorDark": "string",
"edge": "string",
"gradient": {
"angle": null,
"stops": null,
"type": null
},
"image": "string"
},
"border": true,
"bottomAlign": "columns",
"bottomRule": true,
"bottomSize": 0,
"brandPlacement": "bottom",
"brandWidth": "string",
"breadcrumb": true,
"breadcrumbPlacement": "bottom",
"columnRule": true,
"columns": 0,
"columnWidth": 0,
"contentWidth": "string",
"cookieLinkPlacement": "bottom",
"css": "string",
"font": "body",
"headingFont": "body",
"headingGap": 0,
"headingInk": "string",
"headingInkDark": "string",
"headingSize": 0,
"headingStyle": "label",
"headingWeight": 0,
"hideOn": [
"docs"
],
"html": "string",
"htmlLinkInk": "string",
"htmlLinkInkDark": "string",
"htmlLinkUnderline": true,
"htmlPlacement": "above",
"htmlSize": 0,
"layout": "rows",
"linkGap": 0,
"linkInk": "string",
"linkInkDark": "string",
"linkSeparator": "dot",
"linkSize": 0,
"linkWeight": 0,
"logo": "string",
"logoMark": "string",
"newsletter": {
"button": {
"background": null,
"backgroundDark": null,
"border": null,
"ink": null,
"inkDark": null
},
"consent": {
"checkbox": null,
"text": null
},
"consentPlacement": "form",
"formId": "string",
"heading": "string",
"headingWidth": 0,
"hideLabel": true,
"layout": "split",
"padding": {
"bottom": null,
"top": null
},
"placement": "above",
"rule": true,
"splitRatio": 0,
"subheading": "string"
},
"padding": {
"bottom": 0,
"top": 0
},
"phone": "accordion",
"scheme": "dark",
"showBrandName": true,
"socialSize": 0,
"socialStyle": "circle",
"status": {
"case": "none",
"color": "string",
"dot": true,
"font": "body",
"monitorSpaceId": "string",
"style": "pill"
},
"width": "string"
},
"footerColumns": [
{
"heading": "string",
"links": [
null
]
}
],
"footerDescription": "string",
"footerLinks": [
{
"href": "string",
"label": "string"
}
],
"headerLinks": [
{
"audience": "all",
"border": "string",
"borderDark": "string",
"children": [
null
],
"divider": true,
"githubRepo": "string",
"highlight": true,
"href": "string",
"icon": "string",
"iconDark": "string",
"iconOnly": true,
"ink": "string",
"inkDark": "string",
"kbd": "mod-i",
"label": "string",
"match": {
"collection": null,
"pathPrefix": null
},
"panel": {
"align": null,
"columns": null,
"css": null,
"featured": null,
"footer": null,
"html": null,
"width": null
},
"phone": "bar",
"placement": "bar",
"style": "button"
}
],
"headerSpaceIds": [
"string"
],
"mobileNav": "bar",
"navMenu": {
"animation": "fade",
"background": "string",
"border": "string",
"closeDelay": 0,
"ink": "string",
"openDelay": 0,
"radius": 0,
"shadow": "lg",
"trigger": "click",
"width": 0
},
"pageMounts": [
{
"page": "string",
"path": "string",
"spaceId": "string"
}
],
"socialLinks": [
{
"href": "string",
"platform": "string"
}
],
"tabs": [
{
"slug": "string",
"spaceIds": [
null
],
"title": "string"
}
],
"tagline": "string",
"theme": {},
"themeToggle": {
"activeColor": "string",
"border": true,
"footerAlign": "end",
"hideOn": [
"desktop"
],
"modes": [
"dark"
],
"phone": "menu",
"position": "end",
"radius": 0,
"show": true,
"style": "cycle"
},
"translations": {}
},
"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
},
"name": "string",
"orgSlug": "string",
"previewing": "site",
"sections": [
{
"collections": [
{
"id": null,
"isDefault": null,
"name": null,
"pages": null,
"slug": null
}
],
"spaceId": "string",
"spaceName": "string"
}
],
"slug": "string",
"spaces": [
{
"addresses": [
{
"basePath": null,
"hostname": null
}
],
"aiIngestion": true,
"indexable": true,
"locales": [
"string"
],
"localeUrlStyle": "path",
"name": "string",
"slug": "string",
"spaceId": "string",
"translations": {},
"type": "string",
"updatedAt": "string"
}
],
"tabs": [
{
"sections": [
{
"collections": null,
"spaceId": null,
"spaceName": null
}
],
"slug": "string",
"title": "string"
}
],
"themeComponents": [
{
"css": "string",
"id": "string",
"outlets": {
"above-main": {},
"below-main": {},
"blog-index-above-list": {},
"blog-post-after": {},
"blog-post-before": {},
"blog-post-end": {},
"careers-above-list": {},
"category-header": {},
"changelog-above-list": {},
"courses-above-list": {},
"courses-certificate-footer": {},
"courses-landing-hero-after": {},
"courses-lesson-above-body": {},
"courses-lesson-after-body": {},
"docs-page-footer": {},
"docs-page-header": {},
"docs-sidebar-end": {},
"docs-sidebar-start": {},
"events-above-list": {},
"events-card-footer": {},
"events-page-above-body": {},
"events-page-after-body": {},
"events-page-aside": {},
"faq-above-list": {},
"footer-after": {},
"footer-before": {},
"forum-categories-above": {},
"forum-index-above-list": {},
"forum-index-below-list": {},
"forum-post-after-body": {},
"forum-post-author-after": {},
"forum-sidebar-bottom": {},
"forum-sidebar-top": {},
"forum-topic-above-title": {},
"forum-topic-below-first-post": {},
"forum-topic-below-title": {},
"forum-topic-bottom": {},
"forum-topic-row-after-title": {},
"front-page-bottom": {},
"front-page-top": {},
"header-after": {},
"header-before": {},
"roadmap-above-board": {},
"status-above-board": {},
"user-card": {}
},
"settings": {},
"slug": "string",
"strings": {},
"values": {}
}
]
}Schema
configobjectrequiredShow child parameters
copyrightstringctaobjectShow child parameters
hrefstringrequiredlabelstringrequiredfooterobjectShow child parameters
artobjectbackgroundobjectborderbooleanbottomAlignstringbottomRulebooleanbottomSizenumberbrandPlacementstringbrandWidthstring | numberbreadcrumbbooleanbreadcrumbPlacementstringcolumnRulebooleancolumnsnumber | stringcolumnWidthnumbercontentWidthstringcookieLinkPlacementstringcssstringfontstringheadingFontstringheadingGapnumberheadingInkstringheadingInkDarkstringheadingSizenumberheadingStylestringheadingWeightnumberhideOnstring[]htmlstringhtmlLinkInkstringhtmlLinkInkDarkstringhtmlLinkUnderlinebooleanhtmlPlacementstringhtmlSizenumberlayoutstringlinkGapnumberlinkInkstringlinkInkDarkstringlinkSeparatorstringlinkSizenumberlinkWeightnumberlogostring | booleanlogoMarkstring | booleannewsletterobjectpaddingobjectphonestringschemestringshowBrandNamebooleansocialSizenumbersocialStylestringstatusobjectwidthstringfooterColumnsobject[]Show child parameters
headingstringrequiredlinksobject[]requiredfooterDescriptionstringfooterLinksobject[]Show child parameters
hrefstringrequiredlabelstringrequiredheaderLinksobject[]Show child parameters
audiencestringborderstringborderDarkstringchildrenobject[]dividerbooleangithubRepostringhighlightbooleanhrefstringiconstringiconDarkstringiconOnlybooleaninkstringinkDarkstringkbdstringlabelstringrequiredmatchobjectpanelobjectphonestringplacementstringstylestringheaderSpaceIdsstring[]mobileNavstringnavMenuobjectShow child parameters
animationstringbackgroundstringborderstringcloseDelaynumberinkstringopenDelaynumberradiusnumbershadowstringtriggerstringwidthnumberpageMountsobject[]Show child parameters
pagestringrequiredpathstringrequiredspaceIdstringrequiredsocialLinksobject[]Show child parameters
hrefstringrequiredplatformstringrequiredtabsSiteTab[]Show child parameters
slugstringrequiredspaceIdsstring[]requiredtitlestringrequiredtaglinestringthemeobjectthemeToggleobjectShow child parameters
activeColorstringborderbooleanfooterAlignstringhideOnstring[]modesstring[]phonestringpositionstringradiusnumbershowbooleanstylestringtranslationsobjectfrontPageStoredFrontPagerequiredShow child parameters
asideobjectShow child parameters
docobjectrequiredphonestringwidthstringcustomizationobjectdocobjectrequiredShow child parameters
contentobject[]requiredtypestringrequiredgapstringhideTitlebooleanpaddingBottomstring | numberpaddingTopstring | number | IndexFrameStepspresetstringsidebarobjectShow child parameters
dividerobjectdocobjectrequiredgapstring | numberphonestring | objectpositionstringrequiredsourcestringstartAfternumberwidthstringwidthnumber | stringnamestringrequiredorgSlugstringrequiredpreviewingstringsectionsSiteSectionTree[]requiredShow child parameters
collectionsSiteCollectionTree[]requiredShow child parameters
idstringrequiredisDefaultbooleanrequirednamestringrequiredpagesPageNode[]requiredslugstringrequiredspaceIdstringrequiredspaceNamestringrequiredslugstringrequiredspacesSiteSpaceRef[]requiredShow child parameters
addressesobject[]Show child parameters
basePathstringrequiredhostnamestringrequiredaiIngestionbooleanrequiredindexablebooleanrequiredlocalesstring[]localeUrlStylestringnamestringrequiredslugstringrequiredspaceIdstringrequiredtranslationsobjecttypestringrequiredupdatedAtstringtabsSiteTabView[]requiredShow child parameters
sectionsSiteSectionTree[]requiredShow child parameters
collectionsSiteCollectionTree[]requiredspaceIdstringrequiredspaceNamestringrequiredslugstringrequiredtitlestringrequiredthemeComponentsReaderThemeComponent[]Show child parameters
cssstringrequiredidstringrequiredoutletsobjectrequiredShow child parameters
above-mainbelow-mainblog-index-above-listblog-post-afterblog-post-beforeblog-post-endcareers-above-listcategory-headerchangelog-above-listcourses-above-listcourses-certificate-footercourses-landing-hero-aftercourses-lesson-above-bodycourses-lesson-after-bodydocs-page-footerdocs-page-headerdocs-sidebar-end400 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