# How do I cap an AI agent's spend when it pays merchants in more than one currency?

**Short answer:** A cap is a number plus a currency, and amounts are usually sent in minor units, so a cap written for USD can mean something very different in another currency. 1500 is 15.00 USD but 1,500 JPY (about ten dollars) and 1.500 BHD, because ISO 4217 gives JPY 0 decimals and BHD 3. Converting at the agent's own rate adds a second gap: the card converts later, at the network's rate plus any fees. The safe pattern is one budget currency per policy. On Rightshold a spending policy (set_spend_policy) has exactly one currency, and authorize_spend denies a purchase in any other currency with currency_not_allowed, so a foreign charge can't slip past a USD cap by being counted as a smaller number. Either have the agent authorize the amount in your budget currency before it pays (converted with headroom for FX and fees), or give each foreign currency its own credential and cap in that currency. Keep the card's own limit in the card currency as the backstop: Stripe Issuing converts foreign amounts to the card currency when it checks spending_limits.

## Checklist
1. Pick one budget currency for the agent (the currency your card or wallet settles in) and write every cap in that currency's minor units. Check the decimals: USD and EUR have 2, JPY and KRW have 0, BHD, KWD, OMR, JOD and TND have 3 (ISO 4217).
2. Set the policy with set_spend_policy: currency (for example USD), per_tx_max_minor and daily_max_minor. A policy holds one currency, and authorize_spend denies any purchase in a different currency with currency_not_allowed, so mixed currencies never add up as raw numbers.
3. If the merchant prices in another currency, have the agent convert the price to the budget currency before calling authorize_spend, then add headroom for FX movement and fees (a few percent is a starting point; size it from your card statements). Put the original amount, currency and rate source in reference so the decision can be checked later.
4. Or give a foreign currency its own lane: issue a separate credential with issue_agent_credential and set_spend_policy on it in that currency (currency JPY, daily_max_minor 20000 means 20,000 yen). Use this when the agent pays in that currency often and you want a cap a person can read in local money.
5. Don't use reference rates as the price. The ECB publishes its euro reference rates for information purposes only and discourages using them for transactions. Use the rate your card network or payment provider applies, or a quote that includes it.
6. Watch for dynamic currency conversion at checkout (the merchant offers to charge in your home currency at its own rate). Tell the agent to pay in the merchant's local currency unless the converted price is what was authorized.
7. Keep the card limit in the card currency as the outer cap: Stripe Issuing spending_limits are set in the card's currency and smallest unit, and amounts in other currencies are converted to the card's currency when the limit is checked.
8. Reconcile in the budget currency: compare each allow (amount and reference) with the settled card amount. Differences come from FX, fees and later tips or adjustments, so expect small gaps and investigate big ones.

## Why doesn't one spend cap number work when an AI agent pays in several currencies?
- Payment APIs take amounts as integers in the currency's minor unit. Stripe's docs give 1099 for 10.99 USD and 10 for 10 JPY, and list special cases such as ISK, which ISO 4217 now gives 0 decimals but Stripe still represents as a two-decimal value. A cap copied from a USD config into a JPY or BHD config changes size by a factor of 100 or 10 without anyone noticing.
- ISO 4217 (the SIX-maintained list) gives most currencies 2 decimals, JPY and KRW 0, and BHD, IQD, JOD, KWD, LYD, OMR and TND 3. If the agent, your policy and your card don't agree on the currency and its decimals, the cap isn't the cap.
- Exchange rates add drift. The price the agent saw, the rate it used and the amount the card network settles can all differ, and Stripe notes that tips and fees can be posted later and push spend past a limit.

