Skip to main content
Transfer approvals apply to on-chain stablecoin transfers (Onchain Transfer, including batch transfers), Bridge, and Offramps. Onramps do not support approval workflows.

How Transfer Approvals Work

1

Create transfer with approval

Include requireApproval: true when creating a transfer via API.
2

Transfer enters pending state

Transfer status becomes PENDING_APPROVAL and does not execute. A corresponding TransferApproval record is created with status PENDING.
3

Admin notification

Admins who have opted in to transfer approval emails receive a notification about the pending approval.
4

Approve or reject

Authorized admins review and either approve or reject the transfer via POST /v3/transfer-approvals/{id}/approve or /reject.
5

Execution or cancellation

If approved, transfer proceeds (bridge and offramp move to quoting; onchain and batch transfers execute directly). If rejected, the transfer is cancelled.

Implementation Options

Transfer approvals work differently depending on where transactions are initiated:

Dashboard Approvals

When transfers are created in the HIFI Dashboard, whether the transfer requires approval depends only on the initiating profile’s organization role - not on transfer type:
  • Member-initiated transfers (wallet transfer, batch transfer, bridge, or offramp) always require Admin approval before execution.
  • Admin-initiated transfers execute without approval, regardless of type.

API Approvals

When using the API:
  • Include requireApproval: true when creating transfers.
  • Transfers enter the approval workflow until approved or rejected.
  • Supported on Onchain Transfer (single and batch), Bridge, and Offramp.
  • Transactions enter the transfer approval flow only if requireApproval: true is set in the request body - the dashboard role logic above does not apply to API-initiated transfers.
  • Can be integrated into your application’s approval logic.

Creating Transfers with Approval

Add the requireApproval parameter to any supported transaction endpoint. Request
Response
The transfer response itself does not embed the approval object - look up the approval separately via GET /v3/transfer-approvals?status=PENDING or GET /v3/transfer-approvals/{id}.

Supported Endpoints

The requireApproval parameter works with:
Bridging and Offramp Note: for bridging transfers and offramps, quotes are generated after approval. This prevents quotes from expiring while awaiting review.

Listing Pending Approvals

Retrieve all transactions awaiting approval. Cursor-paginated (limit, startingAfter, endingBefore); filter with status. Request
Response
transferType is one of CRYPTO_TRANSFER, BATCH_CRYPTO_TRANSFER, BRIDGE, OFFRAMP. fromDashboard and initiatorProfileId identify dashboard-initiated approvals; both are absent (false / null) for API-initiated ones. Use this endpoint to build approval dashboards or automate approval workflows.

Getting a Transfer Approval

Request
Response

Approving Transfers

Request
Response
comment is optional. After approval, onchain and batch transfers execute immediately; bridge and offramp transfers move to quoting (see the quote-timing note above) before executing.

Rejecting Transfers

Request
Response
The reject request body field is comment, the same as approve - not reason. The request body schema rejects unrecognized fields.
Rejected transfers are cancelled and will not execute.
Both approve and reject require the calling profile to have the ADMIN organization role, and the approval must belong to your organization - approvals scoped to other organizations return a 404.

Approval Status

Once APPROVED, the underlying transfer moves into its normal status progression (e.g. CREATEDINITIATED → … → COMPLETED).
No automatic expiration today: EXPIRED is a defined status value and appears in the webhook catalog, but nothing in the codebase currently transitions a PENDING approval to EXPIRED - there is no expiration job and no expiration window is enforced. A transfer left in PENDING_APPROVAL stays there indefinitely until an admin approves or rejects it.

Webhooks

TRANSFER_APPROVAL.CREATED and TRANSFER_APPROVAL.STATUS.PENDING are declared in the webhook event catalog but are never actually emitted - no webhook fires when an approval is created. Poll GET /v3/transfer-approvals?status=PENDING if you need to detect new pending approvals; subscribe to the two events above for the resolution.

Getting Help

  • 📧 Email: support@hifi.com
  • 💬 Slack: Message us in our shared Slack channel