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 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: 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.
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.
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 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
Saved International External Account (Scenario 1)
| Parameter | Required | Description |
|---|---|---|
destination.internationalExternalAccount.id | ✓ | ID of the saved account |
Inline international bank details (Scenario 2)
| 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 (Scenario 3)
| Parameter | Required | Description |
|---|---|---|
destination.contact.id | ✓ | ID of the Contact |
destination.contact.internationalExternalAccount.id | ✓ | ID of the linked International External Account |
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 about 15 hours ago