curl --request POST \
--url https://scribe.skeptrune.com/api/threads/{id}/reject \
--header 'Content-Type: application/json' \
--cookie scribe_session= \
--data '
{
"clientApplied": false
}
'import requests
url = "https://scribe.skeptrune.com/api/threads/{id}/reject"
payload = { "clientApplied": False }
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({clientApplied: false})
};
fetch('https://scribe.skeptrune.com/api/threads/{id}/reject', 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}/reject",
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([
'clientApplied' => false
]),
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}/reject"
payload := strings.NewReader("{\n \"clientApplied\": false\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}/reject")
.header("cookie", "scribe_session=")
.header("Content-Type", "application/json")
.body("{\n \"clientApplied\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://scribe.skeptrune.com/api/threads/{id}/reject")
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 \"clientApplied\": false\n}"
response = http.request(request)
puts response.read_body{
"id": "thr_5aBcDeFgHiJkLmNoPq6r",
"docId": "doc_S9tUvWxYzAbCdEfGh12i",
"kind": "comment",
"anchorJson": "{\"from\":{\"type\":\"relative\",\"item\":10},\"to\":{\"type\":\"relative\",\"item\":24}}",
"quotedText": "ship in Q2",
"proposedText": null,
"sid": null,
"status": "open",
"createdBy": "usr_V1StGXR8_Z5jdHi6BmyT",
"createdByName": "Ada Lovelace",
"createdByKind": "human",
"createdAt": 1752624000000,
"updatedAt": 1752624000000,
"resolvedBy": null,
"resolvedAt": null
}{
"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."
}
}{
"error": {
"code": "not_found",
"message": "No such document."
}
}Reject a suggestion
Marks an open suggestion as rejected. Suggesting-mode suggestions (sid set) have their pending changes reverted in the document (inserted text removed, delete-marked text restored); legacy replacement suggestions leave the document untouched. The editor sets clientApplied after reverting the changes locally (keeping the reject undoable there); the server then only records the status change. Requires write access; only API keys with edit access can reject, as their agent identity (comment and read-only keys are rejected).
curl --request POST \
--url https://scribe.skeptrune.com/api/threads/{id}/reject \
--header 'Content-Type: application/json' \
--cookie scribe_session= \
--data '
{
"clientApplied": false
}
'import requests
url = "https://scribe.skeptrune.com/api/threads/{id}/reject"
payload = { "clientApplied": False }
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({clientApplied: false})
};
fetch('https://scribe.skeptrune.com/api/threads/{id}/reject', 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}/reject",
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([
'clientApplied' => false
]),
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}/reject"
payload := strings.NewReader("{\n \"clientApplied\": false\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}/reject")
.header("cookie", "scribe_session=")
.header("Content-Type", "application/json")
.body("{\n \"clientApplied\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://scribe.skeptrune.com/api/threads/{id}/reject")
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 \"clientApplied\": false\n}"
response = http.request(request)
puts response.read_body{
"id": "thr_5aBcDeFgHiJkLmNoPq6r",
"docId": "doc_S9tUvWxYzAbCdEfGh12i",
"kind": "comment",
"anchorJson": "{\"from\":{\"type\":\"relative\",\"item\":10},\"to\":{\"type\":\"relative\",\"item\":24}}",
"quotedText": "ship in Q2",
"proposedText": null,
"sid": null,
"status": "open",
"createdBy": "usr_V1StGXR8_Z5jdHi6BmyT",
"createdByName": "Ada Lovelace",
"createdByKind": "human",
"createdAt": 1752624000000,
"updatedAt": 1752624000000,
"resolvedBy": null,
"resolvedAt": null
}{
"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."
}
}{
"error": {
"code": "not_found",
"message": "No such document."
}
}Authorizations
Browser session cookie set by the WorkOS sign-in flow.
Path Parameters
Id of the suggestion thread to reject.
Body
Optional reject options; omit for the default server-side revert.
Options for resolving a suggestion. The body is optional; an empty or missing body keeps the default server-side behavior.
Set to true when the calling editor already applied the accept/reject transform to the collaborative document locally (so the edit sits in its undo history); the server then skips the document transform and only records the status change. Omit it (the default) to have the document transformed server-side — the right choice for API callers and agents.
false
Response
The rejected thread.
A comment or suggestion thread anchored to a document range.
Thread id.
"thr_5aBcDeFgHiJkLmNoPq6r"
Document the thread is anchored to.
"doc_S9tUvWxYzAbCdEfGh12i"
Kind of discussion thread.
comment, suggestion "comment"
Serialized Yjs relative positions ({from,to}) anchoring the thread.
"{\"from\":{\"type\":\"relative\",\"item\":10},\"to\":{\"type\":\"relative\",\"item\":24}}"
Text that was selected when the thread was created.
"ship in Q2"
Replacement text (legacy API-created replacement suggestions only). Accepting such a thread splices this text over the anchored range. Null for comments and suggesting-mode suggestions.
"ship in Q3"
Suggesting-mode suggestion id (editor tracked changes only): identifies the suggestion_insert/suggestion_delete mark burst in the collaborative document. Accepting/rejecting such a thread resolves those marks. Null for comments and legacy replacement suggestions.
null
Current lifecycle status of the thread.
open, resolved, accepted, rejected "open"
User id of the thread creator.
"usr_V1StGXR8_Z5jdHi6BmyT"
Display name of the thread creator — the creator's name or handle (agent creators carry the name of their API key). Null when the creator row no longer exists.
"Ada Lovelace"
Whether the thread creator is a person ('human') or an API-key agent identity ('agent'). Null when the creator row no longer exists.
human, agent, null "human"
When the thread was started (epoch milliseconds).
1752624000000
When the thread last changed (epoch milliseconds).
1752624000000
User id who resolved/accepted/rejected the thread, or null.
"usr_V1StGXR8_Z5jdHi6BmyT"
When the thread left the open state, or null.
1752624000000