curl --request PATCH \
--url https://api.range.org/v2/cases/{id} \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"read": true,
"assignee": "compliance@example.com",
"note": "Known desk; verified with the client."
}
'import requests
url = "https://api.range.org/v2/cases/{id}"
payload = {
"read": True,
"assignee": "compliance@example.com",
"note": "Known desk; verified with the client."
}
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
read: true,
assignee: 'compliance@example.com',
note: 'Known desk; verified with the client.'
})
};
fetch('https://api.range.org/v2/cases/{id}', 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.range.org/v2/cases/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'read' => true,
'assignee' => 'compliance@example.com',
'note' => 'Known desk; verified with the client.'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);
$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.range.org/v2/cases/{id}"
payload := strings.NewReader("{\n \"read\": true,\n \"assignee\": \"compliance@example.com\",\n \"note\": \"Known desk; verified with the client.\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
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.patch("https://api.range.org/v2/cases/{id}")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"read\": true,\n \"assignee\": \"compliance@example.com\",\n \"note\": \"Known desk; verified with the client.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.range.org/v2/cases/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"read\": true,\n \"assignee\": \"compliance@example.com\",\n \"note\": \"Known desk; verified with the client.\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"workspace_id": "<string>",
"title": "<string>",
"status": "open",
"severity": "severe",
"source_type": "risk_screen",
"subject": {
"type": "address",
"address": "0x742d35Cc6634C0532925a3b844Bc9e7595f2bD28",
"network": "ethereum",
"tx_hash": "0xabc...",
"name": "<string>"
},
"created_at": "<string>",
"updated_at": "<string>",
"viewed": true,
"autopilot_status": "queued",
"autopilot_recommendation": "escalate",
"available_actions": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"label": "<string>",
"kind": "select",
"options": [
"open"
],
"requires_note": true
}
],
"comments": [
{
"id": "<string>",
"author": "analyst@range.org",
"body": "<string>",
"created_at": "<string>"
}
],
"autopilot": {
"run_id": "<string>",
"status": "queued",
"runs_count": 123,
"recommendation": "escalate",
"confidence": "low",
"headline": "<string>",
"report": {},
"started_at": "<string>",
"completed_at": "<string>"
},
"resolution": "dismissed",
"source_id": "<string>",
"client_entity_id": "550e8400-e29b-41d4-a716-446655440000",
"assignee": "<string>",
"created_by": "<string>",
"resolved_at": "<string>",
"counterparty_deleted": true,
"evidence_summary": {}
}Update a case
Update a case and return its current details.
curl --request PATCH \
--url https://api.range.org/v2/cases/{id} \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"read": true,
"assignee": "compliance@example.com",
"note": "Known desk; verified with the client."
}
'import requests
url = "https://api.range.org/v2/cases/{id}"
payload = {
"read": True,
"assignee": "compliance@example.com",
"note": "Known desk; verified with the client."
}
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
read: true,
assignee: 'compliance@example.com',
note: 'Known desk; verified with the client.'
})
};
fetch('https://api.range.org/v2/cases/{id}', 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.range.org/v2/cases/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'read' => true,
'assignee' => 'compliance@example.com',
'note' => 'Known desk; verified with the client.'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);
$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.range.org/v2/cases/{id}"
payload := strings.NewReader("{\n \"read\": true,\n \"assignee\": \"compliance@example.com\",\n \"note\": \"Known desk; verified with the client.\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
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.patch("https://api.range.org/v2/cases/{id}")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"read\": true,\n \"assignee\": \"compliance@example.com\",\n \"note\": \"Known desk; verified with the client.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.range.org/v2/cases/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"read\": true,\n \"assignee\": \"compliance@example.com\",\n \"note\": \"Known desk; verified with the client.\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"workspace_id": "<string>",
"title": "<string>",
"status": "open",
"severity": "severe",
"source_type": "risk_screen",
"subject": {
"type": "address",
"address": "0x742d35Cc6634C0532925a3b844Bc9e7595f2bD28",
"network": "ethereum",
"tx_hash": "0xabc...",
"name": "<string>"
},
"created_at": "<string>",
"updated_at": "<string>",
"viewed": true,
"autopilot_status": "queued",
"autopilot_recommendation": "escalate",
"available_actions": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"label": "<string>",
"kind": "select",
"options": [
"open"
],
"requires_note": true
}
],
"comments": [
{
"id": "<string>",
"author": "analyst@range.org",
"body": "<string>",
"created_at": "<string>"
}
],
"autopilot": {
"run_id": "<string>",
"status": "queued",
"runs_count": 123,
"recommendation": "escalate",
"confidence": "low",
"headline": "<string>",
"report": {},
"started_at": "<string>",
"completed_at": "<string>"
},
"resolution": "dismissed",
"source_id": "<string>",
"client_entity_id": "550e8400-e29b-41d4-a716-446655440000",
"assignee": "<string>",
"created_by": "<string>",
"resolved_at": "<string>",
"counterparty_deleted": true,
"evidence_summary": {}
}status to in_review here. To dismiss the case, use Dismiss cases with resolution: dismissed. See Triage a manual case.Authorizations
Authorization method required to allow user to access the api endpoints.
Path Parameters
The case id (uuid).
"550e8400-e29b-41d4-a716-446655440000"
Body
Mark this case read or unread for the caller only, without a timeline entry. Session-only; API-key callers receive 403.
open, in_review, resolved Only "dismissed" is settable here, except an agreement_break case, which also accepts "explained" with a note. "escalated" is only set via POST /escalate.
dismissed, explained "compliance@example.com"
Why the status changes, recorded on the timeline. Required to dismiss a screening case (transaction_screening, counterparty_screening).
2000"Known desk; verified with the client."
Response
open, in_review, resolved severe, high, medium, low risk_screen, sanctions_screen, alert_event, manual, regulatory_filing, tie_out_break, corridor_discrepancy, agreement_break, redemption, transaction_screening, counterparty_screening Show child attributes
Show child attributes
In list responses, whether this case is read for the caller.
Status of the latest Autopilot run on this case, or null when Autopilot has not touched it.
queued, running, completed, failed, skipped Recommendation of the latest Autopilot run, or null when it has none yet.
escalate, dismiss, review Actions supported by this source and status. Existing write permissions still apply. Resolving via set_status requires resolution=dismissed.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
The latest Autopilot run on this case, or null. Its report is model output: render it as text, never as HTML.
Show child attributes
Show child attributes
dismissed, escalated, paid, explained The client entity the case concerns (screening cases).
"550e8400-e29b-41d4-a716-446655440000"
Counterparty screening cases on one counterparty address or wallet: true when that counterparty entity or wallet account has since been deleted from the register. The case stays open. Absent on other cases.
What the case was opened on. A redemption case carries redemption_id, burn_time and deadline, linking it to GET /v2/redemptions/{id}. An agreement_break case carries declared_gap ({ tape, reason }, or null): when its cause is source_missing, it can be explained only if declared_gap is set. It also carries unverified_by_custodian (boolean): true when the custodian marked the asset unverified, which is information only and never the cause (absent on cases filed before it existed).
Was this page helpful?