Workflows Run financial operations without manual drag

Turn recurring treasury, payment, and admin workflows into governed processes. Automate what is safe. Escalate what needs review.

dashboard northwind-treasury OrgID: or-01k11-419cq-efcanlnjan3oj2if
env: live sdk@dfns/sdk v0.6.12 V2.04Read patch notes docs
SummaryWebhooksAPI CredentialsKey stores
$ tail -f requests.log live
14:32:08.412 GET 200 /wallets/wa-4k9s2/assets sa-ci-deployer 81ms
14:32:08.207 POST 201 /wallets/wa-4k9s2/transfers us-3k8f2-a91mq 219ms
14:32:07.981 POST 200 /auth/action/init us-9pl4x-r7c3e 47ms
14:32:07.640 GET 200 /wallets?limit=50 sa-treasury-bot 69ms
14:32:07.118 POST 403 /policies us-7hq1c-m02zt 32ms
14:32:06.902 GET 200 /policies/approvals to-2nd8-x4kq 91ms
14:32:06.455 POST 202 /keys/key-7m3q/signatures sa-ci-deployer 301ms
14:32:06.031 GET 200 /networks/ethereum/fees us-3k8f2-a91mq 58ms
14:32:05.772 DELETE 204 /auth/pats/to-2nd8 us-9pl4x-r7c3e 44ms
14:32:05.310 GET 429 /wallets/wa-1p8x/history sa-treasury-bot 12ms
14:32:04.720 POST 200 /keys/ke-k9s2/signatures us-7hq1c-m02zt 12ms
14:32:04.203 GET 200 /networks/fees to-2nd8-x4kq 65ms
14:32:03.349 GET 200 /policies sa-ci-deployer 118ms
14:32:02.878 DELETE 204 /webhooks/wh-z3rd us-3k8f2-a91mq 171ms
PaxosVermont State BankFundBankFinaryCoinsubZulu
Compose

Build workflows
from real primitives

Service accounts, webhooks, policies, every primitive is composable. Wire them together to model anything you do today.

Service accounts

Machine identities with scoped permissions. One per workflow, one per environment. Audited like any user.

Webhooks on every event

Every state change emits a signed, idempotent event. Subscribe once, react forever. No polling, no drift.

Idempotent APIs

All endpoints accept external IDs. Retries are safe. Crashes recoverable. Duplicate requests return the initial response.

Dashboard Settings
Security
Control how members authenticate into this organization.
WebAuthn
Require a hardware key or platform passkey to sign in.
Single Sign-On
Let members sign in through your identity provider.
Manage Tokens
Add, price and verify the custom tokens this organization supports.
Developers
Programmatic access and network-level services.
Webhooks
Receive events for wallets, transfers and policies.
Personal Access Tokens
Generate tokens to authenticate API requests.
Fee Sponsorship
Cover network fees on behalf of your wallets.
Canton Validators
Manage the validator nodes securing your Canton network.
Compliance
Records kept for review and reporting.
Audit Logs
Every action taken across this organization, exportable for review.
Trigger

Events fire,
workflows run.

Inbound deposits. Pending approvals. Confirmed transactions. Policy violations. Wallet creations. Credential rotations. Every onchain or platform event can drive a workflow. The runtime is yours — DFNS delivers the signal.

Onchain events

Deposit detected, transaction confirmed, contract function called, balance crossed a threshold. Real-time across 100+ chains.

Platform events

Approval requested, wallet created, policy modified, credential rotated. Operational events, not just transactional ones.

Scheduled runs

Cron the routine. Sweep balances nightly. Rebalance yields monthly. Close books quarterly. Service accounts execute under policy on the schedule you set.

Notifications
12 unread of 12
AllUnreadApprovalsSecurity
Today
Transfer of 0,034 BTC needs your approval
Justin@gmail.com · Treasury Core · 2 of 3 signatures
Approval
Reject Approve
14:22
New device signed in from Paris
Chrome on macOS · IP 92.184.41.7
Security 13:04
12.400 ETH transfer confirmed
0×98ab12...77cd01f · 18 confirmations
Transfer 11:08
Policy change awaiting quorum
Sarah@northwind.co · 3-party quorum on Treasury
Approval
Reject Approve
10:47
2 transfers flagged for review
Sanctions screening · Settlement account
Compliance 09:12
Yesterday
3-party quorum policy attached to Treasury Core
Approved by Marc, Sarah and Justin
Policy 18:30
Marc added to the Admin user group
Granted approve and create permissions
Team 16:02
80,000 USDT transfer failed
Insufficient fee · 0×5512ab...41de99c
Transfer 12:41
Key rotation completed on 4 wallets
Treasury account · MPC key shares refreshed
Security 09:55
Earlier
Wallet creation awaiting approval
Marc@northwind.co · Ethereum · Settlement
Approval
Reject Approve
4 Mar
MiCA reserve breakdown ready to file
March 2026 · European Union
Compliance 3 Mar
Sarah removed from the Payments account
Access revoked by Thibault@dfns.co
Team 2 Mar
Decide

