{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-developers/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"redocly_category":"Developers","type":"markdown"},"seo":{"title":"Transaction Screening"},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"transaction-screening","__idx":0},"children":["Transaction Screening"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Fordefi can screen outgoing transactions with external screening providers —"," ","Blockaid and Hypernative — before they are signed, and return the results"," ","through the API alongside Fordefi's own risk engine output. Screening is opt-in"," ","per organization: an admin activates a provider by saving valid credentials for"," ","it in ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Settings"]}," > ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Screening"]}," in the web console. See"," ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/user-guide/transaction-screening"},"children":["Integrate transaction screening providers"]}," ","for the setup and the supported chains."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Once a provider is active, its findings reach you in two forms:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Risk objects"]},", in the existing ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["risks"]}," array, so screening findings arrive"," ","through the same field your integration already reads."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Screening objects"]},", in a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["screening"]}," array, which report the per-provider"," ","outcome — including a clean result — and carry the provider's own response"," ","details."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"risk-objects","__idx":1},"children":["Risk objects"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Screening findings are turned into risk objects, one per finding:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Blockaid:"]}," One risk per entry in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["validation.features"]}," whose ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["type"]}," is not"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Benign"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Hypernative:"]}," One risk per entry in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["findings"]}," whose ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["severity"]}," is neither"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["accept"]}," nor ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["autoAccept"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"screening-objects","__idx":2},"children":["Screening objects"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Every endpoint that returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["risks"]}," also returns a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["screening"]}," array, with one"," ","entry per external provider that the transaction was screened with. Fordefi's"," ","own risk engine is not represented in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["screening"]},". The array may be empty — for"," ","example when no provider is active for the organization."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Type"},"children":["Type"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["vendor"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string enum"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["blockaid"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["hypernative"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["result"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Blockaid: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Malicious"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Warning"]},", or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Benign"]},", from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["validation.result_type"]},". Hypernative: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["accept"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["autoAccept"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["warn"]},", or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["deny"]},", from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["data.recommendation"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["screening_details"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["object"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The relevant part of the provider's raw response. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#screening-details"},"children":["Screening details"]},"."]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Read ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["screening"]}," rather than inferring the outcome from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["risks"]},": a provider that"," ","returned a clean result and a provider that was never called both produce zero"," ","risks, and only ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["screening"]}," tells them apart."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"screening-details","__idx":3},"children":["Screening details"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["screening_details"]}," carries through the provider's own response, so you can"," ","correlate a Fordefi transaction with a screening on the provider's platform."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"examples","__idx":4},"children":["Examples"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A Blockaid screening object:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"\"screening\": [\n  {\n    \"vendor\": \"blockaid\",\n    \"result\": \"Malicious\",\n    \"title\": \"known_malicious\",\n    \"description\": \"A known malicious address is involved in the transaction\",\n    \"screening_details\": {\n      \"validation\": {\n        \"status\": \"Success\",\n        \"result_type\": \"Malicious\",\n        \"description\": \"A known malicious address is involved in the transaction\",\n        \"reason\": \"b\",\n        \"classification\": \"known_malicious\",\n        \"features\": [\n          {\n            \"type\": \"Malicious\",\n            \"feature_id\": \"KNOWN_MALICIOUS_ADDRESS\",\n            \"description\": \"This address has recorded malicious activity\",\n            \"address\": \"0x0a5738064da9dda3cf4a4ae8d8e49b16fd7467c5\"\n          }\n        ]\n      }\n    }\n  }\n]\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A Hypernative screening object:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"\"screening\": [\n  {\n    \"vendor\": \"hypernative\",\n    \"result\": \"deny\",\n    \"title\": \"Phishing victim - approval\",\n    \"description\": \"[Simulated] An address approved funds to a phishing/scamming address\",\n    \"screening_details\": {\n      \"data\": {\n        \"recommendation\": \"deny\",\n        \"assessmentId\": \"fdbf8e7b-8387-4fbf-b3fc-3eeb9ca39d54\",\n        \"assessmentTimestamp\": \"2026-01-21T08:01:18.375Z\",\n        \"findings\": [\n          {\n            \"typeId\": \"S-1925\",\n            \"title\": \"Phishing victim - approval\",\n            \"description\": \"[Simulated] An address approved funds to a phishing/scamming address\",\n            \"severity\": \"Deny\"\n          }\n        ]\n      },\n      \"error\": null\n    }\n  }\n]\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["XD"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"timeouts-and-error-handling","__idx":5},"children":["Timeouts and error handling"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["How the policy engine treats an unusable screening result depends on why it is"," ","unusable:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Unsupported chain:"]}," A Risk condition does not match, and policy evaluation"," ","continues to the next rule. This covers both a chain type that Fordefi does"," ","not screen and a provider that returns an unsupported-chain error, for example"," ","on an unsupported EVM chain."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Timeout, malformed response, or other provider error:"]}," The result is"," ","indeterminate, and Fordefi falls back to the default policy rule, the same"," ","fallback used when"," ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/developers/simulate-transactions#override-simulation-errors"},"children":["simulation data is missing"]},"."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Because an unavailable provider falls back to the default rule, we recommend"," ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/user-guide/policies/sample-policies#set-basic-approvals"},"children":["setting a strict default policy rule"]},"."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Learn more:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/user-guide/transaction-screening"},"children":["Integrate transaction screening providers"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/user-guide/screening/screening-policy-rules"},"children":["Set policy rules on screening results"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/developers/simulate-transactions"},"children":["Simulate transactions"]}]}]}]},"headings":[{"value":"Transaction Screening","id":"transaction-screening","depth":1},{"value":"Risk objects","id":"risk-objects","depth":2},{"value":"Screening objects","id":"screening-objects","depth":2},{"value":"Screening details","id":"screening-details","depth":3},{"value":"Examples","id":"examples","depth":3},{"value":"Timeouts and error handling","id":"timeouts-and-error-handling","depth":2}],"frontmatter":{"seo":{"title":"Transaction Screening"}},"lastModified":"2026-09-17T11:28:12.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/developers/transaction-screening","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}