Pull Funds via ACH
Pull funds from bank accounts directly into your account using the ACH network.
An ACH pull transaction allows you to debit funds from a bank account and credit them into your account within the system, using the ACH (Automated Clearing House) network. This method is commonly used to collect fees, commissions, or to fund accounts directly from external bank accounts.
PCE supports multiple source types, allowing you to pull funds from pre-linked accounts or one-time bank accounts.
Use ACH pull when you need to collect funds directly from a bank account.
- Account Funding: Add funds to your account from your own or a customer’s bank account
- Fee Collection: Automatically debit platform fees, subscriptions, or commissions
- Recurring Payments: Collect scheduled payments from pre-linked accounts
- Invoice Payments: Pull funds from customers for outstanding invoices
How it works
Processing an ACH pull transaction involves sending bank account details to the API and tracking the transaction lifecycle.
-
Make a POST request to
/v1/customer/id/{id}/transaction(orexternalId) API endpoint with required parameters:Parameter Required Description method✓ Set to ACHsource✓ Defines the bank account to be debited. Refer to the Source Types section below for supported options. destination.account.id(orexternalId)✓ The account within the system, to be credited amount✓ Amount to debit (in USD) Source Types
Pull from a Linked External AccountUse when the bank account is already linked to Priority.
Parameter Required Description source.externalAccount.idorexternalId✓ Identifier of the linked external account Best for:
- Recurring collections
- Funding your own accounts
Pull from a One-Time Bank AccountUse when debiting a bank account that is not pre-linked.
Only available for Business Customers
Requires enabling One-Time ACH Pull at the Program Manager levelParameter Required Description accountNumber✓ Bank account number routingNumber✓ 9-digit routing number holderName✓ Name of account holder type✓ SAVINGorCHECKINGholderType✓ CONSUMERorCORPORATE -
You can also pass, the
processingDetailobject which carries additional processing instructions for your transaction. While optional as a whole, certain fields within it may be required depending on your Program Manager configuration.Parameter Required Description processingDetail.processingModeRecommended Processing mode for the transaction.
Possible values:
-FORWARD(default) – Settles next business day (end-of-day batch)
-SAME_DAY– Settles same day if before cutoff, else next business dayprocessingDetail.companyNameRecommended The payee name populated in the NACHA file. Defaults to Program Manager configuration if not provided. processingDetail.companyDescriptionRecommended Short description shown on the bank statement. Common examples include Gas bill, Reg. Salary, PURCHASE. If not provided, the default configured value is used. processingDetail.authTypeConditional Authorization type used for the debit.
Possible values:
-WRITTEN– Signed authorization
-PHONE– Recorded call authorization
-ONLINE– Digital/web authorizationprocessingDetail.addendaRecommended Additional reference data for reconciliation.
Examples:
- Invoice number
- Customer reference ID
- Order ID -
Once the payment request is submitted, our system performs a series of system-level validations before sending the transaction to the card network. These validations check for:
- Missing or invalid required fields
- Incorrect parameter formats or values If any validation fails, the request is rejected immediately, and an error response is returned. You must correct the issue and resubmit the request. For a complete list of validation errors and how to resolve them, refer to the Error Codes & Messages section.
-
If all validations pass, the transaction is submitted for processing. You can track the outcome by:
- Retrieving the transaction via GET
/v1/customer/id/{id}/transaction/id/{id}(orexternalId) API endpoint - Subscribing to Transaction webhooks
Check the
statusfield to understand the current state of the transaction.
- Retrieving the transaction via GET
-
For every successfully created transaction, store:
id– Unique transaction identifierexternalId– Your reference identifier (if provided) These are required for tracking, reconciliation, and support.
Transaction Statuses
The table below describes the possible statuses of a Transaction wherein funds are pulled via ACH, and the reasons associated with each.
| Status | Description | Reason |
|---|---|---|
SCHEDULED | Default status on creation. | ON_USER_REQUEST |
PENDING | Transaction is on hold due to an inactive or blocked source or destination account. | EXTERNAL_ACCOUNT_BLOCKED, EXTERNAL_ACCOUNT_INACTIVE, ACCOUNT_INACTIVE, ACCOUNT_BLOCKED, ACCOUNT_CLOSURE_INITIATED, ACCOUNT_CLOSED, CUSTOMER_SUSPENDED |
PROCESSING | Transaction has been picked up for processing. | PROCESSING_IN_TRANSIT |
COMPLETED | Funds have been successfully realized and credited to the destination account after the good funds period. | PROCESSED_BY_SYSTEM, ACH direct collect processed |
FAILED | Transaction could not be processed within the allowed processing interval, or a return was received from the bank. | Collect processing interval lapsed, <return-description> (<return-code>) |
CANCELLED | Transaction was cancelled upon user request. | ON_CUSTOMER_REQUEST, INCORRECTLY_CREATED, OTHERS |
Best Practices
| Practice | Description |
|---|---|
| Retain Authorization Records | Per NACHA requirements, maintain proof of authorization for every ACH debit you initiate. You may be required to produce this within 10 days of a request. |
| Use the Correct Auth Type | Suggested to pass processingDetail.authType to accurately reflect how authorization was obtained — WRITTEN, PHONE, or ONLINE. |
| Validate Account Details | For One-Time transactions, verify the account and routing numbers before submitting the transaction to reduce the risk of returns. |
| Set Meaningful Descriptors | Suggested to populate processingDetail.companyName and processingDetail.companyDescription so that the debit is clearly identifiable on the account holder's bank statement. |
| Use Webhooks | Subscribe to transaction webhooks to stay informed about transaction outcomes asynchronously, without polling. |
| Test Your Integration | Use PCE's sandbox environment to test all the scenarios, including failures and returns, before going live. |
Updated 4 days ago