Pay via International Wire

Send USD and non-USD payouts to international bank accounts using the wire network.

Pay via International Wire sends funds from a Passport Account to a bank account in another country using the international wire network. Use it for cross-border vendor payments, global supplier disbursements, and international transfers. You can send in USD or convert to a supported non-USD currency with an FX quote. For the full field list, jump to the Request reference.

Common use cases

  • Pay international vendors, suppliers, or service providers
  • Transfer funds to your own international bank account
  • Send cross-border business disbursements
  • Pay saved Contacts with international account details

Choose the currency path

Before creating the transaction, decide whether you're sending USD or non-USD. The currency path determines the required fields.

Currency pathWhen to useRequired fields
USD International WireDestination account receives funds in USDcurrency: USD
Non-USD International WireDestination account receives funds in a supported non-USD currencycurrency, amountOriginType, optionally fxQuote.id

USD path

Set currency to USD. No FX quote or amountOriginType is needed.

Non-USD path

Set currency to the destination currency (e.g., EUR, GBP). Provide amountOriginType:

  • SOURCE — the amount is what's debited from your Passport Account (USD)
  • DESTINATION — the amount is what the recipient receives in their currency

Optionally fetch an FX quote first. If you don't, the system fetches one automatically.


Make your first international wire payout

The fastest way to see it work: send USD to a saved international account with the minimal fields below. The full set of options is in the Request reference.

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

{
  "externalId": "intl-wire-first-001",
  "method": "INTERNATIONAL_WIRE",
  "amount": "10000.00",
  "currency": "USD",
  "purpose": "International Vendor Payment",
  "source": { "account": { "externalId": "passport-account-001" } },
  "destination": {
    "internationalExternalAccount": { "id": "intl-account-001" }
  }
}

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

📘

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 payout, and retrying with the same value creates it only once.


Scenarios

Every international wire payout follows the transaction lifecycle. The only things that change per scenario are the destination and whether FX conversion is needed.

sequenceDiagram
    participant You as Your Application
    participant PCE as PCE
    participant SWIFT as SWIFT Network
    participant Bank as Beneficiary Bank

    You->>PCE: POST /v1/customer/id/{id}/transaction (method: INTERNATIONAL_WIRE)
    PCE->>PCE: Validate + OFAC screening + compliance
    alt Non-USD currency
        Note over PCE: Fetch FX quote (auto or manual)
        PCE->>PCE: Lock exchange rate
    end
    PCE-->>You: 201 Created (status: SCHEDULED)
    PCE->>SWIFT: Route via correspondent bank — PROCESSING
    SWIFT->>Bank: Deliver funds to beneficiary
    Bank-->>SWIFT: Settlement confirmation
    SWIFT-->>PCE: Wire settled
    PCE-->>You: Webhook (status: COMPLETED)

Before you begin (all scenarios)

  • The Passport Account you're paying from is active and has enough balance to cover the payout.
  • For non-USD payouts, understand the destination country/currency requirements via the List Metadata endpoint.

Each scenario below adds requirements specific to its destination and currency path.

Scenario 1: USD payout to a saved International External Account

(your own international bank account)

Use this to send USD to your own international bank account that you've already saved. No FX conversion needed.

You'll also need: the destination saved as an International External Account configured to receive USD.

Request

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

{
  "externalId": "intl-wire-usd-prelinked-001",
  "method": "INTERNATIONAL_WIRE",
  "type": "REGULAR",
  "amount": "15000.00",
  "currency": "USD",
  "purpose": "International Vendor Payment",
  "source": { "account": { "externalId": "passport-account-001" } },
  "destination": {
    "internationalExternalAccount": { "id": "intl-account-001" }
  },
  "processingDetail": { "memo": "Q1 Services" }
}

Response

{
  "resourceName": "transaction",
  "url": "/v1/customer/id/4225975/transaction/id/230491700",
  "id": 230491700,
  "externalId": "intl-wire-usd-prelinked-001",
  "status": "SCHEDULED",
  "statusDate": "06/29/2026 14:20:55",
  "amount": 15000,
  "method": "INTERNATIONAL_WIRE",
  "currency": "USD",
  "purpose": "International Vendor Payment",
  "type": "REGULAR",
  "transactionClass": "SEND",
  "statusReason": "On User Request",
  "source": {
    "account": { "resourceName": "account", "id": 9915272, "url": "/v1/customer/id/4225975/account/id/9915272" }
  },
  "destination": {
    "internationalExternalAccount": { "resourceName": "internationalExternalAccount", "id": 5019600 }
  }
}

