Quotes & FX
How rates are locked, what a quote costs you, and where the requote risk lives.
The quote model
A quote locks an FX rate for exactly one payment. It is destination-amount based: you state what the beneficiary must receive, and Jeeves derives what you'll be debited.
curl -X POST 'https://public-sandbox.tryjeeves.com/v1/quotes' \
-H "Authorization: Bearer $JEEVES_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"sourceCurrency": "USD",
"destinationCurrency": "MXN",
"amount": "43035.00",
"productAccountType": "self-funded"
}'| Field | Notes |
|---|---|
amount | Destination amount, decimal string, in destinationCurrency. |
productAccountType | The kind of account you'll actually pay from. Your FX rate and fees depend on it, so a quote priced for a different account type doesn't reflect what you'll pay. |
sourceCurrency / destinationCurrency | One of USD, MXN, BRL, COP, EUR, GBP, CAD, or a stablecoin ticker (USDB, USDC, USDT, EURC); any other code returns 400 validation_failed. Set sourceCurrency to the funding account's productAccountCurrency — a crypto-wallet account is quoted in its ticker, for example USDC. An unpriceable pair returns 422 unsupported_pair. |
The response derives the rest:
| Response field | Meaning |
|---|---|
rate | Decimal string — destination units per one source unit ("17.2140" = 17.214 MXN per USD). |
sourceAmount | What you'll be debited, before fees. |
expiresAt | When the locked rate stops being valid. Read it, don't assume a window — the TTL is configured per company. null means the quote doesn't expire. |
All money fields are decimal strings, never floats — parse them with a decimal type.
Single use, then gone
A quote funds exactly one payment. Reusing a consumed quote — or presenting an expired one with onQuoteExpiry: fail — returns 422 quote_expired. Create a fresh quote per payment attempt; don't pool them.
The requote decision
If your quote may expire between showing a rate to a user and their confirmation, you have two honest choices:
onQuoteExpiry | Behavior | When to use |
|---|---|---|
fail (default) | 422 quote_expired; you re-quote and re-confirm with the user. | You show rates to users and they must approve what they pay. |
requote | A new quote is priced at the current rate and used. Destination amount unchanged, source amount moves. | Machine-to-machine flows where delivering the exact destination amount matters more than the exact source cost. |
With requote, always compare the response's quoteId to originalQuoteId and check sourceAmount against your expectation — a requote is the one case where you pay a rate you were never shown, and no separate event announces it.
Fees
sourceAmount is what the quote will debit before fees. Fees are set by your Jeeves pricing agreement and assessed on top; they are not itemized by this API today. They do count against your balance check — a payment fails with 422 insufficient_funds when the account balance is below the quoted amount plus fees — so leave headroom on tightly-funded accounts.
Scheduled payments skip the quote
A future-dated payment is quoted on its execution date, not at creation: omit quoteId, send amount and scheduledDate instead. See Scheduled payments.