KEY_LINK_TX_SIGN_REQUEST message to your Fireblocks Agent, the request carries the transaction details, mainly in the metadata field. Fireblocks Agent forwards this message to your customer server (the /messagesToSign endpoint you implement) exactly as received, so your server can inspect these details (for example, to confirm the amount and destination match what you expect) before authorizing your HSM or key management system to sign.
Parse this structure defensivelyThe fields on this page are not an exhaustive list. Requests can contain fields that aren’t documented here, and Fireblocks can add fields at any time. An unknown or undocumented field must never break your integration.
metadata does not have a fixed, versioned schema. The same field name can carry different values at different nesting levels of the same request; this page calls those cases out.If your integration reads these fields:- Ignore fields you don’t recognize instead of failing, and don’t reject a request because it contains one.
- Don’t assume that a field marked optional or conditional is always present, or that its type stays the same across transaction types.
- Don’t hard-fail your signing flow solely because a field is missing, unless you’ve deliberately decided to require it.
Stability
The core fields are stable: the transaction ID, the asset, the amounts, the source and destination, and the policy verdict. Other fields are informational, and Fireblocks may add new ones over time. Base your signing decisions on the signedtxMetaData object, which Fireblocks Agent verifies before forwarding the request, rather than on the unsigned flat fields in metadata. The flat fields are convenience copies and aren’t covered by any signature.
Where this appears
AKEY_LINK_TX_SIGN_REQUEST you receive at /messagesToSign is a MessageEnvelope, where message.payload is a stringified JSON object. Parsing it gives you a MessagePayload:
version field.
number
The time the signing request was created, as a Unix timestamp in seconds.
metadata
A flat object mixing a transaction summary with lower-level signing details:
string
A JSON-encoded string. Parse it to get the TxMetaData object described below.
array
Signatures over the
txMetaData string. Each entry:array
The raw payloads to be signed, prior to their appearance in
messagesToSign. A request can contain multiple entries, for example when the transaction needs signatures from additional signer paths.number
(Optional) The number of signature operations Fireblocks expects back for this request. Not always sent.
string
The Fireblocks asset ID, e.g.
SOL_TEST. A flattened copy of the same value inside txMetaData, kept in sync with it.string
(Optional) The transaction’s operation type, e.g.
TRANSFER. A flattened copy of txMetaData.transactionType. Not always sent.string
(Optional) The primary destination address. A flattened copy of
txMetaData.dstAddress. Not always sent.string
(Optional) Destination tag or memo, for chains that support one. A flattened copy of
txMetaData.dstTag. Not always sent.number | string
The transaction amount. A number for transfers; the string
"0.0" for raw signing.string
(Optional) The transaction amount as a string, for precision. Absent for raw signing.
string | number
(Optional) The amount in the asset’s smallest unit (e.g. lamports for SOL). A string for transfers; the number
0 for raw signing. Not always sent.number
The USD value of the transfer.
number
The network fee, in the asset’s smallest unit.
string
(Optional) The network fee as a decimal string, in base asset units. An empty string for raw signing. Not always sent.
string
Hex-encoded HD wallet chaincode used to derive the signing key for this operation.
string | number
The source ID. Can be a number or a string, so handle both types.
string
The source type, e.g.
VAULT.string
The destination ID.
string
The destination type, e.g.
ONE_TIME. Can also carry policy values such as ONE_TIME_ADDRESS, so it doesn’t always match txMetaData.dstType.(Optional) Sent for token transfers.
(Optional) The token’s symbol. Sent for token transfers.
(Optional) Sent for XRP transactions where applicable.
(Optional) Sent for UTXO-based transactions where applicable.
Raw signing requests
For raw signing requests, the flat amount fields carry placeholder values:amountis the string"0.0".amountIntis the number0.coinbaseFeeis an empty string ("").amountStris absent.
txMetaData.extraParameters.rawMessageData. See Operation and chain-specific fields.
Signature verification
Fireblocks Agent verifies thepolicy_service entry in txMetaDataSignatures against the Fireblocks signing certificate before it calls your /messagesToSign endpoint. If that signature doesn’t validate, Fireblocks Agent discards the message and never forwards it to your server, so by the time your server receives a request, this check has already passed. Fireblocks Agent checks the policy_service entry; it doesn’t verify USER_AUTHORIZER entries.
If you want to verify the signature again on your side as an additional check, the algorithm is RSA with SHA-256 over the raw txMetaData string, and the signature is hex-encoded.
TxMetaData
The object you get from parsing txMetaData. It uses the same transaction and destination model as the API Co-signer callback handler’s transaction payload, though field values aren’t guaranteed to line up between the two (see the callouts below).
Identifiers
string
The transaction’s ID.
string
The workspace (tenant) ID.
string
The transaction’s operation type, e.g.
TRANSFER.string
The Fireblocks asset ID.
Initiator
string
The ID of the user or API user who created the transaction.
string
Usually the same as
userId.string
(Optional) Display name of the initiating user.
(Optional) The type of the initiating user.
(Optional) Initiator-related field, sent on some transactions.
Source
string
The source type, e.g.
VAULT.string
(Optional) The specific source subtype. An empty string when not applicable.
string
The source ID. Always a string here, unlike
metadata.srcId (above), which can be a number or a string.string
(Optional) Display name of the source, e.g. the vault account’s name. Can carry human-identifiable information, so handle it accordingly.
string
(Optional) Set for end-user-wallet sources. An empty string otherwise.
(Optional) Tags associated with the source.
Destination
Thedst* fields in this section are conditional. They are omitted for typed message signing and for burns with no destinations.
boolean
Whether this transaction uses the multi-destination
destinations array. Note the all-caps wire key, unusual among the otherwise camelCase fields here.string
(Conditional) The primary destination’s type, e.g.
ONE_TIME_ADDRESS. This value doesn’t necessarily match the dstType enum documented for the API Co-signer callback handler (ONE_TIME_ADDRESS here vs. ONE_TIME there, for what’s otherwise the same kind of destination).string
(Optional) The specific destination subtype. An empty string when not applicable.
string
(Conditional)
ONE_TIME or WHITELISTED.string
(Optional) The destination’s ID. Empty for one-time addresses.
string
(Optional) Display name of the destination, e.g. an exchange account or vault account name. Can carry human-identifiable information, so handle it accordingly.
string
(Conditional) The primary destination’s address.
string
(Conditional) The display form of
dstAddress.string
(Optional) Destination tag or memo, for chains that support one. Not present for this Solana example.
string
(Optional) The display form of
dstTag.Amounts and fees
number
The transfer amount.
string
The transfer amount as a string, for precision.
number
The USD value of the transfer.
string
(Optional) The USD exchange rate used to compute
amountUSD. Not always present, so don’t treat it as required.string
The fee level used, e.g.
MEDIUM.string
The asset the fee is paid in.
string
(Optional) The USD exchange rate used for the fee asset. Not always present, so don’t treat it as required.
boolean
(Optional) Whether the fee is deducted from the requested amount. Not always present, so don’t treat it as required.
boolean
(Optional) Whether cash-out is enabled for this transfer.
Blockchain details
string
The blockchain or network asset ID, e.g.
SOL_TEST.string
The network protocol, e.g.
SOL.boolean
Whether this is a testnet transaction.
string
(Optional) Chain-specific. For Solana, the blockhash used to build the transaction.
string
(Optional) Chain-specific. For Solana, the nonce account address.
Policy verdict
string
The policy verdict for the primary destination, e.g.
ALLOW.object
Details about the policy rule that produced the verdict. Same shape as
actionInfo in the API Co-signer callback handler payload: ruleType, byGlobalPolicy, byRule, capturedRuleV2, capturedRuleNumV2, rulesSnapshotId, and others.object
(Optional) Present when two-tier authorization applies. Same shape as
authorizationGroups in the API Co-signer callback handler payload; the exact shape varies by policy version. Observed as {"groups": []} when not applicable.string
The overall policy verdict for the transaction, e.g.
ALLOW. For a single-destination transfer, the same as action.string
The Fireblocks API or Console user ID designated to sign, per the matched policy rule.
array
The full list of designated signer IDs. For a
SINGLE designation, a single-element array matching signerId.Operation and chain-specific fields
These fields appear only for specific operations or blockchains. Their inner structure isn’t documented here; treat them as optional and parse them defensively.object
(Optional) Additional parameters. For raw signing, contains
rawMessageData, which describes the messages to sign: messages[] (each with content), derivationPath, algorithm, and preHash. Can also contain internal instrumentation such as sendToCoreStartTime (a Unix timestamp in milliseconds).(Conditional) Contract call data, for contract call transactions.
(Conditional) EIP-7702 authorizations, for EVM transactions that include them.
(Conditional) Decoded program call details, for Solana program calls.
(Conditional) Soroban smart contract call data, for Stellar.
(Conditional) Present for NFT transfers.
(Conditional) Present when the transaction carries a Travel Rule message.
Other fields
boolean
(Optional) Related to
HAS_DESTINATIONS; whether the multi-destination format is in use.object
(Optional) Enrichment data. Shares its wire key with
enrichmentJson in the API Co-signer callback handler payload, but the fields actually present vary by context. This is a loosely-typed bag, not a fixed schema. Observed here containing only templateMessageName (a string), which isn’t part of the schema documented on that page.object
(Optional) Additional context about how the transfer was initiated. Same wire key as
txAdditionalDetails in the API Co-signer callback handler payload, but again a loosely-typed bag. The fields observed here (availableBalance, isAutoCalculatedGasLimit, useBroadcastingService, useBroadcastOrchestrator, psv2MultiInstanceFlow) don’t match the fields documented on that page.object
(Optional) Reserved. Usually an empty object (
{}).object
(Optional) Reserved for Fireblocks use. Ignore it.
object
(Optional) Reserved for Fireblocks use. Ignore it.
destinations
Present when HAS_DESTINATIONS is true. Each entry:
string
Same value as the top-level
dstType for a single-destination transfer.string
(Optional) An empty string when not applicable.
string
ONE_TIME or WHITELISTED.string
This destination’s address.
string
(Optional) This destination’s ID. Empty for one-time addresses.
string
The display form of
dstAddress.string
(Optional) This destination’s tag or memo, for chains that support one.
string
(Optional) The display form of
dstTag.string
(Optional) Display name of this destination. Can carry human-identifiable information, so handle it accordingly.
(Optional) The destination wallet ID, where applicable.
(Optional) Address lookup data for this destination, where available.
(Optional) Transfer network details, where applicable.
(Optional) Tags associated with this destination.
number
The amount sent to this destination.
string
Same amount, as a string.
number
The USD value of the amount sent to this destination.
string
The policy verdict for this specific destination.
object
Same shape as the top-level
actionInfo above, scoped to this destination.object
(Optional) Same wire key as the top-level field above, scoped to this destination. Usually an empty object (
{}) here.object
(Optional) Same wire key as the top-level field above, scoped to this destination.
Example
An examplemetadata field for a Solana transfer (signatures and the payload to sign are shortened):
Changes to this page
- 14 October 2026: Corrected the types of
metadata.srcId,amount, andamountInt. Documented raw signing values, additionalsignInfoproperties, token and chain-specific flat fields, conditionaltxMetaDataanddestinationsfields, and the top-leveltimestampfield. Marked flat fields that some paths omit as optional. Removed the statement thatversionis sent in signing payloads. Added the Stability section.