List Detections
List threat detection results for an organization using API key authentication, newest first. Returns human-readable confidence levels (none, low, medium, high) and report status. Supports filtering by source, confidence level, raw score range, asset status, asset type and creation time, plus search. Pages hold up to 1000 results: pass nextCursor back as cursor until it is absent, set includeTotal to get the number of matching detections without paging, and use startDate to fetch only detections created since your last sync.
Quick Start
Authentication
Include your API key in theX-API-KEY header:
Example Request
Request Schema
Request Body
Filter Schema
Each filter object must have the following structure:Filter Properties
1. Source Filter ("source")
Available Source Values
Available Source Values
"ASSET_CHECK"- Asset verification checks"BING_SEARCH"- Bing search results"CERTSTREAM"- Certificate transparency logs"DNS_TWIST"- DNS twist detection"DUCK_DUCK_GO_SEARCH"- DuckDuckGo search results"EXTERNAL"- External threat submissions"GOOGLE_SEARCH"- Google search results"GUESTBOOK"- Guestbook submissions"MEDIUM_TAG_RSS"- Medium RSS feeds"MOZILLA_ADDON_SEARCH"- Mozilla addon searches"REDDIT_SUBREDDIT_SEARCH"- Reddit subreddit searches"TWITTER"- Twitter monitoring"TWITTER_POST_SEARCH"- Twitter post searches"TWITTER_SEARCH"- Twitter search results"URLSCAN"- URLScan.io results"YAHOO_SEARCH"- Yahoo search results"YANDEX_IMAGE_SEARCH"- Yandex reverse image search results for your brand imagery"YOUTUBE_SEARCH"- YouTube search results
"assetStatus")
"UNKNOWN"- Status not yet determined"ALLOWED"- Asset is legitimate/allowed"BLOCKED"- Asset is blocked/malicious
"confidence")
"none"- No confidence threshold met"low"- Low confidence threat detection"medium"- Medium confidence threat detection"high"- High confidence threat detection
"blockStatus")
"blocked"- the asset is on the blocklist (asset.statusis"BLOCKED")"pending"- the asset was confirmed malicious but is not enforced yet, because protection is not active for your organization (asset.pendingStatusis"BLOCKED"). The ChainPatrol app labels these Pending Blocked.
assetStatus filter only sees asset.status, so assetStatus: ["BLOCKED"]
leaves pending blocks out.
5. Deleted Filter ("deleted")
{ "property": "deleted", "operator": "notIn", "value": ["deleted"] } to leave
them out, or use "in" to return only deleted detections.
6. Asset Type Filter ("assetType")
Available Asset Type Values
Available Asset Type Values
"URL"- Website URLs"PAGE"- Web pages"ADDRESS"- Blockchain addresses"TWITTER"- Twitter profiles/posts"FACEBOOK"- Facebook profiles/pages"YOUTUBE"- YouTube channels/videos"REDDIT"- Reddit posts/subreddits"TELEGRAM"- Telegram channels/groups"DISCORD"- Discord servers (deprecated)"DISCORD_USER"- Discord users"LINKEDIN"- LinkedIn profiles"INSTAGRAM"- Instagram profiles"THREADS"- Threads profiles"TIKTOK"- TikTok profiles"MEDIUM"- Medium articles/profiles"EMAIL"- Email addresses"WHATSAPP"- WhatsApp contacts"GOOGLE_APP_STORE"- Google Play Store apps"APPLE_APP_STORE"- Apple App Store apps"AMAZON_APP_STORE"- Amazon App Store apps"MICROSOFT_APP_STORE"- Microsoft Store apps"CHROME_WEB_STORE"- Chrome extensions"MOZILLA_ADDONS"- Firefox addons"OPERA_ADDONS"- Opera addons"PATREON"- Patreon profiles"OPENSEA"- OpenSea collections/profiles"FARCASTER"- Farcaster profiles"IPFS"- IPFS hashes"GOOGLE_FORM"- Google Forms"QUORA"- Quora profiles/posts"GITHUB"- GitHub repositories/profiles"TEACHABLE"- Teachable courses"SUBSTACK"- Substack publications"DEBANK"- DeBank profiles"TAWK_TO"- Tawk.to chat widgets"JOTFORM"- JotForm forms"PRIMAL"- Primal profiles"BLUESKY"- Bluesky profiles"SNAPCHAT"- Snapchat profiles"DESO"- DeSo profiles
Response Schema
Response Body
Detection Result Object
Each item in thedetections array has the following structure:
Asset Object
Complete Response Example
Counting and Score Cut-offs
To count detections without paging through them, sendincludeTotal: true. The
response then carries total: how many detections match your filters, search and
date range across all pages. It is counted before the cursor is applied, so every
page of a sweep reports the same number. It costs an extra count query, so ask for
it on the first page rather than on every page.
confidence is bucketed from score using your organization’s own thresholds, so
"high" does not mean a fixed score. For a fixed cut-off such as “over 80%”, use
minScore (and optionally maxScore) instead:
minScore greater than maxScore is rejected with a 400.
See Evaluating detections for the
questions people usually ask when they first look at this data, and the request
that answers each one.
Pagination and Incremental Sync
Detections are returned newest first. There is no single-call export: an organization can hold hundreds of thousands of detections, far more than fit in one response. Page through them instead:- Set
limitup to 1000. - Pass the
nextCursorfrom each response back ascursor. - Stop when a response has no
nextCursor.
413
error instead of being cut short. Retry with a smaller limit. A 1000-row page
is usually well under 1MB.Fetching only new detections
After an initial full sync, usestartDate so each run only fetches what was
created since the previous one. For 1,000–10,000 new detections a day, that is a
handful of 1000-row pages.
- Record the time the sync starts, and send it as
endDate. Detections created while you are paging land at the front of the newest-first order, so without a fixedendDatethey would be skipped. The next run picks them up instead. - Set
startDateto the previous run’s start time, minus a few minutes of overlap. A detection can take a few seconds to become visible after itscreatedAt, and the overlap catches it. - Page until
nextCursoris absent, and de-duplicate byid. The overlap means some detections come back in two runs.
{ "property": "deleted", "operator": "notIn", "value": ["deleted"] } to
filters. To fetch only fake-domain detections, add
{ "property": "assetType", "operator": "in", "value": ["URL"] }.
Access Control
The API enforces strict access control based on your API key:-
Organization API Keys:
- Can only access detection results for their associated organization
- Must match the
slugparameter exactly - Example: An API key for “acme-org” can only query results for “acme-org”
-
User API Keys:
- Can access detection results for any organization where the user is a member
- Requires the user to be an active member of the queried organization
Example Implementation
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
Organization slug
Pass the nextCursor from the previous response to fetch the next page. Omit it for the first page.
Number of results per page, between 1 and 1000. Defaults to 50.
1 <= x <= 1000Filters to apply to the results
- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
- Option 6
- Option 7
- Option 8
- Option 9
- Option 10
- Option 11
Search query for threat content
Only return detections whose raw score is at least this value (inclusive, 0-1). Use this rather than the confidence filter when you need a fixed cut-off such as 0.8: confidence buckets depend on your organization's thresholds.
0 <= x <= 1Only return detections whose raw score is at most this value (inclusive, 0-1). Must not be below minScore.
0 <= x <= 1Also return total: how many detections match the filters, search and date range across all pages. Costs an extra count query, so request it on the first page of a sweep rather than every page.
Only return detections created at or after this time (inclusive). For incremental syncs, pass the time your previous sync started minus a few minutes of overlap, and de-duplicate by id.
Only return detections created at or before this time (inclusive). Pin it to the time a sync starts so every page of that sync sees the same result set.