Scenario 2: Non-USD payout to a one-time international destination

(FX conversion, inline bank details)

Use this for a one-off payment in a non-USD currency when you don't want to save the recipient. Provide the bank details inline and set amountOriginType.

You'll also need: the recipient's holderName, holderAddress, accountNumber, and swiftCode (validated via validateRoutingCode).

Request

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

{
  "externalId": "intl-wire-nonusd-onetime-001",
  "method": "INTERNATIONAL_WIRE",
  "type": "REGULAR",
  "amount": "5000.00",
  "currency": "EUR",
  "amountOriginType": "DESTINATION",
  "purpose": "European Supplier Payment",
  "source": { "account": { "externalId": "passport-account-001" } },
  "destination": {
    "internationalExternalAccount": {
      "holderName": "Acme GmbH",
      "accountNumber": "DE89370400440532013000",
      "swiftCode": "COBADEFFXXX",
      "holderType": "CORPORATE",
      "holderAddress": {
        "addressLine1": "Hauptstrasse 12",
        "city": "Berlin",
        "state": "BE",
        "country": "DE"
      }
    }
  },
  "processingDetail": {
    "fxQuote": { "id": "fxq-12345" }
  }
}

Response

{
  "resourceName": "transaction",
  "url": "/v1/customer/id/4225975/transaction/id/230491711",
  "id": 230491711,
  "externalId": "intl-wire-nonusd-onetime-001",
  "status": "SCHEDULED",
  "statusDate": "06/29/2026 15:10:30",
  "amount": 5000,
  "method": "INTERNATIONAL_WIRE",
  "currency": "EUR",
  "amountOriginType": "DESTINATION",
  "purpose": "European Supplier Payment",
  "type": "REGULAR",
  "transactionClass": "SEND",
  "statusReason": "On User Request",
  "source": {
    "account": { "resourceName": "account", "id": 9915272, "url": "/v1/customer/id/4225975/account/id/9915272" }
  },
  "destination": {
    "internationalExternalAccount": { "holderName": "Acme GmbH", "holderType": "CORPORATE" }
  },
  "processingDetail": {
    "fxQuote": { "id": "fxq-12345" }
  }
}

Scenario 3: Pay a saved Contact with an international account

(third-party recipient)

Use this to pay a vendor, supplier, or contractor whose international bank details are saved as a Contact. Works for both USD and non-USD.

You'll also need: the recipient saved as a Contact with a linked International External Account.

Request

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

{
  "externalId": "intl-wire-contact-001",
  "method": "INTERNATIONAL_WIRE",
  "type": "REGULAR",
  "amount": "8000.00",
  "currency": "USD",
  "purpose": "International Contract Payment",
  "source": { "account": { "externalId": "passport-account-001" } },
  "destination": {
    "contact": {
      "id": "intl-contact-001",
      "internationalExternalAccount": { "id": "intl-contact-account-001" }
    }
  }
}

Response

{
  "resourceName": "transaction",
  "url": "/v1/customer/id/4225975/transaction/id/230491722",
  "id": 230491722,
  "externalId": "intl-wire-contact-001",
  "status": "SCHEDULED",
  "statusDate": "06/29/2026 16:05:00",
  "amount": 8000,
  "method": "INTERNATIONAL_WIRE",
  "currency": "USD",
  "purpose": "International Contract Payment",
  "type": "REGULAR",
  "transactionClass": "SEND",
  "statusReason": "On User Request",
  "source": {
    "account": { "resourceName": "account", "id": 9915272, "url": "/v1/customer/id/4225975/account/id/9915272" }
  },
  "destination": {
    "contact": { "resourceName": "contact", "id": 5019700, "url": "/v1/customer/id/4225975/contact/id/5019700" }
  }
}

Track the transaction

Subscribe to webhooks or GET the transaction to follow it to settlement. The statuses, the webhook payload, and the event types all live in Transaction lifecycle.


FX quotes for non-USD payouts