Programmable approvals,
in TypeScript

Service accounts read pending requests, decode the ABI-encoded call data, call any HTTP API or database, and post Approve / Reject / Abstain decisions. Plain TypeScript. No DSL. Your business rules, your code.

Maker / Checker pattern

Initiators and approvers are distinct identities. The platform enforces separation of duties cryptographically — no self-approval, no shortcuts. The four-eyes principle, encoded.

ABI-aware logic

Decode any smart contract call. Apply per-function rules. Allow mint to whitelisted recipients only. Cap transfer per call. Reject unknown selectors. Sanctions-screen any address.

Escalation paths

Service accounts handle the 95% routine. Humans handle the 5% exceptions. Abstain when uncertain — humans in the same approval group take it from there. Auto-escalation, not auto-rejection.

Operations
Recent Pending 7 Completed Failed
Date
Status
From (Sender)
To (Recipient)
Amount
Asset
Type
Approval
Sep 9
14:30
Pending
Treasury Vault
ETH
Kraken Corporate
0x4f2a…b71c
−10.5 ETH
−$35,400.00
ETH
Ethereum
Transfer
1 of 2 signed
Awaiting you
Sep 9
11:20
Pending
Hot Vault
USDC
Coinbase Prime
0x4f2a…b71c
−120,000 USDC
−$120,000.00
USDC
Polygon
Transfer
1 of 2 signed
Awaiting you
Sep 9
09:42
Pending
Settlement Vault
USDC
Anchorage Digital
0x2c88…a417
−340,000 USDC
−$340,000.00
USDC
Ethereum
Transfer
2 of 3 signed
Awaiting Sarah
Sep 8
16:10
Pending
Trading Vault
ETH
Uniswap v3
0x7a3f…e2d9
−4.2 ETH
−$14,280.00
ETH
Ethereum
Swap
0 of 2 signed
Awaiting you
Sep 8
10:35
Pending
Operating Vault
USDC
Payroll Batch 09
0x55ce…7d31
−86,400 USDC
−$86,400.00
USDC
Polygon
Payout
1 of 3 signed
Awaiting you
Sep 7
21:14
Pending
Hot Vault
BTC
Bitstamp
bc1q…4kd8
−0.75 BTC
−$43,500.00
BTC
Bitcoin
Transfer
1 of 2 signed
Awaiting Justin
Sep 7
11:06
Pending
Treasury Vault
USDC
Circle Redemption
0x91b0…cc28
−500,000 USDC
−$500,000.00
USDC
Ethereum
Transfer
1 of 3 signed
Awaiting Marc
Audit

Every step,
signed and logged

Every action — initiated, approved, signed, broadcast — is cryptographically attributed and stored. Non-repudiation by construction. Auditors and regulators read the same logs your ops team does.

Cryptographic provenance

Every decision is signed by the identity that made it. Service account or human, the chain of custody is unbroken and verifiable.

Full activity history

Filter by user, wallet, policy, contract, date. Export to CSV. Stream to your SIEM. Query through the API. The audit trail lives where you need it.

Compliance-ready

SOC2, ISO 27001. The audit trail satisfies internal and external review. No reconstruction, no excuses, no Excel exports.

