Collect via Wire

Collect funds from a payer's bank account into your account by wire drawdown.

Collect via Wire pulls funds from a payer's external bank account and credits them into a Passport Account using the wire network. It's a wire drawdown: a reverse wire you initiate to pull funds from the payer's account with their authorization. Unlike ACH, wire offers faster settlement and suits high-value, time-sensitive collections. This feature is available for Business Customers only. For the full field list, jump to the Request reference.

Pulling funds into your own Passport Account from your own bank is a transfer of your own money, not a collection. See Transfer funds → Fund from your own bank (wire).

Common use cases

  • Collect a high-value payment from a business customer or counterparty
  • Pull time-sensitive funds where same-day settlement is required
  • Collect capital calls, settlements, or large B2B payments
  • Collect a recurring high-value payment from a saved payer
🏦

External Account or Contact?

To collect from a third-party payer (a customer or counterparty), save them as a Contact, which stores their bank details inside the contact entity, then reference the contact as the source. Wire collections are only supported from a saved Contact, not from inline one-time bank details. A saved External Account is the customer's own account; pulling from it is a transfer (Transfer funds), not a collection. Don't repurpose a saved External Account to collect from a third party.


Make your first collection

The fastest way to see it work: collect from a saved payer (Contact) into a Passport Account with the minimal fields below. The full set of options is in the Request reference.

POST /v1/customer/id/{id}/transaction

{
  "externalId": "wire-collect-first-001",
  "method": "WIRE",
  "amount": "25000.00",
  "purpose": "Wire drawdown",
  "source": {
    "contact": {
      "externalId": "payer-contact-001",
      "externalAccount": { "externalId": "payer-bank-001" }
    }
  },
  "destination": { "account": { "externalId": "passport-account-001" } }
}

You'll get back a transaction with status: SCHEDULED. Store the returned id and your externalId to track it and for reconciliation.

📘

Use externalId for safe retries

For Treasury, PCE treats the externalId in the request body as the idempotency key; there's no separate header. Send a unique externalId per collection, and retrying with the same value creates it only once.

📘

Get authorization before you pull

A wire drawdown pulls money from the payer's account, so you must hold their authorization before you initiate it. Keep the proof and be ready to produce it if requested.


Scenarios

Every wire pull follows the transaction lifecycle. Wire pulls are processed as wire drawdowns and are available for Business Customers only. You collect from a payer you've saved as a Contact.

sequenceDiagram
    participant You as Your Application
    participant PCE as PCE
    participant Fed as Wire Network (Fedwire)
    participant Bank as Payer's Bank

    You->>PCE: POST /v1/customer/id/{id}/transaction (method: WIRE)
    PCE-->>You: 201 Created (status: SCHEDULED)
    PCE->>Fed: Send wire drawdown request
    Fed->>Bank: Forward drawdown instruction
    Bank-->>Fed: Approve and send funds
    Fed-->>PCE: Funds received
    alt Success
        PCE-->>You: Webhook (status: COMPLETED)
    else Rejected by bank
        PCE-->>You: Webhook (status: FAILED)
    end

Before you begin (all scenarios)

  • The destination Passport Account you're crediting is active.
  • You hold the payer's authorization for the wire drawdown.
  • Your program is configured to support wire pull (Business Customers only).

Scenario 1: Collect a high-value payment from a saved payer

(collect from a saved Contact)

Use this when you collect a large or time-sensitive payment from a business customer or counterparty you'll bill again: capital calls, real estate closings, or recurring B2B settlements where same-day finality matters. Save the payer once as a Contact, then reference the contact on every collection.

You'll also need: the payer saved as a Contact with a linked External Account that includes wire routing details, and their authorization for the drawdown.

Request

POST /v1/customer/id/{id}/transaction

{
  "externalId": "settlement-wire-0091",
  "method": "WIRE",
  "amount": "50000.00",
  "purpose": "Capital call Q1",
  "source": {
    "contact": {
      "id": 55120,
      "externalAccount": { "id": 77234 }
    }
  },
  "destination": {
    "account": {
      "id": 91045
    }
  },
  "processingDetail": {
    "memo": "Cap Call Q1 2025"
  }
}

Response

{
  "id": 401522,
  "externalId": "settlement-wire-0091",
  "status": "SCHEDULED",
  "statusReason": "ON_USER_REQUEST",
  "method": "WIRE",
  "amount": 50000.00,
  "purpose": "Capital call Q1",
  "type": "REGULAR",
  "source": {
    "contact": {
      "id": 55120
    }
  },
  "destination": {
    "account": {
      "id": 91045
    }
  }
}

