curl --request POST \
--url https://api.lithoblocks.com/v1/scheduled-messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"template_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"data": {},
"destination": {
"channel_id": "<string>"
},
"schedule": {
"send_at": "2023-11-07T05:31:56Z",
"timezone": "<string>"
},
"delivery_conditions": {
"conditions": [],
"max_delay_minutes": 1
}
}
'import requests
url = "https://api.lithoblocks.com/v1/scheduled-messages"
payload = {
"template_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"data": {},
"destination": { "channel_id": "<string>" },
"schedule": {
"send_at": "2023-11-07T05:31:56Z",
"timezone": "<string>"
},
"delivery_conditions": {
"conditions": [],
"max_delay_minutes": 1
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
template_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
data: {},
destination: {channel_id: '<string>'},
schedule: {send_at: '2023-11-07T05:31:56Z', timezone: '<string>'},
delivery_conditions: {conditions: [], max_delay_minutes: 1}
})
};
fetch('https://api.lithoblocks.com/v1/scheduled-messages', 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/scheduled-messages",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'template_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'data' => [
],
'destination' => [
'channel_id' => '<string>'
],
'schedule' => [
'send_at' => '2023-11-07T05:31:56Z',
'timezone' => '<string>'
],
'delivery_conditions' => [
'conditions' => [
],
'max_delay_minutes' => 1
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.lithoblocks.com/v1/scheduled-messages"
payload := strings.NewReader("{\n \"template_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"data\": {},\n \"destination\": {\n \"channel_id\": \"<string>\"\n },\n \"schedule\": {\n \"send_at\": \"2023-11-07T05:31:56Z\",\n \"timezone\": \"<string>\"\n },\n \"delivery_conditions\": {\n \"conditions\": [],\n \"max_delay_minutes\": 1\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.lithoblocks.com/v1/scheduled-messages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"template_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"data\": {},\n \"destination\": {\n \"channel_id\": \"<string>\"\n },\n \"schedule\": {\n \"send_at\": \"2023-11-07T05:31:56Z\",\n \"timezone\": \"<string>\"\n },\n \"delivery_conditions\": {\n \"conditions\": [],\n \"max_delay_minutes\": 1\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.lithoblocks.com/v1/scheduled-messages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"template_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"data\": {},\n \"destination\": {\n \"channel_id\": \"<string>\"\n },\n \"schedule\": {\n \"send_at\": \"2023-11-07T05:31:56Z\",\n \"timezone\": \"<string>\"\n },\n \"delivery_conditions\": {\n \"conditions\": [],\n \"max_delay_minutes\": 1\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"status": "scheduled",
"template_id": "<string>",
"template_version_id": "<string>",
"queue_policy_id": "<string>",
"destination": {
"channel_id": "<string>"
},
"data": {},
"schedule": {
"send_at": "2023-11-07T05:31:56Z",
"timezone": "<string>"
},
"recurrence": {
"interval_minutes": 1,
"max_repeats": 1,
"end_at": "2023-11-07T05:31:56Z"
},
"repeat_count": 123,
"delivery_conditions": {
"conditions": [],
"max_delay_minutes": 1,
"on_miss": "send"
},
"max_delay_at": "<string>",
"source": "<string>",
"error_message": "<string>",
"created_at": "<string>",
"processed_at": "<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>"
]
}{
"error": "<string>",
"code": "unauthenticated",
"request_id": "<string>",
"message": "<string>",
"details": "<string>",
"error_details": "<string>",
"success": false,
"valid": false,
"required_scopes": [
"<string>"
],
"user_scopes": [
"<string>"
]
}{
"success": false,
"error": {
"issues": [
{
"code": "<string>",
"path": [
"<string>"
],
"message": "<string>"
}
],
"name": "<string>"
},
"message": "<string>",
"code": "validation_failed",
"request_id": "<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>"
]
}Schedule a message
Send a template, rendered with data, to one destination at schedule.send_at or the earliest moment after it that the delivery_conditions allow. recurrence repeats it. Credits are spent when each send happens, not now. Presence conditions are accepted in shape and refused with 422 until presence delivery is enabled. Send an Idempotency-Key to make retries safe.
curl --request POST \
--url https://api.lithoblocks.com/v1/scheduled-messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"template_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"data": {},
"destination": {
"channel_id": "<string>"
},
"schedule": {
"send_at": "2023-11-07T05:31:56Z",
"timezone": "<string>"
},
"delivery_conditions": {
"conditions": [],
"max_delay_minutes": 1
}
}
'import requests
url = "https://api.lithoblocks.com/v1/scheduled-messages"
payload = {
"template_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"data": {},
"destination": { "channel_id": "<string>" },
"schedule": {
"send_at": "2023-11-07T05:31:56Z",
"timezone": "<string>"
},
"delivery_conditions": {
"conditions": [],
"max_delay_minutes": 1
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
template_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
data: {},
destination: {channel_id: '<string>'},
schedule: {send_at: '2023-11-07T05:31:56Z', timezone: '<string>'},
delivery_conditions: {conditions: [], max_delay_minutes: 1}
})
};
fetch('https://api.lithoblocks.com/v1/scheduled-messages', 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/scheduled-messages",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'template_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'data' => [
],
'destination' => [
'channel_id' => '<string>'
],
'schedule' => [
'send_at' => '2023-11-07T05:31:56Z',
'timezone' => '<string>'
],
'delivery_conditions' => [
'conditions' => [
],
'max_delay_minutes' => 1
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.lithoblocks.com/v1/scheduled-messages"
payload := strings.NewReader("{\n \"template_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"data\": {},\n \"destination\": {\n \"channel_id\": \"<string>\"\n },\n \"schedule\": {\n \"send_at\": \"2023-11-07T05:31:56Z\",\n \"timezone\": \"<string>\"\n },\n \"delivery_conditions\": {\n \"conditions\": [],\n \"max_delay_minutes\": 1\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.lithoblocks.com/v1/scheduled-messages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"template_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"data\": {},\n \"destination\": {\n \"channel_id\": \"<string>\"\n },\n \"schedule\": {\n \"send_at\": \"2023-11-07T05:31:56Z\",\n \"timezone\": \"<string>\"\n },\n \"delivery_conditions\": {\n \"conditions\": [],\n \"max_delay_minutes\": 1\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.lithoblocks.com/v1/scheduled-messages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"template_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"data\": {},\n \"destination\": {\n \"channel_id\": \"<string>\"\n },\n \"schedule\": {\n \"send_at\": \"2023-11-07T05:31:56Z\",\n \"timezone\": \"<string>\"\n },\n \"delivery_conditions\": {\n \"conditions\": [],\n \"max_delay_minutes\": 1\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"status": "scheduled",
"template_id": "<string>",
"template_version_id": "<string>",
"queue_policy_id": "<string>",
"destination": {
"channel_id": "<string>"
},
"data": {},
"schedule": {
"send_at": "2023-11-07T05:31:56Z",
"timezone": "<string>"
},
"recurrence": {
"interval_minutes": 1,
"max_repeats": 1,
"end_at": "2023-11-07T05:31:56Z"
},
"repeat_count": 123,
"delivery_conditions": {
"conditions": [],
"max_delay_minutes": 1,
"on_miss": "send"
},
"max_delay_at": "<string>",
"source": "<string>",
"error_message": "<string>",
"created_at": "<string>",
"processed_at": "<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>"
]
}{
"error": "<string>",
"code": "unauthenticated",
"request_id": "<string>",
"message": "<string>",
"details": "<string>",
"error_details": "<string>",
"success": false,
"valid": false,
"required_scopes": [
"<string>"
],
"user_scopes": [
"<string>"
]
}{
"success": false,
"error": {
"issues": [
{
"code": "<string>",
"path": [
"<string>"
],
"message": "<string>"
}
],
"name": "<string>"
},
"message": "<string>",
"code": "validation_failed",
"request_id": "<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.
Headers
Any unique string (a UUID is fine). Repeating a request with the same key and body within 24 hours replays the original response with Idempotency-Replayed: true instead of running again; the same key with a different body is a 409. Incomplete and 5xx outcomes are retained for reconciliation beyond 24 hours. Applies only on the documented endpoints. Never automatically change keys to bypass an uncertain outcome.
1 - 255"3f7d2c1a-9b4e-4f0a-8c6d-2e1b5a7c9d10"
Body
The message to schedule
Values for the template's placeholders (its request_format)
Show child attributes
Show child attributes
- Option 1
- Option 2
- Option 3
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Repeat every interval_minutes from the previous send until max_repeats or end_at
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Response
Scheduled
scheduled, processing, sent, failed, cancelled, expired Set on legacy policy-driven messages only
- Option 1
- Option 2
- Option 3
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes

