Resolve Comment
curl --request POST \
--url https://api.velt.dev/v2/agents/checks/comments/resolve \
--header 'Content-Type: application/json' \
--header 'x-velt-api-key: <x-velt-api-key>' \
--header 'x-velt-auth-token: <x-velt-auth-token>' \
--data '
{
"data": {
"organizationId": "<string>",
"documentId": "<string>",
"annotationId": "<string>",
"by": "<string>",
"userId": "<string>",
"userName": "<string>",
"userEmail": "<string>"
}
}
'import requests
url = "https://api.velt.dev/v2/agents/checks/comments/resolve"
payload = { "data": {
"organizationId": "<string>",
"documentId": "<string>",
"annotationId": "<string>",
"by": "<string>",
"userId": "<string>",
"userName": "<string>",
"userEmail": "<string>"
} }
headers = {
"x-velt-api-key": "<x-velt-api-key>",
"x-velt-auth-token": "<x-velt-auth-token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-velt-api-key': '<x-velt-api-key>',
'x-velt-auth-token': '<x-velt-auth-token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
data: {
organizationId: '<string>',
documentId: '<string>',
annotationId: '<string>',
by: '<string>',
userId: '<string>',
userName: '<string>',
userEmail: '<string>'
}
})
};
fetch('https://api.velt.dev/v2/agents/checks/comments/resolve', 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.velt.dev/v2/agents/checks/comments/resolve",
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([
'data' => [
'organizationId' => '<string>',
'documentId' => '<string>',
'annotationId' => '<string>',
'by' => '<string>',
'userId' => '<string>',
'userName' => '<string>',
'userEmail' => '<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-velt-api-key: <x-velt-api-key>",
"x-velt-auth-token: <x-velt-auth-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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.velt.dev/v2/agents/checks/comments/resolve"
payload := strings.NewReader("{\n \"data\": {\n \"organizationId\": \"<string>\",\n \"documentId\": \"<string>\",\n \"annotationId\": \"<string>\",\n \"by\": \"<string>\",\n \"userId\": \"<string>\",\n \"userName\": \"<string>\",\n \"userEmail\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-velt-api-key", "<x-velt-api-key>")
req.Header.Add("x-velt-auth-token", "<x-velt-auth-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.velt.dev/v2/agents/checks/comments/resolve")
.header("x-velt-api-key", "<x-velt-api-key>")
.header("x-velt-auth-token", "<x-velt-auth-token>")
.header("Content-Type", "application/json")
.body("{\n \"data\": {\n \"organizationId\": \"<string>\",\n \"documentId\": \"<string>\",\n \"annotationId\": \"<string>\",\n \"by\": \"<string>\",\n \"userId\": \"<string>\",\n \"userName\": \"<string>\",\n \"userEmail\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.velt.dev/v2/agents/checks/comments/resolve")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-velt-api-key"] = '<x-velt-api-key>'
request["x-velt-auth-token"] = '<x-velt-auth-token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"data\": {\n \"organizationId\": \"<string>\",\n \"documentId\": \"<string>\",\n \"annotationId\": \"<string>\",\n \"by\": \"<string>\",\n \"userId\": \"<string>\",\n \"userName\": \"<string>\",\n \"userEmail\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"result": {
"status": "success",
"message": "Comment resolved",
"data": {
"rescanExecutionId": null,
"queued": true,
"alreadyPending": false
}
}
}
Checks
Resolve Comment
POST
/
v2
/
agents
/
checks
/
comments
/
resolve
Resolve Comment
curl --request POST \
--url https://api.velt.dev/v2/agents/checks/comments/resolve \
--header 'Content-Type: application/json' \
--header 'x-velt-api-key: <x-velt-api-key>' \
--header 'x-velt-auth-token: <x-velt-auth-token>' \
--data '
{
"data": {
"organizationId": "<string>",
"documentId": "<string>",
"annotationId": "<string>",
"by": "<string>",
"userId": "<string>",
"userName": "<string>",
"userEmail": "<string>"
}
}
'import requests
url = "https://api.velt.dev/v2/agents/checks/comments/resolve"
payload = { "data": {
"organizationId": "<string>",
"documentId": "<string>",
"annotationId": "<string>",
"by": "<string>",
"userId": "<string>",
"userName": "<string>",
"userEmail": "<string>"
} }
headers = {
"x-velt-api-key": "<x-velt-api-key>",
"x-velt-auth-token": "<x-velt-auth-token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-velt-api-key': '<x-velt-api-key>',
'x-velt-auth-token': '<x-velt-auth-token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
data: {
organizationId: '<string>',
documentId: '<string>',
annotationId: '<string>',
by: '<string>',
userId: '<string>',
userName: '<string>',
userEmail: '<string>'
}
})
};
fetch('https://api.velt.dev/v2/agents/checks/comments/resolve', 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.velt.dev/v2/agents/checks/comments/resolve",
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([
'data' => [
'organizationId' => '<string>',
'documentId' => '<string>',
'annotationId' => '<string>',
'by' => '<string>',
'userId' => '<string>',
'userName' => '<string>',
'userEmail' => '<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-velt-api-key: <x-velt-api-key>",
"x-velt-auth-token: <x-velt-auth-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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.velt.dev/v2/agents/checks/comments/resolve"
payload := strings.NewReader("{\n \"data\": {\n \"organizationId\": \"<string>\",\n \"documentId\": \"<string>\",\n \"annotationId\": \"<string>\",\n \"by\": \"<string>\",\n \"userId\": \"<string>\",\n \"userName\": \"<string>\",\n \"userEmail\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-velt-api-key", "<x-velt-api-key>")
req.Header.Add("x-velt-auth-token", "<x-velt-auth-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.velt.dev/v2/agents/checks/comments/resolve")
.header("x-velt-api-key", "<x-velt-api-key>")
.header("x-velt-auth-token", "<x-velt-auth-token>")
.header("Content-Type", "application/json")
.body("{\n \"data\": {\n \"organizationId\": \"<string>\",\n \"documentId\": \"<string>\",\n \"annotationId\": \"<string>\",\n \"by\": \"<string>\",\n \"userId\": \"<string>\",\n \"userName\": \"<string>\",\n \"userEmail\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.velt.dev/v2/agents/checks/comments/resolve")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-velt-api-key"] = '<x-velt-api-key>'
request["x-velt-auth-token"] = '<x-velt-auth-token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"data\": {\n \"organizationId\": \"<string>\",\n \"documentId\": \"<string>\",\n \"annotationId\": \"<string>\",\n \"by\": \"<string>\",\n \"userId\": \"<string>\",\n \"userName\": \"<string>\",\n \"userEmail\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"result": {
"status": "success",
"message": "Comment resolved",
"data": {
"rescanExecutionId": null,
"queued": true,
"alreadyPending": false
}
}
}
Use this API to resolve one comment of a check, for a person (
The schema uses
All three are
Errors:
by: "user") or an MCP client (by: "mcp"). The comment becomes Resolved and waits for the scan that verifies it (pendingVerify: true). Only a scan verifies: see Statuses.
The resolve starts a verify rescan, which uses AI credits at the flat rescan rate. Resolves on one project within 15 seconds share one rescan per agent, so a fresh resolve answers queued: true with no run id yet.
Resolve is idempotent. Resolving a comment that already waits for its rescan answers alreadyPending: true, starts nothing and charges nothing. A comment a scan already verified is refused: reopen it first.
A rejected comment takes the Resolved status and nothing else: no verify rescan, no charge, no pendingVerify. It answers { rescanExecutionId: null, queued: false, alreadyPending: false } and stays rejected (statusKind: "rejected"), so it still counts nowhere.
The comment can be an agent comment, or a person’s comment attached to a check. An agent comment written before the checks engine, with no check, is Resolved and its agent scans its page once, charged like any one-page scan. A person’s comment that is not attached to a check is refused.
Endpoint
POST https://api.velt.dev/v2/agents/checks/comments/resolve
Headers
string
required
Your API key.
string
required
Your Auth Token.
Body
Params
object
required
Show properties
Show properties
string
required
1 to 512 characters. The organization of the project.
string
required
1 to 512 characters. The document of the project.
string
required
The comment annotation id. 1 to 512 characters, no
/, and not . or ...string
required
Who resolves:
"user" (a person) or "mcp" (an MCP client). Any other value is rejected.string
required
1 to 512 characters. Recorded as the person who resolved the comment.
string
At most 512 characters. The person’s name, for the verify rescan’s run.
string
At most 512 characters. The person’s email, for the verify rescan’s run.
.strict(): unknown fields are rejected.
Example Requests
{
"data": {
"organizationId": "org_acme",
"documentId": "acme-marketing-site",
"annotationId": "K7mQ2xR9vB4wLdT1sYpN",
"by": "user",
"userId": "user_jordan",
"userName": "Jordan Lee",
"userEmail": "jordan@example.com"
}
}
Response
Success Response (fresh resolve)
{
"result": {
"status": "success",
"message": "Comment resolved",
"data": {
"rescanExecutionId": null,
"queued": true,
"alreadyPending": false
}
}
}
Success Response (already waiting)
{
"result": {
"status": "success",
"message": "Comment resolved",
"data": {
"rescanExecutionId": "exec_4Wq7Zx2Np8",
"queued": false,
"alreadyPending": true
}
}
}
| Field | Type | Description |
|---|---|---|
data.rescanExecutionId | string | null | The verify rescan’s execution id, once it has started. null while the resolve waits in its 15-second window. |
data.queued | boolean | true when the comment waits for a rescan that has no run id yet. |
data.alreadyPending | boolean | true when the comment already waited for its rescan: nothing new started. |
false / null when no verify rescan is involved: the workspace has no store database, the comment has no check, or the rescan could not be queued (the next scan of the comment’s pages then verifies or reopens it).
Failure Response
{
"error": {
"message": "This comment was already verified by a scan",
"status": "FAILED_PRECONDITION",
"details": {
"reason": "CHECKS_ALREADY_VERIFIED"
}
}
}
INVALID_ARGUMENTfor a body outside the schema: a missingannotationId,byoruserId, abyother than"user"or"mcp", or an unknown field;NOT_FOUNDwithCHECKS_COMMENT_NOT_FOUND(no such comment in the project);FAILED_PRECONDITIONwithCHECKS_ALREADY_VERIFIED(a scan already verified the comment: reopen it first) orCHECKS_NOT_AGENT_COMMENT(a person’s comment not attached to a check).
{
"result": {
"status": "success",
"message": "Comment resolved",
"data": {
"rescanExecutionId": null,
"queued": true,
"alreadyPending": false
}
}
}
Was this page helpful?