Track the transaction

Subscribe to webhooks or retrieve the transaction via GET /v1/customer/id/{id}/transaction/id/{id} to follow it to settlement. Because a wire drawdown settles only after the payer's bank approves and sends the funds, watch for the status change rather than assuming success on submit. The statuses, the webhook payload, and the event types all live in Transaction lifecycle.


Request reference

The complete set of fields for the create-transaction request. Scenarios above use subsets of these.

Core parameters

ParameterRequiredDescription
methodSet to WIRE
externalIdRecommendedYour own reference ID, also the idempotency key. Retrying with the same value won't create a duplicate.
sourceThe bank account to debit. See Source types for the supported shapes.
destination.account.id (or externalId)The Passport Account to credit
amountAmount to debit (in USD). Must be greater than zero.
purposePurpose of the transaction. Maximum 128 characters.

Source types

Wire collections use one source shape: a payer you've saved as a Contact.

Saved Contact (a payer you collect from)

ParameterRequiredDescription
source.contact.id or externalIdUnique identifier of the Contact
source.contact.externalAccount.id or externalIdUnique identifier of the External Account linked to the Contact
📘

Pulling from your own account?

Referencing a saved External Account you own sends the drawdown to your own bank. That's a transfer, covered on Transfer funds → Fund from your own bank (wire), not here.

Processing detail

Optional as a whole, but certain fields may be required depending on your program's configuration.

ParameterRequiredDescription
processingDetail.memoOptionalShort descriptor for the transaction (max 40 characters)
processingDetail.originatorSystem-generatedOriginating financial institution (auto-populated)
processingDetail.payor.nameConditionalName of the payor (max 23 characters)
processingDetail.payor.emailConditionalPayor email address (max 80 characters)
processingDetail.payor.phoneConditionalPayor phone number (format: XXX-XXX-XXXX)
processingDetail.payor.address.addressLine1ConditionalAddress line 1 (max 35 characters)
processingDetail.payor.address.addressLine2ConditionalAddress line 2 (max 35 characters)
processingDetail.payor.address.cityConditionalCity (max 25 characters)
processingDetail.payor.address.stateConditionalState (2-3 characters, e.g., TX)
processingDetail.payor.address.zipConditionalZIP code (max 9 characters)
processingDetail.payor.address.countryConditionalCountry (2-character code, e.g., US)

Payor details are required only if payor validation is enabled for your program. When provided, they help identify the originating party and improve reconciliation.

Validation

The prerequisites above are the validations, and PCE enforces them when you submit. A submission is checked synchronously; if a check fails, the request returns an error and no transaction is created. Submission checks:

  • Required fields are present and correctly formatted.
  • The destination Passport Account is active.
  • The source resolves to a saved Contact with wire routing details.
  • Authorization for the drawdown is present, and wire pull is enabled for your program.

Other conditions can only be judged once the pull is in flight, such as an inactive or blocked account, a compliance hold, or a bank rejection. These surface after creation as PENDING or FAILED; see Transaction lifecycle. For error codes, see Error Codes and Messages.


Statuses

Collect via Wire uses the shared transaction lifecycle. See it for every status, the reasons, and how to track a transaction.

If a wire pull fails

A wire pull moves to FAILED when the payer's bank rejects the drawdown or the processing interval lapses without settlement (the reason is in the status reason). A PENDING pull is on hold because the source or destination account is inactive or blocked. In both cases, resolve the underlying issue and submit a new pull. For the specific error codes, see Transactions Error codes. Test these paths in the sandbox before going live.


Go live

The shared pre-production checklist (production credentials, webhook subscription and signature validation, idempotency, and sandbox testing) is in Getting Started. Specific to collecting via wire, also confirm:

  • Wire pull (wire drawdown) is enabled for your program (Business Customers only).
  • You hold valid authorization for every drawdown and can produce the proof.
  • If payor validation is enabled for your program, you pass the required payor details.

Best practices

General practices (set a unique externalId, subscribe to webhooks, test in sandbox) are in Getting Started. Specific to collecting via wire:

PracticeDescription
Obtain authorization before initiatingHold the account holder's authorization before initiating a wire drawdown.
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.

Next steps

See also



Did this page help you?