Pull Funds via Wire

Pull funds from bank accounts directly into your account using the Wire network

A Wire pull transaction allows you to debit funds from an external bank account and credit them into your account within the system using the Wire network. Unlike ACH, Wire transfers offer faster settlement and are best suited for high-value, time-sensitive transactions between business accounts.

PCE supports multiple source types, allowing you to pull funds from pre-linked accounts or one-time bank accounts.

Wire pull transactions are processed as Wire Drawdowns—a reverse wire initiated by the recipient (you) to pull funds from the payer’s account with their authorization. This feature is available for Business Customers only.

Use Wire pull when you need to collect high-value or time-sensitive funds.

  • High-Value Transfers: Move large amounts quickly between business accounts
  • Time-Sensitive Payments: Urgent fund collection where faster settlement is required
  • Account Funding: Add funds to your account from external bank accounts
  • Business Collections: Pull payments from corporate customers

How it works

Processing a Wire pull transaction involves sending bank account details to the API and tracking the transaction lifecycle.

  1. Make a POST request to /v1/customer/id/{id}/transaction (or externalId) API endpoint with required parameters: 

    ParameterRequiredDescription
    methodSet to WIRE
    sourceDefines the bank account to be debited. Refer to the Source Types section below for supported options
    destination.account.id (or externalId)The account within the system to be credited
    amountAmount to debit (in USD). Must be greater than zero
    purposePurpose of the transaction. Maximum 128 characters
    Source Types

    Pull from a Linked External Account

    Use when the bank account is already linked to Priority.

    ParameterRequiredDescription
    source.externalAccount.id or externalIdIdentifier of the linked external account

    Best for:

    • Recurring collections
    • Funding your own accounts

    Pull from a One-Time Bank Account

    Use when debiting a bank account that is not pre-linked.

    Only available for Business Customers

    ParameterRequiredDescription
    accountNumberBank account number
    routingNumber9-digit routing number
    wireRoutingNumberWire-specific routing number
    holderNameName of account holder
    typeSAVING or CHECKING
    holderTypeCONSUMER or CORPORATE
  2. You can also pass, the processingDetail object 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. 

    ParameterRequiredDescription
    processingDetail.memoOptionalShort descriptor for the transaction (max 40 characters)
    processingDetail.originatorSystem GeneratedOriginating financial institution (auto-populated)
    processingDetail.payor.nameOptionalName of the payor (max 23 characters)
    processingDetail.payor.emailOptionalPayor email address (max 80 characters)
    processingDetail.payor.phoneOptionalPayor phone number (format: XXX-XXX-XXXX)
    processingDetail.payor.address.addressLine1OptionalAddress line 1 (max 35 characters)
    processingDetail.payor.address.addressLine2OptionalAddress line 2 (max 35 characters)
    processingDetail.payor.address.cityOptionalCity (max 25 characters)
    processingDetail.payor.address.stateOptionalState (2–3 characters, e.g., TX, CAL)
    processingDetail.payor.address.zipOptionalZIP code (max 9 characters)
    processingDetail.payor.address.countryOptionalCountry (2-character code, e.g., US)

    Payor details are required only if payor validation is enabled at the Program Manager level. When provided, these details help identify the originating party and improve reconciliation.

  3. 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:

    1. Missing or invalid required fields
    2. 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. 
  4. If all validations pass, the transaction is submitted for processing. You can track the outcome by: 

    1. Retrieving the transaction via GET /v1/customer/id/{id}/transaction/id/{id} (or externalId) API endpoint
    2. Subscribing to Transaction webhooks Check the status field to understand the current state of the transaction.
  5. For every successfully created transaction, store: 

    1. id – Unique transaction identifier
    2. externalId – 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.

StatusDescriptionReason
SCHEDULEDDefault status on creationON_USER_REQUEST
PENDINGTransaction is on hold due to account issuesAccount or external account restrictions
PROCESSINGTransaction is in progressPROCESSING_IN_TRANSIT
COMPLETEDFunds successfully credited to destination accountPROCESSED_BY_SYSTEM, Wire direct collect processed
FAILEDTransaction failed or was rejected by bankReturn codes or processing failure
CANCELLEDCancelled upon requestUser/system-triggered

Best Practices

PracticeDescription
Obtain authorization before initiatingEnsure proper authorization from the account holder before initiating a Wire pull
Verify account and routing detailsDouble-check routing and wire details, as wire transactions are difficult to reverse
Use a meaningful purposeClearly define the purpose field for better tracking and reconciliation
Use memo for trackingPopulate processingDetail.memo with recognizable identifiers
Use webhooksSubscribe to webhooks for real-time transaction updates
Test your integrationValidate all scenarios in sandbox before going live


.readme-logo { display: none !important; }