curl --request GET \
--url https://scienter.xyz/api/v1/wallet/{address}/ofac \
--header 'Authorization: Bearer <token>'import requests
url = "https://scienter.xyz/api/v1/wallet/{address}/ofac"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://scienter.xyz/api/v1/wallet/{address}/ofac', 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://scienter.xyz/api/v1/wallet/{address}/ofac",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <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"
"net/http"
"io"
)
func main() {
url := "https://scienter.xyz/api/v1/wallet/{address}/ofac"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://scienter.xyz/api/v1/wallet/{address}/ofac")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://scienter.xyz/api/v1/wallet/{address}/ofac")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"state": "ok",
"subject": "<string>",
"sources": [
{
"name": "scienter:intelligence",
"url": "<string>",
"as_of": 123
}
],
"as_of": 123,
"data": {
"address": "<string>",
"sanctioned": true,
"matches": [
{}
],
"list": {
"name": "OFAC SDN",
"published": "<string>",
"addresses": 123,
"source": "<string>"
},
"proximity_checked": true,
"proximity": {
"checked": true,
"reason": "<string>",
"found": true,
"hops": 123,
"path": [
"<string>"
],
"entity": "<string>",
"program": "<string>",
"listed_address": "<string>",
"hops_examined": 123,
"nodes_examined": 123,
"frontier_exhausted": true,
"node_budget_hit": true,
"provenance": "warehouse",
"is_screen": true
},
"caveat": "<string>"
},
"reason": "<string>"
}{
"error": "<string>"
}{
"error": "<string>",
"reason": "no_credential",
"entitlements_durable": true
}{
"error": "<string>"
}Sanctions: direct match and proximity
Two separate claims in one payload, and they must not be folded together.
sanctioned is a direct match of the address itself against the published OFAC SDN list, committed with its publication date and size. false means the whole list was searched and this address is not on it: a real, citable finding, and not a sanctions clearance (SDN only, direct match only, as published on a date).
proximity is the engine’s walk of the address’s transfer history, up to two hops, looking for a designated address. It only counts when proximity_checked is true, which requires real chain history (the transfer warehouse or a live provider read); a simulated or absent history is reported with a reason and never as clear. Being two hops from a listed address is a fact about the graph, not a designation.
curl --request GET \
--url https://scienter.xyz/api/v1/wallet/{address}/ofac \
--header 'Authorization: Bearer <token>'import requests
url = "https://scienter.xyz/api/v1/wallet/{address}/ofac"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://scienter.xyz/api/v1/wallet/{address}/ofac', 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://scienter.xyz/api/v1/wallet/{address}/ofac",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <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"
"net/http"
"io"
)
func main() {
url := "https://scienter.xyz/api/v1/wallet/{address}/ofac"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://scienter.xyz/api/v1/wallet/{address}/ofac")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://scienter.xyz/api/v1/wallet/{address}/ofac")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"state": "ok",
"subject": "<string>",
"sources": [
{
"name": "scienter:intelligence",
"url": "<string>",
"as_of": 123
}
],
"as_of": 123,
"data": {
"address": "<string>",
"sanctioned": true,
"matches": [
{}
],
"list": {
"name": "OFAC SDN",
"published": "<string>",
"addresses": 123,
"source": "<string>"
},
"proximity_checked": true,
"proximity": {
"checked": true,
"reason": "<string>",
"found": true,
"hops": 123,
"path": [
"<string>"
],
"entity": "<string>",
"program": "<string>",
"listed_address": "<string>",
"hops_examined": 123,
"nodes_examined": 123,
"frontier_exhausted": true,
"node_budget_hit": true,
"provenance": "warehouse",
"is_screen": true
},
"caveat": "<string>"
},
"reason": "<string>"
}{
"error": "<string>"
}{
"error": "<string>",
"reason": "no_credential",
"entitlements_durable": true
}{
"error": "<string>"
}Authorizations
An sc_ key from https://scienter.xyz/settings/api, sent as Authorization: Bearer sc_.... The same key is accepted in the x-scienter-membership header. Prefer the header over any query form: a credential in a URL reaches access logs, proxies and browser history.
Path Parameters
An EVM (0x, 40 hex) or Solana (base58) address. EVM addresses are lower-cased on the way in; base58 keeps its case.
Response
ok with the screen, or not_deployed when the list extract could not be read (nothing was checked).
The four-state envelope. state: ok carries data as described; the three absences carry data: null and reason. See the Absent schema.