Blockaid Bitcoin API
The Bitcoin API from Blockaid — 3 operation(s) for bitcoin.
The Bitcoin API from Blockaid — 3 operation(s) for bitcoin.
openapi: 3.1.0
info:
title: Blockaid Asset Management Bitcoin API
description: Blockaid Risk Score API
termsOfService: https://www.blockaid.io/legal/terms-of-use
license:
name: Proprietary
url: https://www.blockaid.io/legal
version: 1.0.0
servers:
- url: https://api.blockaid.io
description: Production server
- url: https://client.blockaid.io
description: Clients server
tags:
- name: Bitcoin
paths:
/v0/bitcoin/transaction-raw/scan:
post:
tags:
- Bitcoin
summary: Scan Transaction
description: Scan a raw Bitcoin transaction for security risks before signing. Returns a validation verdict (Benign, Warning, or Malicious) and, when requested, a simulation of asset changes.
operationId: bitcoin_scan_transaction_v0_transaction_raw_scan_post
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/BitcoinTransactionScanRequest'
docs_api_name: TransactionScanRequest
title: Transaction Request
required: true
responses:
'200':
description: 'Successful response with validation verdict and, if requested, simulation of asset changes.
For more information about responses, see the [full response reference](/api-reference/end-user-protection/transaction-scanning/bitcoin/bitcoin-transaction-scanning-response-reference).
Note: HTTP 200 indicates the request was processed. Always check `validation.status` and `simulation.status` (when present), which may be `Error` with an `error` message (e.g. simulation failing due to invalid UTXOs).'
content:
application/json:
schema:
$ref: '#/components/schemas/BitcoinTransactionScanResponse'
examples:
Benign:
summary: Benign transaction
value:
validation:
status: Success
result_type: Benign
description: Transaction appears safe
reason: No malicious patterns detected
classification: Safe to sign
features: []
simulation: null
Malicious:
summary: Malicious transaction
value:
validation:
status: Success
result_type: Malicious
description: Known malicious address or pattern
reason: drainer
classification: Do not sign
features: []
simulation: null
'422':
description: Request validation failed (e.g. missing or invalid request body fields).
content:
application/json:
schema:
$ref: '#/components/schemas/BitcoinHTTPValidationError'
examples:
Missing Required Field:
summary: Missing required field
value:
detail:
- loc:
- body
- transaction
msg: field required
type: value_error.missing
Invalid Type:
summary: Invalid request body field
value:
detail:
- loc:
- body
- chain
msg: 'value is not a valid enumeration member; permitted: ''bitcoin'''
type: type_error.enum
deprecated: false
security:
- APIKey: []
- ClientID: []
/v0/bitcoin/transaction/report:
post:
tags:
- Bitcoin
summary: Report Transaction
description: Submit an appeal or false-positive report for a Bitcoin transaction scan. Use when you believe a scan result was incorrect (e.g. should_be_benign, should_be_malicious, wrong_simulation_result).
operationId: bitcoin_report_transaction_v0_transaction_report_post
requestBody:
description: Appeal event type, report payload (prior scan request_id or full transaction params), and optional details.
content:
application/json:
schema:
$ref: '#/components/schemas/BitcoinReportTransactionRequest'
required: true
responses:
'200':
description: Report accepted; response body is the HTTP status code (e.g. 201).
content:
application/json:
schema:
type: integer
title: Response Report Transaction V0 Transaction Report Post
examples:
Accepted:
summary: Report accepted
value: 201
'422':
description: Request validation failed (e.g. missing or invalid request body fields).
content:
application/json:
schema:
$ref: '#/components/schemas/BitcoinHTTPValidationError'
examples:
Missing Required Field:
summary: Missing required field
value:
detail:
- loc:
- body
- details
msg: field required
type: value_error.missing
Invalid Event:
summary: Invalid event type
value:
detail:
- loc:
- body
- event
msg: 'value is not a valid enumeration member; permitted: ''should_be_malicious'', ''should_be_benign'', ''wrong_simulation_result'''
type: type_error.enum
deprecated: true
security:
- APIKey: []
- ClientID: []
/v0/bitcoin/address/scan:
post:
tags:
- Bitcoin
summary: Scan Address
description: Gets an address and returns a full security assessment indicating whether or not this address is malicious as well as textual reasons of why the address was flagged that way.
operationId: bitcoin_scan_address_address_scan_post
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/BitcoinAddressScanRequestSchema'
examples:
Benign Address Scan:
summary: Benign Address Scan
value:
chain: bitcoin
address: bc1qqks2h7dwrhgxvdcm56dvqaymhey3gd0pt9w0ne
Malicious OFAC Address Scan:
summary: Malicious OFAC Address Scan
value:
chain: bitcoin
address: 39fhoB2DohisGBbHvvfmkdPdShT75CNHdX
required: true
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/BitcoinAddressScanResponseSchema'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/BitcoinHTTPValidationError'
deprecated: false
security:
- APIKey: []
- ClientID: []
components:
schemas:
BitcoinTransactionScanResponse:
properties:
simulation:
anyOf:
- $ref: '#/components/schemas/BitcoinSimulationResult'
docs_api_name: SimulationResult
title: Simulation Result
- $ref: '#/components/schemas/BitcoinSimulationErrorSchema'
title: Simulation Error
description: Simulation result; Only present if simulation option is included in the request
nullable: true
validation:
$ref: '#/components/schemas/BitcoinValidationResponse'
description: Validation result; Only present if validation option is included in the request
docs_api_name: ValidationResponse
nullable: true
type: object
title: Response
BitcoinAppealTransactionDataReport:
properties:
type:
type: string
const: params
title: Type
description: Discriminator; use "params" when supplying full transaction data.
default: params
params:
$ref: '#/components/schemas/BitcoinTransactionScanRequest'
docs_api_name: TransactionScanRequest
title: Transaction Request
description: Full transaction scan request (same shape as the scan endpoint).
type: object
required:
- params
title: Appeal Transaction Data Report
BitcoinReportTransactionRequest:
properties:
event:
$ref: '#/components/schemas/BitcoinAppealTypes'
description: 'Type of appeal: what you believe was wrong with the scan result.'
report:
anyOf:
- $ref: '#/components/schemas/BitcoinAppealRequestId'
- $ref: '#/components/schemas/BitcoinAppealTransactionDataReport'
docs_api_name: AppealTransactionDataReport
title: Report
description: Either a prior scan request ID or the full transaction parameters being reported.
details:
type: string
title: Details
description: Free-text explanation or context for the report.
type: object
required:
- event
- report
- details
title: 'AppealRequest[Annotated[RequestSchemaType[ChainSchema, Annotated[NewType, SkipValidation, PlainSerializer, GetPydanticSchema], Annotated[str, SkipValidation, PlainSerializer, GetPydanticSchema], Annotated[set[Options], FieldInfo(annotation=NoneType, required=False, default={<Options.validation: ''validation''>, <Options.simulation: ''simulation''>}, title=''Options'', description=''List of options to include in the response\n- `Options.validation`: Include Options.validation output in the response\n\n- `Options.simulation`: Include Options.simulation output in the response\n'', metadata=[MinLen(min_length=1)])]], FieldInfo(annotation=NoneType, required=True, title=''Transaction Request'', json_schema_extra={''docs_api_name'': ''TransactionScanRequest''})]]'
BitcoinInscriptionDetailsSchema:
properties:
type:
type: string
const: INSCRIPTION
title: Type
description: Type of the asset (`INSCRIPTION`).
default: INSCRIPTION
name:
type: string
title: Name
description: Inscription's display name.
id:
type: string
title: Id
description: The Inscription ID.
sat:
type: integer
title: Sat
description: The Inscription sat.
logo_url:
type: string
title: Logo Url
description: URL of the asset's logo.
nullable: true
type: object
required:
- name
- id
- sat
title: Inscription Asset Details
BitcoinRuneDetailsSchema:
properties:
type:
type: string
const: RUNE
title: Type
description: Type of the asset (`RUNE`).
default: RUNE
name:
type: string
title: Name
description: The Rune name.
spaced_name:
type: string
title: Spaced Name
description: The Rune spaced name.
symbol:
type: string
title: Symbol
description: The Rune's symbol.
id:
type: string
title: Id
description: The Rune ID.
logo_url:
type: string
title: Logo Url
description: URL of the asset's logo.
nullable: true
decimals:
type: integer
title: Decimals
description: Number of decimal places used to represent fractional units.
type: object
required:
- name
- spaced_name
- symbol
- id
- decimals
title: Inscription Asset Details
BitcoinAppealTypes:
type: string
enum:
- should_be_malicious
- should_be_benign
- wrong_simulation_result
title: Appeal Types
description: 'Reason for the appeal: false positive (should_be_benign), false negative (should_be_malicious), or incorrect simulation (wrong_simulation_result).'
BitcoinAssetTransferDetailsSchema:
properties:
usd_price:
type: number
title: Usd Price
description: USD price of the asset.
nullable: true
summary:
type: string
title: Summary
description: Summarized description of the transfer.
nullable: true
value:
type: string
title: Value
description: Value of the transfer.
raw_value:
type: integer
title: Raw Value
description: Raw value of the transfer.
type: object
required:
- value
- raw_value
title: Asset Transfer Details
BitcoinNativeAssetDiff:
properties:
asset:
$ref: '#/components/schemas/BitcoinNativeAssetDetailsSchema'
in:
$ref: '#/components/schemas/BitcoinAssetTransferDetailsSchema'
description: Details of the incoming transfer.
nullable: true
title: In
out:
$ref: '#/components/schemas/BitcoinAssetTransferDetailsSchema'
description: Details of the outgoing transfer.
nullable: true
title: Out
asset_type:
type: string
title: Asset Type
description: Asset category for this balance change (e.g. NATIVE, RUNE, INSCRIPTION).
readOnly: true
type: object
required:
- asset
- asset_type
title: AccountSingleAssetDiffSchemaType[NativeAssetDetailsSchema, AssetTransferDetailsSchema]
BitcoinValidationFeatureType:
type: string
enum:
- Benign
- Warning
- Malicious
- Info
title: ValidationFeatureType
BitcoinSimulationErrorSchema:
properties:
status:
type: string
const: Error
title: Status
error:
type: string
title: Error
description: Error message
type: object
required:
- status
- error
title: Simulation Error
BitcoinChainSchema:
type: string
enum:
- bitcoin
title: ChainSchema
BitcoinTotalUsdDiffSchema:
properties:
in:
type: number
title: In
description: Total incoming USD transfers.
out:
type: number
title: Out
description: Total outgoing USD transfers.
total:
type: number
title: Total
description: Total USD transfers.
type: object
required:
- in
- out
title: Total USD Diff
BitcoinValidationFeature:
properties:
type:
$ref: '#/components/schemas/BitcoinValidationFeatureType'
description: Severity or category of this finding (e.g. Benign, Warning, Malicious, Info).
title: type
feature_id:
type: string
title: feature_id
description: Unique identifier for this type of finding.
description:
type: string
title: Description
description: Human-readable explanation of this finding.
address:
type: string
title: Address
description: Bitcoin address that this finding is associated with.
type: object
required:
- type
- feature_id
- description
- address
title: ValidationFeatureSchemaType[Annotated[NewType, SkipValidation, PlainSerializer, GetPydanticSchema]]
BitcoinInscriptionDiffSchema:
properties:
usd_price:
type: number
title: Usd Price
description: USD price of the asset.
nullable: true
summary:
type: string
title: Summary
description: Summarized description of the transfer.
nullable: true
inscription_id:
type: string
title: Inscription Id
description: Inscription ID of the transfer.
type: object
required:
- inscription_id
title: Inscription Transfer Details
BitcoinInscriptionAssetDiff:
properties:
asset:
$ref: '#/components/schemas/BitcoinInscriptionDetailsSchema'
in:
$ref: '#/components/schemas/BitcoinInscriptionDiffSchema'
description: Details of the incoming transfer.
nullable: true
title: In
out:
$ref: '#/components/schemas/BitcoinInscriptionDiffSchema'
description: Details of the outgoing transfer.
nullable: true
title: Out
asset_type:
type: string
title: Asset Type
description: Asset category for this balance change (e.g. NATIVE, RUNE, INSCRIPTION).
readOnly: true
type: object
required:
- asset
- asset_type
title: AccountSingleAssetDiffSchemaType[InscriptionDetailsSchema, InscriptionDiffSchema]
BitcoinAddressFeatureModel:
properties:
type:
$ref: '#/components/schemas/BitcoinValidationFeatureType'
feature_id:
type: string
title: Feature Id
description:
type: string
title: Description
type: object
required:
- type
- feature_id
- description
title: AddressFeatureModel
BitcoinNativeAssetDetailsSchema:
properties:
type:
type: string
const: NATIVE
title: Type
description: Type of the asset (`NATIVE`).
default: NATIVE
symbol:
type: string
const: BTC
title: Symbol
description: Symbol of the asset.
default: BTC
name:
type: string
const: Bitcoin
title: Name
description: Name of the asset.
default: Bitcoin
decimals:
type: integer
const: 8
title: Decimals
description: Number of decimal places used to represent fractional units (e.g. 8 for BTC).
default: 8
logo_url:
type: string
title: Logo Url
description: URL of the asset's logo.
nullable: true
type: object
required:
- logo_url
title: Native Asset Details
BitcoinAddressDetailsBaseSchema_Annotated_NewType__SkipValidation__PlainSerializer__GetPydanticSchema__:
properties:
account_address:
type: string
title: Account Address
description: Encoded public key of the account
description:
type: string
title: Description
description: Description of the account
nullable: true
type: object
required:
- account_address
title: Address Details
BitcoinHTTPValidationError:
properties:
detail:
items:
$ref: '#/components/schemas/BitcoinValidationError'
type: array
title: Detail
type: object
title: HTTPValidationError
BitcoinVerdict:
type: string
enum:
- Benign
- Warning
- Malicious
title: Verdict
BitcoinSimulationResult:
properties:
status:
type: string
const: Success
title: Status
assets_diffs:
additionalProperties:
items:
anyOf:
- $ref: '#/components/schemas/BitcoinNativeAssetDiff'
docs_api_name: NativeAssetDiff
title: Native asset Diff
- $ref: '#/components/schemas/BitcoinInscriptionAssetDiff'
docs_api_name: InscriptionAssetDiff
title: Inscription Asset Diff
- $ref: '#/components/schemas/BitcoinRunesAssetDiff'
docs_api_name: RunesAssetDiff
title: Runes Asset Diff
type: array
description: Asset balance changes for one account address.
type: object
title: Assets Diffs
description: Per-account list of asset balance changes (native, inscriptions, runes) for the simulated transaction.
address_details:
items:
$ref: '#/components/schemas/BitcoinAddressDetailsBaseSchema_Annotated_NewType__SkipValidation__PlainSerializer__GetPydanticSchema__'
type: array
title: Address Details
description: Details of addresses involved in the transaction.
account_summary:
$ref: '#/components/schemas/BitcoinAccountSummary'
description: Summary of the actions and asset transfers that were made by the requested account address.
docs_api_name: AccountSummary
type: object
required:
- status
- account_summary
title: Simulation Result
BitcoinValidationResponse:
anyOf:
- $ref: '#/components/schemas/BitcoinValidationResult'
docs_api_name: ValidationResult
title: Validation Result
- $ref: '#/components/schemas/BitcoinValidationErrorSchema'
title: Validation Error
title: ValidationResponseSchemaType[Annotated[NewType, SkipValidation, PlainSerializer, GetPydanticSchema]]
BitcoinInAppRequestMetadata:
properties:
type:
type: string
const: in_app
title: Type
description: Identifies the request as coming from your own app (e.g. in-app send, swap, or internal flow).
default: in_app
account:
allOf:
- $ref: '#/components/schemas/routers__chain_agnostic__models__request__Account'
title: Account
description: Account information associated with the request
connection:
allOf:
- $ref: '#/components/schemas/routers__chain_agnostic__models__request__Connection'
title: Connection
description: Connection metadata including user agent and IP information
non_dapp:
anyOf:
- type: boolean
- type: 'null'
title: Non Dapp
description: Indicates that the transaction was not initiated by a dapp. Use false when the transaction is from a dapp.
default: true
type: object
title: In-App Request Metadata
BitcoinValidationResult:
properties:
status:
type: string
const: Success
title: Status
result_type:
$ref: '#/components/schemas/BitcoinVerdict'
description: Verdict of the validation.
title: Result Verdict
description:
type: string
title: Description
description: A textual description about the validation result.
reason:
type: string
title: Reason
description: Human-readable explanation of why the transaction received the given `result_type` verdict.
classification:
type: string
title: Classification
description: A textual classification that can be presented to the user explaining the reason.
features:
items:
$ref: '#/components/schemas/BitcoinValidationFeature'
docs_api_name: ValidationFeature
title: Feature
type: array
title: Features
description: List of validation findings (addresses and classifications) that contributed to the verdict.
type: object
required:
- status
- result_type
- description
- reason
- classification
- features
title: Validation Result
BitcoinTransactionScanRequest:
properties:
chain:
$ref: '#/components/schemas/BitcoinChainSchema'
options:
items:
$ref: '#/components/schemas/BitcoinOptions'
type: array
minItems: 1
uniqueItems: true
title: Options
description: 'Which parts of the response you need:
- **validation** — Security verdict (Benign/Warning/Malicious) and risk explanation. Use when deciding whether to block or warn.
- **simulation** — Predicted summary of balance and asset changes (e.g. "You will send 0.01 BTC to bc1q..."). Use when showing the user what the transaction does.
You can request one or both; default is both.'
default:
- validation
- simulation
account_address:
type: string
title: Account Address
description: The Bitcoin address that owns the UTXOs being spent.
transaction:
type: string
title: Transaction
description: The raw unsigned transaction in hexadecimal, as produced by the wallet or your app. This is the same payload the user would sign.
metadata:
anyOf:
- $ref: '#/components/schemas/BitcoinWalletRequestMetadata'
- $ref: '#/components/schemas/BitcoinInAppRequestMetadata'
title: Metadata
description: 'Context of where the transaction was initiated: use wallet metadata when the user is signing in a wallet for an external site; use in-app metadata when the transaction is created within your own app.
Choosing the correct type improves risk analysis and reporting.'
type: object
required:
- chain
- account_address
- transaction
- metadata
title: Request
routers__chain_agnostic__models__request__Account:
properties:
account_id:
type: string
title: Account Id
description: Unique identifier for the account.
account_creation_timestamp:
type: string
format: date-time
title: Account Creation Timestamp
description: Timestamp when the account was created.
user_age:
type: integer
exclusiveMinimum: 0.0
title: User Age
description: Age of the user in years
user_country_code:
type: string
title: User Country Code
description: ISO country code of the user's location.
account_addresses:
items:
type: string
type: array
title: Account Addresses
description: 'List of all account addresses in different chains based on the CAIPs standard (https://github.com/ChainAgnostic/CAIPs). Ethereum mainnet example: eip155:1:0xab16a96d359ec26a11e2c2b3d8f8b8942d5bfcdb'
type: object
required:
- account_id
title: Account
BitcoinAddressScanRequestSchema:
properties:
address:
type: string
title: Address
chain:
$ref: '#/components/schemas/BitcoinChainSchema'
type: object
required:
- address
- chain
title: Request
BitcoinRunesAssetDiff:
properties:
asset:
$ref: '#/components/schemas/BitcoinRuneDetailsSchema'
in:
$ref: '#/components/schemas/BitcoinAssetTransferDetailsSchema'
description: Details of the incoming transfer.
nullable: true
title: In
out:
$ref: '#/components/schemas/BitcoinAssetTransferDetailsSchema'
description: Details of the outgoing transfer.
nullable: true
title: Out
asset_type:
type: string
title: Asset Type
description: Asset category for this balance change (e.g. NATIVE, RUNE, INSCRIPTION).
readOnly: true
type: object
required:
- asset
- asset_type
title: AccountSingleAssetDiffSchemaType[RuneDetailsSchema, AssetTransferDetailsSchema]
BitcoinValidationErrorSchema:
properties:
status:
type: string
const: Error
title: Status
error:
type: string
title: Error
description: Error message
type: object
required:
- status
- error
title: Validation Error
BitcoinAddressScanResponseSchema:
properties:
result_type:
$ref: '#/components/schemas/BitcoinVerdict'
description: Verdict of the validation
title: Result Verdict
features:
items:
$ref: '#/components/schemas/BitcoinAddressFeatureModel'
type: array
title: Features
description: A list of textual features about this address that can be presented to the user.
type: object
required:
- result_type
title: AddressScanResponseSchema
routers__chain_agnostic__models__request__Connection:
properties:
user_agent:
type: string
title: User Agent
description: User agent string from the client's browser or application.
ip_address:
type: string
format: ipvanyaddress
title: Ip Address
description: IP address of the customer making the request. Both IPv4 and IPv6 addresses are supported.
origin:
type: string
minLength: 1
format: uri
title: Origin
description: The full URL of the website that the request was directed to.
walletconnect_name:
type: string
title: Walletconnect Name
description: WalletConnect session name, when the request originates from a WalletConnect session.
walletconnect_description:
type: string
title: Walletconnect Description
description: WalletConnect session description, when the request originates from a WalletConnect session.
type: object
required:
- ip_address
title: Connection
BitcoinValidationError:
properties:
loc:
items:
anyOf:
- type: string
- type: integer
type: array
title: Location
msg:
type: string
title: Message
type:
type: string
title: Error Type
type: object
required:
- loc
- msg
- type
title: ValidationError
BitcoinWalletRequestMetadata:
properties:
type:
type: string
const: wallet
title: Type
description: Identifies the request as a wallet signing a transaction on behalf of an external dApp. The type improves threat context and helps attribute risk to specific origins.
url:
type: string
title: Url
description: The full URL of the dApp or page where the user initiated the transaction (e.g. https://app.example.com/swap).
account:
allOf:
- $ref: '#/components/schemas/routers__chain_agnostic__models__request__Account'
title: Account
description: Account information associated with the request
connection:
allOf:
- $ref: '#/components/schemas/routers__chain_agnostic__models__request__Connection'
title: Connection
description: Connection metadata including user agent and IP information
non_dapp:
anyOf:
- type: boolean
- type: 'null'
title: Non Dapp
description: Indicates that the transaction was not initiated by a dapp. Use false when the transaction is from a dapp.
default: false
type: object
required:
- type
- url
title: Wallet Request Metadata
BitcoinAppealRequestId:
properties:
type:
type: string
const: request_id
title: Type
description: Discriminator; use "request_id" when referencing a prior scan.
default: request_id
id:
type: string
title: ID
description: Request ID from a previous transaction scan response.
type: object
required:
- id
title: Appeal Request ID
BitcoinOptions:
type: string
enum:
- validation
- simulation
title: Options
BitcoinAccountSummary:
properties:
account_assets_diffs:
items:
anyOf:
- $ref: '#/components/schemas/
# --- truncated at 32 KB (33 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/blockaid/refs/heads/main/openapi/blockaid-bitcoin-api-openapi.yml