All Posts

UCP and Cross-Border Commerce: How AI Agents Handle Multi-Currency Transactions

Why multi-currency is hard for AI agents, how UCP normalizes payment interfaces across currencies, and a practical example of an agent selecting the right payment rail.

August 17, 2026UCPList Team
UCP cross-bordermulti-currency paymentsAI agent paymentsagentic commerce internationalpayment rail selectionUCP payment token exchange

The Multi-Currency Problem

An AI agent can find the best price on a product across dozens of merchants in seconds. That part is solved. The hard part comes when the merchant is in Germany, the consumer is in the US, and the agent needs to complete the purchase.

Multi-currency commerce is not just a math problem. It involves exchange rates, card network fees, cross-border surcharges, settlement currencies, regulatory holds, and payment method availability that varies by country. A US credit card charge routed to a European merchant hits interchange fees, currency conversion fees, and potentially a cross-border surcharge, all hidden from the consumer until after the fact.

Agents make this problem more visible because they can see the full cost surface before committing. But they can only act on what the payment infrastructure exposes to them.

How UCP Normalizes Payment Interfaces

UCP's payment token exchange specification does not dictate which currency a transaction settles in. What it does is define a standard interface for exchanging payment authorization tokens between agents, merchants, and payment processors.

This matters for cross-border commerce because it decouples the payment credential (stored by the consumer's identity provider) from the payment rail (chosen at checkout). The agent does not need to know whether a merchant settles in euros or dollars. It presents a UCP payment token. The merchant's payment processor handles the conversion.

Here is what this looks like at the protocol level:

// Agent discovers the merchant's UCP manifest
const manifest = await fetch('https://merchant.eu/.well-known/ucp').then(r => r.json());

// Manifest declares supported payment processors and currencies
// manifest.paymentHandlers: ['adyen', 'stripe']
// manifest.currencies: ['EUR', 'USD', 'GBP']

// Agent checks consumer's payment token for currency compatibility
const tokenClaims = decodeUcpToken(consumerPaymentToken);
// tokenClaims.supportedCurrencies: ['USD', 'EUR']

// Find the intersection and select the payment rail
const compatibleCurrencies = manifest.currencies.filter(c =>
  tokenClaims.supportedCurrencies.includes(c)
);
// ['EUR', 'USD'] -- both work

// Select the preferred rail
const preferredCurrency = tokenClaims.preferredCurrency ?? compatibleCurrencies[0];

The agent never touches raw card data. It presents the token. The payment handler resolves the currency.

Rail Selection in Practice

Consider an agent buying running shoes from a UK merchant for a US consumer. The merchant's UCP manifest shows it accepts payment through Adyen, with settlement in GBP and EUR. The consumer's identity provider has issued a UCP payment token backed by a US credit card.

Without UCP, the agent would need to know how to interact with the merchant's specific checkout form, handle 3DS authentication, and deal with whatever currency the card network decides to convert at. This is not scalable across thousands of merchants.

With UCP, the agent executes a payment-token-exchange against the merchant's UCP endpoint. Adyen receives the token, identifies the backing instrument, applies its cross-border FX logic, and returns a transaction result. The agent gets a success or failure response with the final amount in the consumer's native currency.

// Agent initiates payment-token-exchange
const paymentResult = await fetch('https://merchant.eu/api/ucp/checkout', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${consumerPaymentToken}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    capability: 'payment-token-exchange',
    currency: preferredCurrency,
    amount: orderTotal,
    orderId: ucpOrderId,
  }),
});

const result = await paymentResult.json();
// result.status: 'success'
// result.settledAmount: 94.20
// result.settledCurrency: 'GBP'
// result.consumerCharge: 119.00
// result.consumerCurrency: 'USD'

The agent can surface the consumer charge to the user before confirming. No hidden fees. No surprise currency conversion on the statement.

What Still Needs Work

UCP does not yet define a standard for cross-border payment rail selection. The manifest tells agents which currencies a merchant accepts. It does not expose the FX rate being applied or which processor will handle the conversion. Agents cannot currently compare the effective exchange rate across payment handlers before committing.

This is an area where the spec will evolve. As Wise Platform, CurrencyCloud, and other FX-focused infrastructure players integrate with UCP, the payment token exchange flow will likely gain fields for indicative FX rates and processor-specific cross-border fees.

For now, the practical guidance is to include supported currencies in your UCP manifest and let the payment processor handle FX. This gives agents enough information to validate compatibility and complete the transaction. Full FX transparency at the protocol level comes next.

Read next