Operations
Recent Pending 7 Completed Failed
Date
Status
From (Sender)
To (Recipient)
Amount
Asset
Type
Approval
Sep 9
14:30
Pending
Treasury Vault
ETH
Kraken Corporate
0x4f2a…b71c
−10.5 ETH
−$35,400.00
ETH
Ethereum
Transfer
1 of 2 signed
Awaiting you
Sep 9
13:05
Confirmed
Kraken Exchange
ETH
Trading Vault
ETH
+13.3 ETH
+$45,000.00
ETH
Ethereum
Deposit
Auto
Sep 9
12:18
Rejected
Hot Vault
BTC
Unverified Address
bc1q…8f9d
−0.31 BTC
−$18,000.00
BTC
Bitcoin
Block
—
Sep 9
11:20
Pending
Hot Vault
USDC
Coinbase Prime
0x4f2a…b71c
−120,000 USDC
−$120,000.00
USDC
Polygon
Transfer
1 of 2 signed
Awaiting you
Sep 9
09:42
Pending
Settlement Vault
USDC
Anchorage Digital
0x2c88…a417
−340,000 USDC
−$340,000.00
USDC
Ethereum
Transfer
2 of 3 signed
Awaiting Sarah
Sep 8
18:55
Confirmed
Fireblocks
USDC
Cold Storage Vault
USDC
+2,000,000 USDC
+$2,000,000.00
USDC
Polygon
Deposit
Auto
Sep 8
16:10
Pending
Trading Vault
ETH
Uniswap v3
0x7a3f…e2d9
−4.2 ETH
−$14,280.00
ETH
Ethereum
Swap
0 of 2 signed
Awaiting you
Sep 8
14:02
Failed
Yield Vault
ETH
Lido
0xae7a…10bb
−12.0 ETH
−$40,800.00
ETH
Ethereum
Stake
2 of 2 signed
Sep 8
10:35
Pending
Operating Vault
USDC
Payroll Batch 09
0x55ce…7d31
−86,400 USDC
−$86,400.00
USDC
Polygon
Payout
1 of 3 signed
Awaiting you
Sep 7
21:14
Pending
Hot Vault
BTC
Bitstamp
bc1q…4kd8
−0.75 BTC
−$43,500.00
BTC
Bitcoin
Transfer
1 of 2 signed
Awaiting Justin
Sep 7
17:48
Confirmed
Cold Storage Vault
BTC
Hot Vault
BTC
−2.10 BTC
−$121,800.00
BTC
Bitcoin
Transfer
3 of 3 signed
Sep 7
11:06
Pending
Treasury Vault
USDC
Circle Redemption
0x91b0…cc28
−500,000 USDC
−$500,000.00
USDC
Ethereum
Transfer
1 of 3 signed
Awaiting Marc

Discover how Nilos runs operations on DFNS.

As a regulated custodian committed to the highest standards of compliance, our partnership with DFNS has been crucial. Their security best practices, programmatic developer tools, and robust infrastructure help us carry out carefully controlled operations. We also appreciate their team as they provide responsive support and sub-hour troubleshooting.

Raphaël Fettaya CEO, Nilos
Maker, checker, watcher

Service accounts handle the routine. Humans handle the exceptions. DFNS tracks everything that happens in-between.

Events to actions

Every onchain or platform state change fires a signed webhook. Every webhook drives a workflow. No polling, no miss.

Programmable in TypeScript

No DSL to learn. Decode any ABI, call any HTTP API, query any database, post any decision. The runtime is your stack.

Audited end to end

Every action, every approval, every API call, cryptographically signed and logged. Non-repudiation without paperwork.


Four steps to a workflow that runs itself

Provision a service account. Subscribe to the events that matter. Codify the decisions. Audit everything. Production-ready in days.

Service accounts handle 95%+ of routine operations · Webhooks fire within milliseconds · Every action cryptographically signed · 0 lost events

Spin up a service account, scoped to one job.

A machine identity with the narrowest permission set that does the job. One service account per workflow. One per environment. One per failure radius.

// Create a scoped service account for your settlement workflow
const checker = await dfnsApi.auth.createServiceAccount({
  body: {
    name: "settlement-checker-prod",
    publicKey: "-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----",
    permissionId: "pm-settlement-checker-v1",  // approve-only, no broadcast
    daysValid: 365
  }
});

// checker.id, checker.accessToken — credentials go to your secret store
// This identity can read pending approvals and post decisions. Nothing else.
Treat service accounts like microservices. One job, one identity. Scope permissions to the minimum that lets the workflow do its work. Rotate keys on a calendar.

Wire webhooks to the events that drive the workflow.

Subscribe once to the events that matter. DFNS delivers them signed and idempotent. Your handler is whatever you want it to be — a Lambda, a worker, a cron job, an Express endpoint.

// React to every event that matters to settlement
await dfnsApi.webhooks.createWebhook({
  body: {
    url: "https://workflows.yourbank.com/dfns/events",
    events: [
      "policy.approval.pending",           // a transaction needs a decision
      "wallets.transfer.confirmed",        // settlement landed, post to ledger
      "wallets.transfer.failed",           // settlement failed, escalate
      "wallets.transaction.broadcasted"    // broadcast confirmed, update CRM
    ]
  }
});

