GuidesRecipesAPI ReferenceChangelog
Guides

Transaction Monitoring

Learn how Cybrid manages ACH return risk with automatic holds and auto-deny for medium-to-high-risk funding transfers.

ACH risk management

Cybrid analyzes each ACH funding deposit transfer to manage the risk of returns. Based on the Plaid Signal score for the originator, the platform determines whether a transfer can proceed, requires a hold, or is denied before submission to the payment rail.

Administrative hold

If the customer is considered high-risk, Cybrid automatically places a 2-day administrative hold on the transfer once it enters the pending state.

The hold captures ACH returns within the standard 2-day window, protecting your reserve account. If an ACH return occurs during the hold period, Cybrid credits the customer's external bank account instead. This ensures you can display accurate balances to end users.

Auto-deny: return_risk_exceeded

When the predicted probability of an ACH return is above Cybrid's threshold — based on Plaid Signal administrative and/or non-administrative return risk — the transfer is denied before submission to the payment rail. The transfer transitions to failed with failure_code: return_risk_exceeded.

ℹ️

Pre-flight decision, not an ACH return

return_risk_exceeded is a pre-flight risk decision based on third-party risk signals. It is not the result of an actual ACH return from the customer's bank.

The customer's external bank account is not automatically deleted when this failure code is returned. The account remains linked and usable; only the specific transfer is denied.

When a transfer fails with return_risk_exceeded, suggest one of the following paths to the customer:

  • Retry with a smaller deposit amount.
  • Try a different connected bank account.
  • Use an alternative funding method, such as an incoming wire to a deposit bank account.
  • Wait and retry — risk signals can improve over time.

For the full list of platform failure codes for funding transfers, see Fund via Plaid-Connected Bank Account.

ACH pull deposit transfer lifecycle

A transfer can progress through these states:

storingreviewingpendingholdingcompleted or failed

ℹ️

Conditional states

The reviewing and holding states are conditional and may not occur for every transfer.

Check if a transfer is on hold

Monitor the state field and hold_details block on any ACH pull funding deposit transfer.

API polling

Call GET /api/transfers/{transfer_guid} to retrieve hold details:

{
  "guid": "transfer_guid",
  "transfer_type": "funding",
  "side": "deposit",
  "payment_rail": "ach",
  "state": "holding",
  "hold_details": {
    "applicable_types": [
      "administrative"
    ],
    "duration": 172800,
    "started_at": "2024-01-15T10:30:00.000Z"
  }
}
  • applicable_types populates shortly after transfer creation, indicating the type of hold that will apply.
  • duration and started_at populate only after the hold begins.
  • Add started_at + duration to calculate when funds release to the platform_available balance in the customer's fiat account.

Webhook events

Subscribe to the transfer.holding webhook event. When it fires, call GET /api/transfers/{transfer_guid} to retrieve the hold details including duration and applicable_types.

Once the transfer enters pending, inspect hold_details to check whether applicable_types includes administrative.