## How do I keep an AI agent's spending policy in one budget currency?
- On Rightshold, set_spend_policy stores one currency per credential next to per_tx_max_minor, daily_max_minor and the merchant allowlist. authorize_spend checks the purchase currency first: anything else is denied with currency_not_allowed, and the daily total only adds allows in the policy currency.
- That makes the conversion explicit. The agent (or your checkout code) converts to the budget currency, authorize_spend checks that amount against the caps, and the signed decision records the purchase as sent, including reference. If conversion was wrong, the record shows what was authorized and you can compare it with the card statement.
- For a currency the agent uses a lot, a separate lane credential with its own policy in that currency gives a local-currency cap (for example 20,000 JPY a day). The lanes don't share a total, so add an outer cap where the money moves.

## How does a card limit in the card's currency cap an AI agent's foreign-currency spend?
- Stripe Issuing spending_limits are in the card's currency, and foreign-currency authorizations are converted to that currency before the limit is checked. One card limit therefore caps all currencies together, at the network's rate, which makes it the right backstop for several Rightshold lanes.
- Rightshold does not convert currencies, quote exchange rates or move money. It checks the amount and currency it is given against the policy and signs the allow or deny. Your payment step should refuse to pay without a fresh allow (valid for 15 minutes) for the amount it is about to charge, and merchants can check it free with verify_spend_authorization.

## Ask Rightshold (free, no key)
Add the MCP server https://www.rightshold.com/mcp to Claude, Cursor, ChatGPT, Grok or VS Code (one-click setup: https://www.rightshold.com/start?ref=seo), then ask: "My purchasing agent pays some suppliers in USD and some in JPY. Set a USD policy on its main credential (25.00 per purchase, 100.00 per day), and tell me what authorize_spend returns if the agent sends a 3,000 JPY purchase on that credential."

```json
{
  "tool": "set_spend_policy",
  "arguments": {
    "credential_id": "crd_YOUR_AGENT_CREDENTIAL",
    "currency": "USD",
    "per_tx_max_minor": 2500,
    "daily_max_minor": 10000
  }
}
```
- Needs your owner account key. It's in the trust toolset (connect to /mcp?toolset=trust).
- authorize_spend returns a signed deny with currency_not_allowed for any currency other than the policy's. Convert to USD first, or issue a second credential with issue_agent_credential and give it a JPY policy (amounts in yen, 0 decimals).
- verify_spend_authorization is free. Merchants or your checkout use it to check an allow before valid_until.
- ledger_verify is free and keyless for every policy version and decision.

_Rightshold records spending policies and signs allow/deny decisions on a hash-chained ledger. It never holds, moves, converts or settles money and does not supply exchange rates: each policy has one currency, and converting amounts, choosing rates and setting card limits are steps you run around those records. Not financial or legal advice._

## Sources
- [Stripe Docs: Supported currencies (minor units, zero-decimal currencies, special cases)](https://docs.stripe.com/currencies)
- [SIX: ISO 4217 currency code list (List One, minor units)](https://www.six-group.com/en/products-services/financial-information/data-standards.html)
- [Stripe Issuing: spending controls (amounts in card currency; other currencies converted)](https://docs.stripe.com/issuing/controls/spending-controls)
- [ECB: Euro foreign exchange reference rates (information purposes only)](https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/index.en.html)
- [Agent spending policies on Rightshold](https://www.rightshold.com/agent-spending-policies)

## Related
- [How to set a separate budget for each AI agent calling paid APIs](https://www.rightshold.com/answers/how-to-set-a-separate-budget-for-each-ai-agent-calling-paid-apis)
- [How to cap an AI agent's spend per vendor per day across multiple tasks](https://www.rightshold.com/answers/how-to-cap-an-ai-agents-spend-per-vendor-per-day-across-multiple-tasks)
- [How to reconcile an AI agent's spend against the bank feed at month end](https://www.rightshold.com/answers/how-to-reconcile-an-ai-agents-spend-against-the-bank-feed-at-month-end)
- [How to give an AI agent a virtual card with a spending limit](https://www.rightshold.com/answers/how-to-give-an-ai-agent-a-virtual-card-with-a-spending-limit)

_Not legal advice. Updated 2026-11-08. JSON: https://www.rightshold.com/answers/how-to-cap-an-ai-agents-spend-when-it-pays-in-more-than-one-currency.json_