curl --request POST \
--url https://scribe.skeptrune.com/api/threads/{id}/messages \
--header 'Content-Type: application/json' \
--cookie scribe_session= \
--data '
{
"body": "Good catch — updated."
}
'import requests
url = "https://scribe.skeptrune.com/api/threads/{id}/messages"
payload = { "body": "Good catch — updated." }
headers = {
"cookie": "scribe_session=",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {cookie: 'scribe_session=', 'Content-Type': 'application/json'},
body: JSON.stringify({body: JSON.stringify('Good catch — updated.')})
};
fetch('https://scribe.skeptrune.com/api/threads/{id}/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://scribe.skeptrune.com/api/threads/{id}/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([
'body' => 'Good catch — updated.'
]),
CURLOPT_COOKIE => "scribe_session=",
CURLOPT_HTTPHEADER => [
"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://scribe.skeptrune.com/api/threads/{id}/messages"
payload := strings.NewReader("{\n \"body\": \"Good catch — updated.\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("cookie", "scribe_session=")
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://scribe.skeptrune.com/api/threads/{id}/messages")
.header("cookie", "scribe_session=")
.header("Content-Type", "application/json")
.body("{\n \"body\": \"Good catch — updated.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://scribe.skeptrune.com/api/threads/{id}/messages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["cookie"] = 'scribe_session='
request["Content-Type"] = 'application/json'
request.body = "{\n \"body\": \"Good catch — updated.\"\n}"
response = http.request(request)
puts response.read_body{
"id": "msg_6bCdEfGhIjKlMnOpQr7s",
"threadId": "thr_5aBcDeFgHiJkLmNoPq6r",
"authorUserId": "usr_V1StGXR8_Z5jdHi6BmyT",
"authorName": "Ada Lovelace",
"authorKind": "human",
"body": "Should this say Q3 instead of Q2?",
"createdAt": 1752624000000
}{
"error": {
"code": "not_found",
"message": "No such document."
}
}{
"error": {
"code": "not_found",
"message": "No such document."
}
}{
"error": {
"code": "not_found",
"message": "No such document."
}
}{
"error": {
"code": "not_found",
"message": "No such document."
}
}Reply to a thread
Adds a message to an existing thread. Requires comment access on the document; API keys with edit OR comment access reply as their agent identity (read-only keys are rejected).
curl --request POST \
--url https://scribe.skeptrune.com/api/threads/{id}/messages \
--header 'Content-Type: application/json' \
--cookie scribe_session= \
--data '
{
"body": "Good catch — updated."
}
'import requests
url = "https://scribe.skeptrune.com/api/threads/{id}/messages"
payload = { "body": "Good catch — updated." }
headers = {
"cookie": "scribe_session=",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {cookie: 'scribe_session=', 'Content-Type': 'application/json'},
body: JSON.stringify({body: JSON.stringify('Good catch — updated.')})
};
fetch('https://scribe.skeptrune.com/api/threads/{id}/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://scribe.skeptrune.com/api/threads/{id}/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([
'body' => 'Good catch — updated.'
]),
CURLOPT_COOKIE => "scribe_session=",
CURLOPT_HTTPHEADER => [
"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://scribe.skeptrune.com/api/threads/{id}/messages"
payload := strings.NewReader("{\n \"body\": \"Good catch — updated.\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("cookie", "scribe_session=")
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://scribe.skeptrune.com/api/threads/{id}/messages")
.header("cookie", "scribe_session=")
.header("Content-Type", "application/json")
.body("{\n \"body\": \"Good catch — updated.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://scribe.skeptrune.com/api/threads/{id}/messages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["cookie"] = 'scribe_session='
request["Content-Type"] = 'application/json'
request.body = "{\n \"body\": \"Good catch — updated.\"\n}"
response = http.request(request)
puts response.read_body{
"id": "msg_6bCdEfGhIjKlMnOpQr7s",
"threadId": "thr_5aBcDeFgHiJkLmNoPq6r",
"authorUserId": "usr_V1StGXR8_Z5jdHi6BmyT",
"authorName": "Ada Lovelace",
"authorKind": "human",
"body": "Should this say Q3 instead of Q2?",
"createdAt": 1752624000000
}{
"error": {
"code": "not_found",
"message": "No such document."
}
}{
"error": {
"code": "not_found",
"message": "No such document."
}
}{
"error": {
"code": "not_found",
"message": "No such document."
}
}{
"error": {
"code": "not_found",
"message": "No such document."
}
}Authorizations
Browser session cookie set by the WorkOS sign-in flow.
Path Parameters
Id of the thread to reply to.
Body
The message to add.
Add a message to a thread.
Markdown body of the reply.
1 - 10000"Good catch — updated."
Response
The created message.
A single message inside a thread.
Message id.
"msg_6bCdEfGhIjKlMnOpQr7s"
Thread the message belongs to.
"thr_5aBcDeFgHiJkLmNoPq6r"
User id of the author.
"usr_V1StGXR8_Z5jdHi6BmyT"
Display name of the message author — the author's name or handle (agent authors carry the name of their API key). Resolved server-side so cross-organization authors render without a members lookup. Null when the author row no longer exists.
"Ada Lovelace"
Whether the message author is a person ('human') or an API-key agent identity ('agent'). Null when the author row no longer exists.
human, agent, null "human"
Message body (markdown).
"Should this say Q3 instead of Q2?"
When the message was posted (epoch milliseconds).
1752624000000