For non-USD payouts, you can fetch an FX quote before creating the transaction to lock in the exchange rate. If you don't, the system fetches one automatically.

When to fetch an FX quote manually

  • You want to confirm the exchange rate before committing
  • You need to show the converted amount to your user
  • You want to store the quote ID for reconciliation

Create an FX quote

POST /v1/transaction/fxQuote

{
  "destination": { "amount": "5000.00", "currency": "EUR" }
}

Or specify the source amount instead:

POST /v1/transaction/fxQuote

{
  "source": { "amount": "6000.00" },
  "destination": { "currency": "EUR" }
}

The response includes id, fxRate, fee, and fxQuoteExpiry.

📘

FX quotes expire in 30 seconds

If the quote expires before you create the transaction, the system returns an error. Fetch a new quote and retry.

Use the quote

Pass processingDetail.fxQuote.id in your transaction request:

"processingDetail": {
  "fxQuote": { "id": "fxq-12345" }
}

Request reference

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

Core parameters

ParameterRequiredDescription
methodSet to INTERNATIONAL_WIRE
externalIdRecommendedYour own reference ID, also the idempotency key. Maximum 45 characters.
typeOptionalType of transaction. Possible value: REGULAR.
source.account.id (or externalId)The Passport Account to debit
destinationThe international bank account to credit. See Destination types.
amountAmount to send. Interpretation depends on amountOriginType for non-USD.
currencyUSD or a supported non-USD currency code
amountOriginTypeConditionalRequired for non-USD. SOURCE = amount debited; DESTINATION = amount credited.
purposePurpose of the transaction. Maximum 128 characters.

Destination types

Saved International External Account (Scenario 1)

ParameterRequiredDescription
destination.internationalExternalAccount.idID of the saved account

Inline international bank details (Scenario 2)

ParameterRequiredDescription
destination.internationalExternalAccount.holderNameAccount holder name
destination.internationalExternalAccount.holderAddressHolder address (no PO Box)
destination.internationalExternalAccount.accountNumberBank account number
destination.internationalExternalAccount.swiftCodeConditionalSWIFT/BIC code
destination.internationalExternalAccount.internationalRoutingCodeConditionalRequired for some countries
destination.internationalExternalAccount.holderTypeOptionalCONSUMER or CORPORATE

Saved Contact (Scenario 3)

ParameterRequiredDescription
destination.contact.idID of the Contact
destination.contact.internationalExternalAccount.idID of the linked International External Account

Processing detail

ParameterRequiredDescription
processingDetail.fxQuote.idOptionalFX quote ID for non-USD transactions
processingDetail.memoOptionalReference shown to recipient. Maximum 40 characters.
processingDetail.originatorOptionalOriginator details
processingDetail.payorConditionalPayor details if required by your program

Validation

PCE validates the request synchronously. If a check fails, the request returns an error. Checks include:

  • Required fields present and correctly formatted
  • Source account active with sufficient balance
  • Destination resolves (saved account, valid inline details, or Contact)
  • SWIFT code valid for one-time destinations
  • FX quote valid and not expired (for non-USD with manual quote)
  • OFAC and CIP verification for involved entities

Other conditions surface after creation as PENDING or FAILED. See Transaction lifecycle and Error Codes.


Statuses

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

If an international wire fails

An international wire moves to FAILED when compliance screening fails, the wire network rejects the instruction, or the correspondent/beneficiary bank cannot process it. A PENDING payout is on hold for compliance or account issues. Resolve the underlying issue and submit a new payout. For error codes, see Transactions Error codes.


Go live

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

  • SWIFT codes are validated before use (via validateRoutingCode).
  • FX quote timing (30-second expiry) is handled in your flow.
  • Country-specific metadata requirements are understood for non-USD destinations.

Best practices

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

PracticeDescription
Validate SWIFT codes earlyUse the validateRoutingCode endpoint before creating one-time destinations.
Fetch metadata for non-USDNon-USD destinations may require country-specific fields. Use List Metadata.
Handle FX quote expiryFX quotes are valid for 30 seconds. Regenerate if expired.
Store FX quote IDFor non-USD payouts, store the FX quote ID for reconciliation.
Test both currency pathsValidate USD and non-USD flows separately in sandbox.

Next steps

See also



Did this page help you?
.readme-logo { display: none !important; }