// Webhooks are signed (verify the X-Dfns-Signature header) and idempotent
// Deduplicate on deliveryId — at-least-once, never less
Verify the webhook signature on every payload. Deduplicate on deliveryId. Acknowledge fast (return 2xx) and process async. Slow handlers cause retries you don't want.

Codify the business rules. Approve, reject, or abstain.

Service accounts read the pending approval, decode the call data, run your rules, and post a decision. Approve when sure. Reject when malicious. Abstain when uncertain — humans take it from there.

// On 'policy.approval.pending' — your handler runs
async function onApprovalPending(event) {
  const approval = await dfnsApi.policies.getApproval({ approvalId: event.approvalId });
  const { to, data } = approval.activity.transactionRequest.requestBody;

  // Always validate the contract is in your allowlist BEFORE decoding
  if (!CONTRACT_ALLOWLIST.has(to.toLowerCase())) {
    return abstain(approval.id);  // human reviews, don't auto-reject
  }

  const decoded = decodeFunctionData({ abi, data });

  if (decoded.functionName === "mint") {
    const [recipient, amount] = decoded.args;
    const sanctionsHit  = await sanctions.check(recipient);           // any API
    const dailyMinted   = await ledger.getMintedToday(approval.activity.walletId);

    if (sanctionsHit)                          return reject(approval.id, "Sanctions match");
    if (amount > MAX_PER_TX)                   return abstain(approval.id);  // escalate
    if (dailyMinted + amount > DAILY_CAP)      return abstain(approval.id);

    return approve(approval.id, "Mint within policy");
  }

  return abstain(approval.id);  // unknown function, human decides
}
Pin the ABI to a trusted contract allowlist before decoding. Prefer abstaining over rejecting when uncertain — rejections are final, abstentions defer to humans in the same group. Reject only on unambiguous threats.

Review, export, prove.

Every decision is signed by the identity that made it. Every event is queryable. Pull last month's decisions in one call. Stream them into your SIEM. Hand them to your auditor without screenshots.

// Every decision is signed and queryable
const decisions = await dfnsApi.policies.listApprovalDecisions({
  query: {
    approverId: "sa-settlement-checker-prod-...",
    dateFrom: "2026-05-01",
    dateTo: "2026-05-31"
  }
});

// decisions.items[i] — id, approvalId, decision, reason, signature, timestamp
// Pipe to your audit warehouse, your SIEM, your monthly compliance report
// Verify signatures end to end if you need to prove provenance independently
Track approval latency, escalation rate, and false-positive rate. If the checker escalates too often, the rules are too tight. If it never escalates, the checks aren't thorough enough. Tune like any other production system.
Org → Service Accounts → New → Permission Set + Public Key
Org → Service Accounts → New → Permission Set + Public Key
Settings → Webhooks → New Endpoint → Subscribe to Events
Settings → Webhooks → New Endpoint → Subscribe to Events
Activity → Approvals → Filter by Approver: Service Account → Decisions
Activity → Approvals → Filter by Approver: Service Account → Decisions
Activity → Filter by Identity / Wallet / Date → Export CSV / Stream
Activity → Filter by Identity / Wallet / Date → Export CSV / Stream
FAQ

Common questions
about financial workflow automation

What are financial workflows in the context of digital assets?
Financial workflows are governed, automated sequences for recurring operations — payments, treasury sweeps, token distributions, and admin tasks. DFNS workflows are built on real operational primitives: events trigger actions, every action is signed by MPC, and every step is logged. No automated action can bypass your governance policies.
What types of workflows can I automate with DFNS?
DFNS supports automated treasury sweeps, scheduled payments, batch token distributions, wallet provisioning, and approval escalation chains. Workflows can be triggered by onchain events, webhooks, time schedules, or API calls. Complex multi-step flows — collect, convert, pay — are composed from the same governance-enforced primitives as manual operations.
Can I write custom workflow logic?
Yes. DFNS exposes a TypeScript SDK for building custom workflow logic. Standard workflow templates cover the most common treasury and payment patterns; the SDK lets you compose custom sequences using wallet operations, policy checks, and signing primitives. Every custom workflow inherits the same audit trail and policy enforcement as built-in flows.
How does DFNS ensure automated workflows remain compliant?
Every step in a DFNS workflow is subject to the same policy engine as manual operations. Approvals, velocity caps, and KYT checks cannot be bypassed by automation. If a workflow step fails a policy check, it is escalated for human review — not silently dropped or auto-approved. The full decision trail is logged for audit.
Contact us