Pre-release — contact your Fortary account team for access.
data payload specific to the event kind. Your webhook only receives the kinds it subscribed to.
The event envelope
| Field | Description |
|---|---|
id | Unique event id (evt_…). Stable across retries and redeliveries — deduplicate on it |
kind | The event kind, resource.action (e.g. transaction.confirmed) |
schemaVersion | Integer version of this kind’s data schema |
date | When the event occurred (not when it was delivered) — order on it |
entityId | The entity the event belongs to |
vaultIds | Vaults involved; empty for non-vault-scoped kinds; can contain several vaults for UTXO transactions |
data | Kind-specific payload, documented below |
Asset amounts are strings in atomic units;
amountUsd valuations are indicative JSON numbers. Timestamps are ISO-8601 UTC (Z), absent values are explicit null, and IDs are opaque prefixed strings — pass back exactly what you received.Event kinds
| Kind | Fires when |
|---|---|
transaction.requested | A transaction request is submitted and enters approval |
transaction.approved | The request passes its approval policy |
transaction.rejected | The request is rejected by an approver |
transaction.expired | The request expires before collecting the required approvals |
transaction.broadcasted | The transaction is submitted to the network and receives its on-chain hash |
transaction.confirmed | The transaction reaches the required confirmation depth |
transaction.failed | The transaction’s on-chain execution fails |
address.created | A deposit address is issued for a vault |
Transaction lifecycle
A custody transaction is correlated bytxRequestId until broadcast and by txHash after it — transaction.broadcasted carries both:
transaction.confirmed.
transaction.requested, transaction.approved, transaction.rejected, transaction.expired
The approval-phase events share one payload — the request’s identity and network. Authoritative amounts arrive with transaction.confirmed.
txRequestId— the transaction request’s identifier; also present ontransaction.broadcastedfor correlation.networkId— the network, as a CAIP-2 id (e.g.eip155:43114for Avalanche C-Chain).
transaction.broadcasted
Fires when the transaction is submitted to the network, joining the request-phase identity (txRequestId) to the on-chain identity (txHash). No amounts yet — nothing is decoded at broadcast time.
transaction.confirmed and transaction.failed
Both carry a full snapshot of the transaction as observed on-chain — the same shape, distinguished by status. Example: an incoming AVAX deposit —
status—CONFIRMEDorFAILED.transaction.failedis only delivered for outgoing transactions — a deposit that fails on-chain produces no event.amounts— one entry per asset movement touching your vaults.directionisCREDITorDEBIT;amountis a string in the asset’s atomic unit;amountUsdmay benullwhen no price is available.asset—kind: "native"(assetIdis the bare CAIP-2 network id) orkind: "token", which addsnamespace(erc20orspl) andcontractAddress.fee— the network fee, ornullwhen it wasn’t paid by you (typical for deposits).flow— the transaction’s direction relative to your vaults:incoming,outgoing,internal, ortrade.blockNumber— may benullon networks without block-height semantics.
address.created
Fires when a deposit address is issued. The vault is in the envelope’s vaultIds.
Schema versioning
Each kind’sdata payload is versioned via schemaVersion. Additive changes ship under the same version — treat unknown fields as forward-compatible. Breaking changes increment the version and are announced in the changelog.
