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
return_risk_exceededWhen 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_exceededis 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:
storing → reviewing → pending → holding → completed or
failed
Conditional statesThe
reviewingandholdingstates 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_typespopulates shortly after transfer creation, indicating the type of hold that will apply.durationandstarted_atpopulate only after the hold begins.- Add
started_at+durationto calculate when funds release to theplatform_availablebalance 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.
Updated 7 days ago
