Skip to main content
Each quote states what its venue commits to in quality, and until when in expiresAt: read both before you order.

Firm, executable and indicative

  • firm and expiresAt repeat quality in two fields. Treat a quality you do not recognise as indicative.
  • lastLook is always false: no venue re-checks an accepted price before it fills. An order inside a firm quote’s window trades at that price or is refused unsent.
  • Firmness does not waive funding, wallet, permission or pre-trade checks. It does not mean the order will be accepted or settle immediately.
  • A price is never firm: only a quote can be.

Lifetime and requotes

  • Order before expiresAt, read from the quote, never a timer started on your side.
  • Until retainUntil, ordering a lapsed quote answers 410 QUOTE_EXPIRED with next.kind: "requote": requote the same id.
  • After it, a requote or an order answers 410 REQUOTE_WINDOW_CLOSED with next.kind: "search": search again.

Ask for firm prices

Send firmness: "firm" to ask every eligible desk for a firm price up front, or filters.firmOnly: true to keep only firm quotes.
Two independent request fields control firmness:How filters.firmOnly behaves:
  • It drops executable estimates and indicative quotes after the venues answer. The same venues are asked, and the search counts against the quote limit as usual.
  • A venue that gave only estimates still reads answered in sources, with no quote in quotes.
  • Send it when you are about to trade and compare only committed amounts. Leave it out when you compare prices: an order book or a pool may give the best one, protected by minOut.
  • filters.executableOnly is refused with 400 INVALID_REQUEST.

Quote times

Use the returned expiresAt: each venue type sets its own window, and network time or an older observation can leave less.
When next.kind is requote, next.needs lists what the new quote needs from you, such as a trading wallet to name; an empty list means requote it as it is.

Requote a quote

Send a quote’s id to ask its venue for a new price and get one new quote from that venue. Requote to change how it executes, to get an executable price for an indicative quote or a desk’s firm price when its quote reads next.kind: "requote", or to refresh it after it expires.
1

Send the quote id

POST /api/v1/quotes with kind: "requote", requote set to the quote id, and only the fields you change.
2

Order the new id

The new quote’s requoteOf names the original.
Response (shortened)
  • Change how it executes: another trading wallet or venue account (source), destination (deliverTo), corridor (corridor) or price protection (priceProtectionBps).
  • Get an executable price for an indicative quote, or a desk’s firm price when its quote reads next.kind: "requote".
  • Refresh a quote that expired.
A field you leave out keeps the original’s. The pair, amount, side and filters cannot change: sending them is 400 REQUOTE_FIELDS_CONFLICT. For a different pair or amount, search again.
  • You get one new quote whose requoteOf names the original. Order the new id.
  • The answer is JSON, never a stream.
  • The original stays orderable until its own expiresAt. Each quote can still be ordered once.
  • Only that venue is asked (for a route, every venue on that same route). If it declines, you get a named refusal; TetraFi never substitutes another venue.
  • A requote counts against the quote limit.
Here a requote at 50 basis points lowers minOut from 4.99182 to 4.98181 on the same quoted amount:

Refresh an expired quote

An expired quote is refused with 410 QUOTE_EXPIRED and nothing is sent. Requote the same id.
Output

Refusals

Run the full script

Requotes a quote at another price protection and refreshes a quote that expired.

Next

Place an order

Order a quote you hold by its id.

Request quotes

Search again for a different pair or amount.