Update case status, resolution, assignee, or read state
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,
"resolution": "dismissed",
"assignee": "compliance@example.com"
}
'import requests
url = "https://api.range.org/v2/cases/{id}"
payload = {
"read": True,
"resolution": "dismissed",
"assignee": "compliance@example.com"
}
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, resolution: 'dismissed', assignee: 'compliance@example.com'})
};
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,
'resolution' => 'dismissed',
'assignee' => 'compliance@example.com'
]),
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 \"resolution\": \"dismissed\",\n \"assignee\": \"compliance@example.com\"\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 \"resolution\": \"dismissed\",\n \"assignee\": \"compliance@example.com\"\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 \"resolution\": \"dismissed\",\n \"assignee\": \"compliance@example.com\"\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,
"available_actions": [
{
"id": "set_status",
"label": "<string>",
"kind": "select",
"options": [
"open"
]
}
],
"comments": [
{
"id": "<string>",
"author": "analyst@range.org",
"body": "<string>",
"created_at": "<string>"
}
],
"resolution": "dismissed",
"source_id": "<string>",
"assignee": "<string>",
"created_by": "<string>",
"resolved_at": "<string>",
"evidence_summary": {}
}Cases
Update case status, resolution, assignee, or read state
PATCH
/
v2
/
cases
/
{id}
Update case status, resolution, assignee, or read state
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,
"resolution": "dismissed",
"assignee": "compliance@example.com"
}
'import requests
url = "https://api.range.org/v2/cases/{id}"
payload = {
"read": True,
"resolution": "dismissed",
"assignee": "compliance@example.com"
}
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, resolution: 'dismissed', assignee: 'compliance@example.com'})
};
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,
'resolution' => 'dismissed',
'assignee' => 'compliance@example.com'
]),
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 \"resolution\": \"dismissed\",\n \"assignee\": \"compliance@example.com\"\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 \"resolution\": \"dismissed\",\n \"assignee\": \"compliance@example.com\"\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 \"resolution\": \"dismissed\",\n \"assignee\": \"compliance@example.com\"\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,
"available_actions": [
{
"id": "set_status",
"label": "<string>",
"kind": "select",
"options": [
"open"
]
}
],
"comments": [
{
"id": "<string>",
"author": "analyst@range.org",
"body": "<string>",
"created_at": "<string>"
}
],
"resolution": "dismissed",
"source_id": "<string>",
"assignee": "<string>",
"created_by": "<string>",
"resolved_at": "<string>",
"evidence_summary": {}
}Authorizations
AuthorizationAuthorization
Authorization method required to allow user to access the api endpoints.
Path Parameters
The case id (uuid).
Body
application/json
Mark this case read or unread for the caller only, without a timeline entry. Session-only; API-key callers receive 403.
Available options:
open, in_review, resolved Only "dismissed" is settable here — "escalated" is only set via POST /escalate.
Available options:
dismissed Example:
"compliance@example.com"
Response
Available options:
open, in_review, resolved Available options:
severe, high, medium, low Available options:
risk_screen, sanctions_screen, alert_event, manual, regulatory_filing, tie_out_break, corridor_discrepancy, redemption Show child attributes
Show child attributes
In list responses, whether this case is read for the caller.
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
Available options:
dismissed, escalated, paid What the case was opened on. A redemption case carries redemption_id, burn_time and deadline, linking it to GET /v2/redemptions/{id}.
Last modified on October 7, 2026
Was this page helpful?