On-Ramping USD (ACH Pull Payments)
This guide details the process for on-ramping USD from US-based bank accounts. This flow utilizes an ACH "pull" mechanism, which is different from our standard push-based on-ramps. It involves a one-time setup to link a user's bank account, followed by repeatable API calls to pull funds.
🤔 What is ACH Pull?
An ACH Pull lets a user permit Unblock to withdraw funds from a linked bank account. Plaid manages the secure bank connection. Your system never handles bank login credentials.
➡️ USD On-Ramp Flow with ACH Pull
- Create ACH profile for the user in Unblock.
- Create the bank link via API and receive a Plaid Link URL
- Load Plaid Link so the user confirms the same bank account.
- Verify link status until the account is
ACTIVE. - Initiate the ACH pull for a chosen USD amount.
- Monitor webhooks as the transfer and conversion progress.
⚙️ Integration Steps
Step 1: Ensure User Is Ready and Create ACH Profile
The user must be verified as FULL_USER. Then create their ACH profile:
API reference:
Create a user profile for linking bank accounts
curl --request POST \
--url https://sandbox.getunblock.com/user/linked-bank-account/profile \
--header 'Authorization: API-Key <YOUR_API_KEY>' \
--header 'unblock-session-id: <USER_SESSION_ID>' \
--header 'content-type: application/json' \
--data '
{
"currency": "USD",
"investment_objective": "INCOME",
"annual_income_range": "UNDER_25K"
}Step 2: Create Bank Link and Get Plaid Link URL
Call Unblock to start the bank linking process. You must send the bank account details you expect the user to confirm.
This request returns a Plaid Link URL. You will load this URL on your frontend in the next step.
API reference:
Link bank account
curl --request PUT \
--url https://sandbox.getunblock.com/user/linked-bank-account/link \
--header 'Authorization: API-Key <YOUR_API_KEY>' \
--header 'unblock-session-id: <USER_SESSION_ID>' \
--header 'content-type: application/json' \
--data '
{
"currency": "USD",
"account_type": "checking",
"account_number": "1234567890",
"routing_number": "021000021"
}The response includes a Plaid Link URL used to confirm this account.
Step 3: Load Plaid Link and Have the User Confirm the Account
Open the Plaid Link URL returned in Step 2 on your frontend.
The user must select the same bank account that matches the account and routing numbers sent to Unblock.
Plaid handles authentication and consent. You do not receive bank credentials.
If the user selects a different account, the link will fail.
Step 4: Verify the Link Status
After starting the link process, poll Unblock until the linked account becomes ACTIVE.
API reference:
Get linked bank account info
Unlink if needed:
Unlink bank account
Request
curl --request GET \
--url https://sandbox.getunblock.com/user/linked-bank-account \
--header 'Authorization: API-Key <YOUR_API_KEY>' \
--header 'unblock-session-id: <USER_SESSION_ID>'Successful Response Example
{
"profile_uuid": "5594401c-0072-4df2-be9c-d491c0754c21",
"status": "ACTIVE",
"linked_bank_accounts": [
{
"uuid": "abcdef01-1234-5678-90ab-cdef01234567",
"status": "ACTIVE",
"currency": "USD",
"account_number": "******7890",
"routing_number": "021000021",
"account_type": "CHECKING",
"bank_name": "Chase Bank"
}
]
}If the status is FAILED, the routing or account number likely did not match the account selected in Plaid. The user should unlink and try again.
Step 5: Initiate an ACH Pull
When the account is ACTIVE, start an ACH pull.
API reference:
Withdraw funds from linked bank account
Request
curl --request POST \
--url https://sandbox.getunblock.com/user/linked-bank-account/pull \
--header 'Authorization: API-Key <YOUR_API_KEY>' \
--header 'unblock-session-id: <USER_SESSION_ID>' \
--header 'content-type: application/json' \
--data '
{
"currency": "USD",
"amount": 100.00
}The response includes a process_uuid that you can use for tracking.
Key Considerations for USD ACH On-Ramps
Prerequisites
-
User must be a
FULL_USER. To reach this status, the user must provide all required applicant data:- Date of birth
- Country
- Phone
- TIN (SSN)
The user must also accept the Terms & Conditions through the SDK,
or submit thethird_party_end_user_agreement_hashesdocument signed by the user
usingPOST /user. -
Create the ACH profile before linking: API reference:
Create a user profile for linking bank accountsOne Linked Account at a Time
A user can have only one linked bank account.
To switch accounts:
API reference:
Unlink bank account
DELETE /user/linked-bank-account/unlinkAfter unlinking, restart the linking flow from the beginning.
Settlement Time
ACH transfers take several business days to complete.
You will receive webhook events such as:
OUTSIDE_TRANSFER_RECEIVED
These confirm when funds clear and when the conversion process begins.
Error Handling
A FAILED status on the linked bank account usually means the routing or account number did not match what Plaid returned.
Have the user unlink and repeat the linking steps.
Private Sandbox Testing
When testing in Sandbox, you must use mock data that matches the bank account selected in Plaid.
Plaid step
- Select the bank account that ends with
0000
Manual bank account details
{
"currency": "USD",
"account_type": "checking",
"account_number": "4929500000",
"routing_number": "011000138"
}Updated 23 days ago
