curl --request POST \
--url https://app.chainpatrol.io/api/v2/asset/search \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"content": "<string>",
"assetId": 123,
"assetIds": [
123
],
"includeEnrichments": false
}
'import requests
url = "https://app.chainpatrol.io/api/v2/asset/search"
payload = {
"content": "<string>",
"assetId": 123,
"assetIds": [123],
"includeEnrichments": False
}
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({content: '<string>', assetId: 123, assetIds: [123], includeEnrichments: false})
};
fetch('https://app.chainpatrol.io/api/v2/asset/search', 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://app.chainpatrol.io/api/v2/asset/search",
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([
'content' => '<string>',
'assetId' => 123,
'assetIds' => [
123
],
'includeEnrichments' => false
]),
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://app.chainpatrol.io/api/v2/asset/search"
payload := strings.NewReader("{\n \"content\": \"<string>\",\n \"assetId\": 123,\n \"assetIds\": [\n 123\n ],\n \"includeEnrichments\": false\n}")
req, _ := http.NewRequest("POST", 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.post("https://app.chainpatrol.io/api/v2/asset/search")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"content\": \"<string>\",\n \"assetId\": 123,\n \"assetIds\": [\n 123\n ],\n \"includeEnrichments\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.chainpatrol.io/api/v2/asset/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"content\": \"<string>\",\n \"assetId\": 123,\n \"assetIds\": [\n 123\n ],\n \"includeEnrichments\": false\n}"
response = http.request(request)
puts response.read_body{
"asset": {
"id": 123,
"content": "<string>",
"type": "URL",
"status": "UNKNOWN",
"watchStatus": "ENABLED",
"livenessStatus": "UNKNOWN",
"blockedAt": "<string>",
"createdAt": "<string>",
"updatedAt": "<string>"
},
"reports": [
{
"id": 123,
"title": "<string>",
"status": "TODO",
"createdAt": "<string>"
}
],
"scans": [
{
"id": 123,
"createdAt": "<string>",
"enrichments": [
{
"id": 123,
"type": "<string>",
"source": "<string>",
"status": "PENDING",
"createdAt": "<string>",
"files": [
{
"id": 123,
"type": "SCREENSHOT",
"url": "<string>",
"fileName": "<string>",
"mimeType": "<string>",
"sizeBytes": 123,
"createdAt": "<string>"
}
],
"output": "<unknown>"
}
]
}
],
"takedown": {
"id": 123,
"status": "TODO",
"createdAt": "<string>",
"updatedAt": "<string>",
"tasks": [
{
"id": 123,
"type": "HOSTING_PROVIDER",
"status": "TODO",
"retractionStatus": "NOT_RETRACTED",
"externalId": "<string>",
"submittedAt": "<string>",
"retractedAt": "<string>",
"lastResponseAt": "<string>",
"createdAt": "<string>",
"updatedAt": "<string>",
"takedownProvider": {
"name": "<string>"
}
}
]
},
"blockedBy": [
{
"consumer": "<string>",
"name": "<string>",
"consumedAt": "<string>"
}
],
"results": [
{
"asset": {
"id": 123,
"content": "<string>",
"type": "URL",
"status": "UNKNOWN",
"watchStatus": "ENABLED",
"livenessStatus": "UNKNOWN",
"blockedAt": "<string>",
"createdAt": "<string>",
"updatedAt": "<string>"
},
"reports": [
{
"id": 123,
"title": "<string>",
"status": "TODO",
"createdAt": "<string>"
}
],
"scans": [
{
"id": 123,
"createdAt": "<string>",
"enrichments": [
{
"id": 123,
"type": "<string>",
"source": "<string>",
"status": "PENDING",
"createdAt": "<string>",
"files": [
{
"id": 123,
"type": "SCREENSHOT",
"url": "<string>",
"fileName": "<string>",
"mimeType": "<string>",
"sizeBytes": 123,
"createdAt": "<string>"
}
],
"output": "<unknown>"
}
]
}
],
"takedown": {
"id": 123,
"status": "TODO",
"createdAt": "<string>",
"updatedAt": "<string>",
"tasks": [
{
"id": 123,
"type": "HOSTING_PROVIDER",
"status": "TODO",
"retractionStatus": "NOT_RETRACTED",
"externalId": "<string>",
"submittedAt": "<string>",
"retractedAt": "<string>",
"lastResponseAt": "<string>",
"createdAt": "<string>",
"updatedAt": "<string>",
"takedownProvider": {
"name": "<string>"
}
}
]
},
"blockedBy": [
{
"consumer": "<string>",
"name": "<string>",
"consumedAt": "<string>"
}
]
}
]
}{
"code": "BAD_REQUEST",
"message": "Invalid input data",
"issues": []
}{
"code": "UNAUTHORIZED",
"message": "Authorization not provided",
"issues": []
}{
"code": "FORBIDDEN",
"message": "Insufficient access",
"issues": []
}{
"code": "INTERNAL_SERVER_ERROR",
"message": "Internal server error",
"issues": []
}Asset Search
Search for an asset by content or ID and get its status, associated reports, and takedown details
curl --request POST \
--url https://app.chainpatrol.io/api/v2/asset/search \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"content": "<string>",
"assetId": 123,
"assetIds": [
123
],
"includeEnrichments": false
}
'import requests
url = "https://app.chainpatrol.io/api/v2/asset/search"
payload = {
"content": "<string>",
"assetId": 123,
"assetIds": [123],
"includeEnrichments": False
}
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({content: '<string>', assetId: 123, assetIds: [123], includeEnrichments: false})
};
fetch('https://app.chainpatrol.io/api/v2/asset/search', 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://app.chainpatrol.io/api/v2/asset/search",
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([
'content' => '<string>',
'assetId' => 123,
'assetIds' => [
123
],
'includeEnrichments' => false
]),
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://app.chainpatrol.io/api/v2/asset/search"
payload := strings.NewReader("{\n \"content\": \"<string>\",\n \"assetId\": 123,\n \"assetIds\": [\n 123\n ],\n \"includeEnrichments\": false\n}")
req, _ := http.NewRequest("POST", 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.post("https://app.chainpatrol.io/api/v2/asset/search")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"content\": \"<string>\",\n \"assetId\": 123,\n \"assetIds\": [\n 123\n ],\n \"includeEnrichments\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.chainpatrol.io/api/v2/asset/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"content\": \"<string>\",\n \"assetId\": 123,\n \"assetIds\": [\n 123\n ],\n \"includeEnrichments\": false\n}"
response = http.request(request)
puts response.read_body{
"asset": {
"id": 123,
"content": "<string>",
"type": "URL",
"status": "UNKNOWN",
"watchStatus": "ENABLED",
"livenessStatus": "UNKNOWN",
"blockedAt": "<string>",
"createdAt": "<string>",
"updatedAt": "<string>"
},
"reports": [
{
"id": 123,
"title": "<string>",
"status": "TODO",
"createdAt": "<string>"
}
],
"scans": [
{
"id": 123,
"createdAt": "<string>",
"enrichments": [
{
"id": 123,
"type": "<string>",
"source": "<string>",
"status": "PENDING",
"createdAt": "<string>",
"files": [
{
"id": 123,
"type": "SCREENSHOT",
"url": "<string>",
"fileName": "<string>",
"mimeType": "<string>",
"sizeBytes": 123,
"createdAt": "<string>"
}
],
"output": "<unknown>"
}
]
}
],
"takedown": {
"id": 123,
"status": "TODO",
"createdAt": "<string>",
"updatedAt": "<string>",
"tasks": [
{
"id": 123,
"type": "HOSTING_PROVIDER",
"status": "TODO",
"retractionStatus": "NOT_RETRACTED",
"externalId": "<string>",
"submittedAt": "<string>",
"retractedAt": "<string>",
"lastResponseAt": "<string>",
"createdAt": "<string>",
"updatedAt": "<string>",
"takedownProvider": {
"name": "<string>"
}
}
]
},
"blockedBy": [
{
"consumer": "<string>",
"name": "<string>",
"consumedAt": "<string>"
}
],
"results": [
{
"asset": {
"id": 123,
"content": "<string>",
"type": "URL",
"status": "UNKNOWN",
"watchStatus": "ENABLED",
"livenessStatus": "UNKNOWN",
"blockedAt": "<string>",
"createdAt": "<string>",
"updatedAt": "<string>"
},
"reports": [
{
"id": 123,
"title": "<string>",
"status": "TODO",
"createdAt": "<string>"
}
],
"scans": [
{
"id": 123,
"createdAt": "<string>",
"enrichments": [
{
"id": 123,
"type": "<string>",
"source": "<string>",
"status": "PENDING",
"createdAt": "<string>",
"files": [
{
"id": 123,
"type": "SCREENSHOT",
"url": "<string>",
"fileName": "<string>",
"mimeType": "<string>",
"sizeBytes": 123,
"createdAt": "<string>"
}
],
"output": "<unknown>"
}
]
}
],
"takedown": {
"id": 123,
"status": "TODO",
"createdAt": "<string>",
"updatedAt": "<string>",
"tasks": [
{
"id": 123,
"type": "HOSTING_PROVIDER",
"status": "TODO",
"retractionStatus": "NOT_RETRACTED",
"externalId": "<string>",
"submittedAt": "<string>",
"retractedAt": "<string>",
"lastResponseAt": "<string>",
"createdAt": "<string>",
"updatedAt": "<string>",
"takedownProvider": {
"name": "<string>"
}
}
]
},
"blockedBy": [
{
"consumer": "<string>",
"name": "<string>",
"consumedAt": "<string>"
}
]
}
]
}{
"code": "BAD_REQUEST",
"message": "Invalid input data",
"issues": []
}{
"code": "UNAUTHORIZED",
"message": "Authorization not provided",
"issues": []
}{
"code": "FORBIDDEN",
"message": "Insufficient access",
"issues": []
}{
"code": "INTERNAL_SERVER_ERROR",
"message": "Internal server error",
"issues": []
}Overview
The Asset Search endpoint returns a single result with four main parts:- asset - The matched asset: its
id,content,type,status,watchStatus, and timestamps (createdAt,updatedAt). - reports - List of reports linked to the asset, each with
id,title,status, andcreatedAt. - takedown - Takedown metadata (
id,status, timestamps) plus a tasks array. Each task hastype,status,retractionStatus, the associatedtakedownProvidername, submission/retraction timestamps, and an optionalexternalIdfor the provider’s tracking ID. Learn more about takedown tasks. - blockedBy - List of platforms currently consuming (blocking) the asset. Each entry has a
consumerslug (e.g.metamask,google-safe-browsing,quad9), the platform’s displayname, and aconsumedAttimestamp indicating when the platform started blocking the asset.
Quick Start
Authentication
Include your API key in theX-API-KEY header:
X-API-KEY: <api-key>
Authorizations
Your API key. This is required by most endpoints to access our API programatically. Reach out to us at support@chainpatrol.io to get an API key for your use.
Body
Asset search request body
Asset content to search for (URL, domain, address, etc.)
Asset ID to search for
Multiple asset IDs to search for in bulk. Capped at 10 when includeEnrichments is set, and unbounded otherwise.
When true, the asset's 10 most recent scans also carry their enrichments, including the browser_capture entry whose screenshotUrl and domUrl point at the captured page. Off by default, and bounded to 10 scans when on, because enrichment payloads are large. Older scans are still listed, just without the enrichments field.
Response
Successful response
Was this page helpful?