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 third party's bank account in another country using the international wire network. 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.
Moving funds to an overseas account you own is a transfer of your own money, not a payout. See Transfer funds → Sweep to your own account abroad (international wire).
Common use cases
- Pay an international vendor, supplier, or partner saved as a Contact
- Make a one-off cross-border payout without saving the recipient
- Send cross-border business disbursements in USD or a supported non-USD currency
International External Account or Contact?To pay a third party (a vendor, supplier, or partner) you'll pay again, save them as a Contact (which stores their international account details inside the contact entity) and reference the contact on the payout (Scenarios 2 and 3). For a genuine one-off, pass inline bank details instead (Scenario 1). An International External Account represents the customer's own overseas account; sending to one is a transfer of your own money, so see Transfer funds → Sweep to your own account abroad (international wire), not a payout on this page.
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 path | When to use | Required fields |
|---|---|---|
| USD International Wire | Destination account receives funds in USD | currency: USD |
| Non-USD International Wire | Destination account receives funds in a supported non-USD currency | currency, 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: theamountis what's debited from your Passport Account (USD)DESTINATION: theamountis 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: pay a saved international vendor (Contact) in USD 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": {
"contact": {
"externalId": "intl-vendor-contact-001",
"internationalExternalAccount": { "externalId": "intl-vendor-account-001" }
}
}
}You'll get back a transaction with status: SCHEDULED. Store the returned id and your externalId to track it.
UseexternalIdfor safe retriesFor Treasury, PCE treats the
externalIdin the request body as the idempotency key; there's no separate header. Send a uniqueexternalIdper 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.
Sending to your own overseas account?Sending an international wire to an International External Account you own is a transfer of your own money, not a payout. It's covered on Transfer funds → Sweep to your own account abroad (international wire), not here. Pay via International Wire is only for paying a third party.
Scenario 1: USD payout to a one-time international destination
(inline bank details, no saved account)
Use this for a one-off USD payment to a destination you don't need to save. Provide the beneficiary's international bank details inline in the request; no FX conversion is needed. For a third-party vendor or supplier you'll pay again, save them as a Contact instead (see Scenarios 2 and 3).
You'll also need: the recipient's holderName, holderAddress, accountNumber, and swiftCode (validated via validateRoutingCode). Some countries also require an internationalRoutingCode.
Request
POST /v1/customer/id/{id}/transaction
{
"externalId": "intl-wire-usd-onetime-001",
"method": "INTERNATIONAL_WIRE",
"type": "REGULAR",
"amount": "10000.00",
"currency": "USD",
"purpose": "International Vendor Payment",
"source": { "account": { "externalId": "passport-account-001" } },
"destination": {
"internationalExternalAccount": {
"holderName": "Jon Francis",
"holderAddress": {
"addressLine1": "999",
"addressLine2": "GT1 KMB",
"city": "Arizona",
"state": "UP",
"country": "IN"
},
"accountNumber": "0025759600202899",
"internationalRoutingCode": "AXIS0210002",
"swiftCode": "AXISINBE345",
"type": "CHECKING",
"holderType": "CONSUMER"
}
},
"processingDetail": { "memo": "International transaction" }
}Response
{
"resourceName": "transaction",
"url": "/v1/customer/id/4225975/transaction/id/230491711",
"id": 230491711,
"externalId": "intl-wire-usd-onetime-001",
"status": "SCHEDULED",
"statusDate": "06/29/2026 15:10:30",
"amount": 10000,
"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": {
"holderName": "Jon Francis",
"accountNumberLast4": "2899",
"swiftCode": "AXISINBE345",
"type": "CHECKING",
"holderType": "CONSUMER"
}
}
}Scenario 2: 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, in USD. For a non-USD payout to a Contact, see Scenario 3.
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" }
}
}Scenario 3: Non-USD payout to a saved Contact
(FX conversion, third-party recipient)
Use this to pay a Contact in a supported non-USD currency. Set currency to the destination currency and provide amountOriginType. Optionally fetch an FX quote first; if you don't, the system fetches one automatically.
You'll also need: the recipient saved as a Contact with a linked International External Account configured for the destination currency.
Request
POST /v1/customer/id/{id}/transaction
{
"externalId": "intl-wire-nonusd-contact-001",
"method": "INTERNATIONAL_WIRE",
"type": "REGULAR",
"amount": "5000.00",
"currency": "CHF",
"amountOriginType": "DESTINATION",
"purpose": "European Supplier Payment",
"source": { "account": { "externalId": "passport-account-001" } },
"destination": {
"contact": {
"id": "intl-contact-001",
"internationalExternalAccount": { "id": "intl-contact-account-001" }
}
},
"processingDetail": { "memo": "test transaction" }
}Response
{
"resourceName": "transaction",
"url": "/v1/customer/id/4225975/transaction/id/230491733",
"id": 230491733,
"externalId": "intl-wire-nonusd-contact-001",
"status": "SCHEDULED",
"statusDate": "06/29/2026 16:40:12",
"amount": 5000,
"method": "INTERNATIONAL_WIRE",
"currency": "CHF",
"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": {
"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 secondsIf 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
| Parameter | Required | Description |
|---|---|---|
method | ✓ | Set to INTERNATIONAL_WIRE |
externalId | Recommended | Your own reference ID, also the idempotency key. Maximum 45 characters. |
type | Optional | Type of transaction. Possible value: REGULAR. |
source.account.id (or externalId) | ✓ | The Passport Account to debit |
destination | ✓ | The international bank account to credit. See Destination types. |
amount | ✓ | Amount to send. Interpretation depends on amountOriginType for non-USD. |
currency | ✓ | USD or a supported non-USD currency code |
amountOriginType | Conditional | Required for non-USD. SOURCE = amount debited; DESTINATION = amount credited. |
purpose | ✓ | Purpose of the transaction. Maximum 128 characters. |
Destination types
Inline international bank details (Scenario 1)
| Parameter | Required | Description |
|---|---|---|
destination.internationalExternalAccount.holderName | ✓ | Account holder name |
destination.internationalExternalAccount.holderAddress | ✓ | Holder address (no PO Box) |
destination.internationalExternalAccount.accountNumber | ✓ | Bank account number |
destination.internationalExternalAccount.swiftCode | Conditional | SWIFT/BIC code |
destination.internationalExternalAccount.internationalRoutingCode | Conditional | Required for some countries |
destination.internationalExternalAccount.holderType | Optional | CONSUMER or CORPORATE |
Saved Contact (Scenarios 2 & 3)
| Parameter | Required | Description |
|---|---|---|
destination.contact.id | ✓ | ID of the Contact |
destination.contact.internationalExternalAccount.id | ✓ | ID of the linked International External Account |
Sending to an International External Account you own? Reference
destination.internationalExternalAccount.id; that's a transfer, documented on Transfer funds → Sweep to your own account abroad (international wire).
Processing detail
| Parameter | Required | Description |
|---|---|---|
processingDetail.fxQuote.id | Optional | FX quote ID for non-USD transactions |
processingDetail.memo | Optional | Reference shown to recipient. Maximum 40 characters. |
processingDetail.originator | Optional | Originator details |
processingDetail.payor | Conditional | Payor 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:
| Practice | Description |
|---|---|
| Validate SWIFT codes early | Use the validateRoutingCode endpoint before creating one-time destinations. |
| Fetch metadata for non-USD | Non-USD destinations may require country-specific fields. Use List Metadata. |
| Handle FX quote expiry | FX quotes are valid for 30 seconds. Regenerate if expired. |
| Store FX quote ID | For non-USD payouts, store the FX quote ID for reconciliation. |
| Test both currency paths | Validate USD and non-USD flows separately in sandbox. |
Next steps
See also
- International External Accounts: save international bank accounts for reuse
- Save Payees as Contacts: save international vendors as Contacts
- Pay via Wire (Domestic): domestic wire payouts
- List Metadata: country and currency requirements
- Error Codes and Messages: resolve a failed payout
Updated 7 days ago
