Get the space type

Embed
Preview of the card
<a href="https://forumulate.com/reference/forumulate-api-spacetypes-one"><img src="https://forumulate.com/reference/_api/public/orgs/046a9bc0-d530-43ae-9bae-af7945008cda/spaces/8042f004-e3d9-445f-b7a4-b6c1f86836e6/pages/0ab15e7a-1fca-4d86-abd8-6724f325f3cf/social-card.svg?v=3e7ae33eec8b" alt="Get the space type" width="600" height="315"></a>
GEThttps://forumulate.com/api/space-types/{type}
Parameters
typestringpathrequired
forumulate-versionstringheader
API version negotiation. Send forumulate-version: 2026-12-01 on every request from a new integration; it is optional only so that integrations written before versioning keep working. Each version includes everything before it:
Code samples
cURL
curl -X GET "https://forumulate.com/api/space-types/{type}" \
  -H "forumulate-version: <value>"
TypeScript
const res = await fetch('https://forumulate.com/api/space-types/{type}', {
  method: 'GET',
  headers: {
    'forumulate-version': '<value>',
  },
});
const data = await res.json();
Python
import requests

res = requests.request(
    "GET",
    "https://forumulate.com/api/space-types/{type}",
    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/space-types/{type}", 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/space-types/{type}');
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/space-types/{type}')
req = Net::HTTP::Get.new(uri)
req['forumulate-version'] = '<value>'
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
  http.request(req)
end
puts res.body
Java
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://forumulate.com/api/space-types/{type}"))
    .header("forumulate-version", "<value>")
    .GET()
    .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
Responses
200 Success.
Example
{
  "spaceType": {
    "backing": "event",
    "description": "string",
    "fields": [
      {
        "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"
      }
    ],
    "forcedVisibility": "PRIVATE",
    "icon": "string",
    "name": "string",
    "pageKinds": [
      {
        "description": "string",
        "key": "string",
        "label": "string",
        "piece": true
      }
    ],
    "piecePresets": [
      {
        "description": "string",
        "label": "string",
        "name": "string",
        "recommended": true
      }
    ],
    "pieceWriteCapability": "blog.author",
    "presets": [
      {
        "description": "string",
        "label": "string",
        "name": "string",
        "recommended": true
      }
    ],
    "purpose": "string",
    "readerTools": {
      "aiActions": true,
      "copyMarkdown": true,
      "mcp": true,
      "pdf": true,
      "search": true
    },
    "route": {
      "content": "string",
      "defaultSlug": "string",
      "hubs": [
        {
          "collection": null,
          "path": null
        }
      ],
      "orgIndexed": true,
      "pieceAddressed": true,
      "publicPrefix": "string",
      "rootRedirectsToFirstPiece": true
    },
    "sections": [
      {
        "example": "string",
        "hint": "string",
        "key": "string",
        "kind": "list",
        "label": "string",
        "render": "labelled",
        "required": true,
        "role": "example",
        "schemaProperty": "string"
      }
    ],
    "settings": {
      "advanced": [
        "string"
      ],
      "essential": [
        "string"
      ]
    },
    "space": {
      "index": "board",
      "nav": "categories",
      "order": "activity",
      "summary": [
        "string"
      ],
      "whoCreates": "anyone"
    },
    "tabs": [
      "acceptance"
    ],
    "type": "BLOG",
    "vocabulary": {
      "container": [
        "string"
      ],
      "empty": {
        "hint": "string",
        "title": "string"
      },
      "piece": [
        "string"
      ],
      "primaryAction": "string"
    }
  }
}
Schema
spaceTypeobjectrequired
Show child parameters
backingstringrequired
event | incident | page | topic
descriptionstringrequired
fieldsSpaceTypeField[]
Show child parameters
acceptstring[]
adminobject
allowedstring[]
allowedBlocksstring[]
allowedGroupsstring[]
columnboolean
conditionstring | number | boolean | string | number | boolean | object[] | object[] | object
defaultobject
exprstring | number | boolean | string | number | boolean | object[] | object[] | object
facetboolean
fieldsSpaceTypeField[]
fromstring
hasManyboolean
hintstring
indexedboolean
internalboolean
keystringrequired
labelstringrequired
languagestring
localizedboolean
maxnumber
maxLengthnumber
metaboolean
minnumber
minLengthnumber
optionsstring[]
patternstring
placeholderstring
relationSpaceIdstring
requiredboolean
rowLabelFieldstring
schemaobject
schemaPropertystring
sortableboolean
toReferenceTarget[]
typestringrequired
array | blocks | boolean | code | color | computed | date | datetime | email | file | form | group | hours | image | json | link | media | money | multiselect | number | place | reference | relation | richText | select | seo | slug | text | textarea | url
uniqueboolean
visibilitystring
internal | preview | public
forcedVisibilitystring
PRIVATE
iconstringrequired
namestringrequired
pageKindsSpacePageKind[]
Show child parameters
descriptionstringrequired
keystringrequired
labelstringrequired
piecebooleanrequired
piecePresetsSpaceLayoutPreset[]
Show child parameters
descriptionstringrequired
labelstringrequired
namestringrequired
recommendedboolean
pieceWriteCapabilitystringrequired
blog.author | blog.publish | blog.read | community.manage_standing | content.keys | content.model | content.read | courses.manage | docs.publish | docs.read | docs.write | email.manage | forms.manage | forms.read | forum.moderate | forum.post | forum.read | forum.vote | org.delete | org.impersonate | org.manage_billing | org.manage_integrations | org.manage_members | org.manage_roles | org.manage_settings | org.manage_sso | org.manage_webhooks | org.read | org.run_queries | org.transfer_ownership | org.update | org.view_audit | space.create | space.delete | space.read | space.update | themes.manage
presetsSpaceLayoutPreset[]required
Show child parameters
descriptionstringrequired
labelstringrequired
namestringrequired
recommendedboolean
purposestringrequired
readerToolsobject
Show child parameters
aiActionsboolean
copyMarkdownboolean
mcpboolean
pdfboolean
searchboolean
routeobjectrequired
Show child parameters
contentstringrequired
defaultSlugstringrequired
hubsSpaceHubRoute[]
orgIndexedboolean
pieceAddressedboolean
publicPrefixstring
rootRedirectsToFirstPieceboolean
sectionsSpaceTypeSection[]
Show child parameters
examplestring
hintstring
keystringrequired
kindstringrequired
list | prose | steps | table
labelstringrequired
renderstring
labelled | lede | plain
requiredboolean
rolestring
example | prerequisite | reference | resolution | summary | symptom
schemaPropertystring
settingsobjectrequired
Show child parameters
advancedstring[]required
essentialstring[]required
spaceobjectrequired
Show child parameters
indexstringrequired
board | landing | list | single
navstringrequired
categories | none | sections | tags | tree
orderstringrequired
activity | chronological | manual | status | votes
summarystring[]required
whoCreatesstringrequired
anyone | members | staff
tabsstring[]required
typestringrequired
BLOG | CAREERS | CHANGELOG | CONTACT | CONTENT | COURSES | CUSTOM | DOCS | EVENTS | FAQ | FORUM | LEGAL | ROADMAP | STATUS
vocabularyobjectrequired
Show child parameters
containerstring[]
emptyobjectrequired
piecestring[]required
primaryActionstringrequired
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.
Example
{
  "error": {
    "code": "string",
    "message": "string",
    "details": {},
    "docs": "string",
    "reason": "string",
    "slugs": [
      "string"
    ],
    "conflict": {
      "etag": "string",
      "ops": [
        null
      ]
    }
  },
  "requestId": "string"
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable error code, e.g. rbac.forbidden.
messagestringrequired
Human-readable explanation.
detailsobject
Field-level validation problems, keyed by field path (422 only).
docsstring
Where the vocabulary or format this error is about is published — an absolute URL, or an API route such as GET /space-types/{type}/presets. Present on errors over a controlled list, so the answer to "what am I allowed to send?" is in the error itself.
reasonstring
Why a credential was refused, as one stable word, where one status has several causes — e.g. an external_jwt redeem answers iat_too_old, iat_in_future, bad_signature, bad_issuer, bad_audience, expired and more. Branch on this, not on message.
slugsstring[]
The exact slugs that collided, on a slug-conflict 409 — space.slug_taken, page.slug_taken, collection.slug_taken, site.slug_taken or badge.slug_taken.
conflictobject
On a 409 from a content entry field write (PATCH …/entries/{entryId}/fields) whose If-Match was stale.
Show child parameters
etagstringrequired
The entry's current fields etag.
opsarrayrequired
The field operations since your If-Match that touch a path your own operations touch. Empty: none did — retry the batch unchanged under etag. null: the history no longer reaches your tag — re-read the entry first.
requestIdstring
The id of this request — the same value as the x-request-id and x-forumulate-request-id response headers. Quote it in a bug report: it is the only thing that finds your exact request in our logs. It is in the body because that is the part that survives — an SDK that throws the parsed body, a serverless log that keeps the body and drops the headers, a ticket with the JSON pasted in.
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).
Example
{
  "error": {
    "code": "string",
    "message": "string",
    "details": {},
    "docs": "string",
    "reason": "string",
    "slugs": [
      "string"
    ],
    "conflict": {
      "etag": "string",
      "ops": [
        null
      ]
    }
  },
  "requestId": "string"
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable error code, e.g. rbac.forbidden.
messagestringrequired
Human-readable explanation.
detailsobject
Field-level validation problems, keyed by field path (422 only).
docsstring
Where the vocabulary or format this error is about is published — an absolute URL, or an API route such as GET /space-types/{type}/presets. Present on errors over a controlled list, so the answer to "what am I allowed to send?" is in the error itself.
reasonstring
Why a credential was refused, as one stable word, where one status has several causes — e.g. an external_jwt redeem answers iat_too_old, iat_in_future, bad_signature, bad_issuer, bad_audience, expired and more. Branch on this, not on message.
slugsstring[]
The exact slugs that collided, on a slug-conflict 409 — space.slug_taken, page.slug_taken, collection.slug_taken, site.slug_taken or badge.slug_taken.
conflictobject
On a 409 from a content entry field write (PATCH …/entries/{entryId}/fields) whose If-Match was stale.
Show child parameters
etagstringrequired
The entry's current fields etag.
opsarrayrequired
The field operations since your If-Match that touch a path your own operations touch. Empty: none did — retry the batch unchanged under etag. null: the history no longer reaches your tag — re-read the entry first.
requestIdstring
The id of this request — the same value as the x-request-id and x-forumulate-request-id response headers. Quote it in a bug report: it is the only thing that finds your exact request in our logs. It is in the body because that is the part that survives — an SDK that throws the parsed body, a serverless log that keeps the body and drops the headers, a ticket with the JSON pasted in.
429 Rate limited — see the RateLimit-* headers.
Example
{
  "error": {
    "code": "string",
    "message": "string",
    "details": {},
    "docs": "string",
    "reason": "string",
    "slugs": [
      "string"
    ],
    "conflict": {
      "etag": "string",
      "ops": [
        null
      ]
    }
  },
  "requestId": "string"
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable error code, e.g. rbac.forbidden.
messagestringrequired
Human-readable explanation.
detailsobject
Field-level validation problems, keyed by field path (422 only).
docsstring
Where the vocabulary or format this error is about is published — an absolute URL, or an API route such as GET /space-types/{type}/presets. Present on errors over a controlled list, so the answer to "what am I allowed to send?" is in the error itself.
reasonstring
Why a credential was refused, as one stable word, where one status has several causes — e.g. an external_jwt redeem answers iat_too_old, iat_in_future, bad_signature, bad_issuer, bad_audience, expired and more. Branch on this, not on message.
slugsstring[]
The exact slugs that collided, on a slug-conflict 409 — space.slug_taken, page.slug_taken, collection.slug_taken, site.slug_taken or badge.slug_taken.
conflictobject
On a 409 from a content entry field write (PATCH …/entries/{entryId}/fields) whose If-Match was stale.
Show child parameters
etagstringrequired
The entry's current fields etag.
opsarrayrequired
The field operations since your If-Match that touch a path your own operations touch. Empty: none did — retry the batch unchanged under etag. null: the history no longer reaches your tag — re-read the entry first.
requestIdstring
The id of this request — the same value as the x-request-id and x-forumulate-request-id response headers. Quote it in a bug report: it is the only thing that finds your exact request in our logs. It is in the body because that is the part that survives — an SDK that throws the parsed body, a serverless log that keeps the body and drops the headers, a ticket with the JSON pasted in.
default Error — the stable { error: { code, message } } envelope.
Example
{
  "error": {
    "code": "string",
    "message": "string",
    "details": {},
    "docs": "string",
    "reason": "string",
    "slugs": [
      "string"
    ],
    "conflict": {
      "etag": "string",
      "ops": [
        null
      ]
    }
  },
  "requestId": "string"
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable error code, e.g. rbac.forbidden.
messagestringrequired
Human-readable explanation.
detailsobject
Field-level validation problems, keyed by field path (422 only).
docsstring
Where the vocabulary or format this error is about is published — an absolute URL, or an API route such as GET /space-types/{type}/presets. Present on errors over a controlled list, so the answer to "what am I allowed to send?" is in the error itself.
reasonstring
Why a credential was refused, as one stable word, where one status has several causes — e.g. an external_jwt redeem answers iat_too_old, iat_in_future, bad_signature, bad_issuer, bad_audience, expired and more. Branch on this, not on message.
slugsstring[]
The exact slugs that collided, on a slug-conflict 409 — space.slug_taken, page.slug_taken, collection.slug_taken, site.slug_taken or badge.slug_taken.
conflictobject
On a 409 from a content entry field write (PATCH …/entries/{entryId}/fields) whose If-Match was stale.
Show child parameters
etagstringrequired
The entry's current fields etag.
opsarrayrequired
The field operations since your If-Match that touch a path your own operations touch. Empty: none did — retry the batch unchanged under etag. null: the history no longer reaches your tag — re-read the entry first.
requestIdstring
The id of this request — the same value as the x-request-id and x-forumulate-request-id response headers. Quote it in a bug report: it is the only thing that finds your exact request in our logs. It is in the body because that is the part that survives — an SDK that throws the parsed body, a serverless log that keeps the body and drops the headers, a ticket with the JSON pasted in.
The Forumulate teamUpdated