curl --request GET \
--url https://api.lithoblocks.com/v1/templates/block-schema \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.lithoblocks.com/v1/templates/block-schema"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.lithoblocks.com/v1/templates/block-schema', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.lithoblocks.com/v1/templates/block-schema",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.lithoblocks.com/v1/templates/block-schema"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.lithoblocks.com/v1/templates/block-schema")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.lithoblocks.com/v1/templates/block-schema")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"block_types": [
{
"type": "<string>",
"description": "<string>"
}
],
"directives": {
"types": [
"<string>"
],
"if_operators": [
"<string>"
],
"notes": [
"<string>"
]
},
"placeholders": {
"value": "<string>",
"loop_item": "<string>",
"loop_index": "<string>",
"notes": [
"<string>"
]
},
"limits": {},
"ids": {
"block_id": "<string>",
"action_id": "<string>"
},
"interactivity": {
"summary": "<string>",
"action_config": {},
"message_update_strategies": [
"<string>"
],
"button_contexts": [
"<string>"
],
"strategies_by_context": {},
"payload_variables": [
{
"key": "<string>",
"description": "<string>",
"type": "<string>"
}
],
"limits": {
"metadata_event_payload_max_bytes": 123,
"payload_template_warn_bytes": 123
},
"notes": [
"<string>"
]
}
}{
"error": "<string>",
"code": "unauthenticated",
"request_id": "<string>",
"message": "<string>",
"details": "<string>",
"error_details": "<string>",
"success": false,
"valid": false,
"required_scopes": [
"<string>"
],
"user_scopes": [
"<string>"
]
}{
"error": "<string>",
"code": "unauthenticated",
"request_id": "<string>",
"message": "<string>",
"details": "<string>",
"error_details": "<string>",
"success": false,
"valid": false,
"required_scopes": [
"<string>"
],
"user_scopes": [
"<string>"
]
}{
"error": "<string>",
"code": "unauthenticated",
"request_id": "<string>",
"message": "<string>",
"details": "<string>",
"error_details": "<string>",
"success": false,
"valid": false,
"required_scopes": [
"<string>"
],
"user_scopes": [
"<string>"
]
}What the platform accepts in a template
The block types the template engine compiles, the directive types and #if operators, the placeholder syntax, Slack’s text limits as the engine enforces them, and the interactivity contract: what a button’s action_config may say, which message-update strategies apply where, the payload variables, and the metadata size ceiling. Derived from the engine and slack-kit at build time, so it cannot drift from what compile and send do.
curl --request GET \
--url https://api.lithoblocks.com/v1/templates/block-schema \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.lithoblocks.com/v1/templates/block-schema"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.lithoblocks.com/v1/templates/block-schema', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.lithoblocks.com/v1/templates/block-schema",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.lithoblocks.com/v1/templates/block-schema"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.lithoblocks.com/v1/templates/block-schema")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.lithoblocks.com/v1/templates/block-schema")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"block_types": [
{
"type": "<string>",
"description": "<string>"
}
],
"directives": {
"types": [
"<string>"
],
"if_operators": [
"<string>"
],
"notes": [
"<string>"
]
},
"placeholders": {
"value": "<string>",
"loop_item": "<string>",
"loop_index": "<string>",
"notes": [
"<string>"
]
},
"limits": {},
"ids": {
"block_id": "<string>",
"action_id": "<string>"
},
"interactivity": {
"summary": "<string>",
"action_config": {},
"message_update_strategies": [
"<string>"
],
"button_contexts": [
"<string>"
],
"strategies_by_context": {},
"payload_variables": [
{
"key": "<string>",
"description": "<string>",
"type": "<string>"
}
],
"limits": {
"metadata_event_payload_max_bytes": 123,
"payload_template_warn_bytes": 123
},
"notes": [
"<string>"
]
}
}{
"error": "<string>",
"code": "unauthenticated",
"request_id": "<string>",
"message": "<string>",
"details": "<string>",
"error_details": "<string>",
"success": false,
"valid": false,
"required_scopes": [
"<string>"
],
"user_scopes": [
"<string>"
]
}{
"error": "<string>",
"code": "unauthenticated",
"request_id": "<string>",
"message": "<string>",
"details": "<string>",
"error_details": "<string>",
"success": false,
"valid": false,
"required_scopes": [
"<string>"
],
"user_scopes": [
"<string>"
]
}{
"error": "<string>",
"code": "unauthenticated",
"request_id": "<string>",
"message": "<string>",
"details": "<string>",
"error_details": "<string>",
"success": false,
"valid": false,
"required_scopes": [
"<string>"
],
"user_scopes": [
"<string>"
]
}Authorizations
LithoBlocks API key obtained from your organization dashboard. The LithoBlocks MCP server also presents a Supabase-issued user session token here on the user's behalf; such a token acts as that user with the scopes their organization role allows.
Response
Block schema
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Character and count limits, snake_case, as the engine enforces them
Show child attributes
Show child attributes
Show child attributes
Show child attributes
What a button's action_config may say, where each message-update strategy applies, the payload variables, and the metadata size ceiling
Show child attributes
Show child attributes

