> ## Documentation Index
> Fetch the complete documentation index at: https://tetrafi.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Short Expiry

> Trade validity window against spread - tighter quotes for integrations that can act fast.

A quote's `validUntil` is part of its price: the shorter the window an LP must hold its commitment, the tighter it can quote. Integrations that sign and submit quickly can lean into that - request a shorter validity horizon and collect the spread improvement. The flip side: your signed order must reach settlement before the window closes, or the escrow refunds instead of filling.

<Note>
  You control the window from the intent side with `minValidUntil` - the minimum expiry you're willing to accept. Leave it unset and LPs choose their standard windows.
</Note>

## Typical Validity Windows

Windows vary by corridor and LP; treat these as representative rather than contractual - the authoritative number is always the `validUntil` on the quote itself:

| Network               | Fast-mover window | Standard window            |
| --------------------- | ----------------- | -------------------------- |
| Optimism              | \~5s              | \~60s                      |
| Base                  | \~5s              | \~60s                      |
| Ethereum              | \~10s             | \~75s                      |
| Arc                   | -                 | quoted per venue           |
| Cross-chain corridors | -                 | longer, covering both legs |

## Asking for a Specific Window

Set `minValidUntil` (unix seconds) inside the intent - quotes expiring before that moment are filtered out before they reach you:

```python theme={null} theme={null}
import time

import httpx

API = "https://api.tetrafi.io/api/v1"
ME = "0x2e7E7cc62919eAf4c502dAC34753cFc5A29e9693"

resp = httpx.post(
    f"{API}/rfq/quotes",
    json={
        "user": ME,
        "intent": {
            "intentType": "swap",
            "inputs": [{"user": ME,
                        "asset": {"chainId": 10, "address": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},
                        "amount": "25000000"}],
            "outputs": [{"receiver": ME,
                         "asset": {"chainId": 8453, "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}],
            "swapType": "ExactInput",
            "minValidUntil": int(time.time()) + 30,   # give me at least 30s to act
        },
        "supportedTypes": ["escrow-v0"],
    },
    headers={"X-API-Key": "tfk_live_..."},
)
for q in resp.json()["quotes"]:
    print(q["solverId"], "valid for", q["validUntil"] - int(time.time()), "s")
```

Working the other direction - accepting *short* windows for better pricing - is simply a matter of tolerating small `validUntil` horizons and submitting immediately: preflight, sign, and POST in one pass, with no user interaction between quote and submission. If your submission misses the window, the order is rejected up-front or refunds through the escrow - you are never left with a stale fill.

## Pairing with the Price Feed

One consistency rule when the [price feed](/price-api/introduction) feeds your estimates: match horizons. Numbers derived from patient streamed pricing won't line up with what tight-window firm quotes return - and the gap widens exactly when it matters. [Quote Expiry](/price-api/reference#quote-expiry) covers the interaction.

<Warning>
  Comparing short-window firm quotes against long-horizon indicative prices will systematically misestimate your execution quality - align the two before drawing conclusions.
</Warning>

## Trade-offs

|                    | Shorter windows                                                          | Standard windows                    |
| ------------------ | ------------------------------------------------------------------------ | ----------------------------------- |
| **Spread**         | Compressed - you keep what the LP no longer risks                        | A little wider, priced for patience |
| **Clock pressure** | Settlement must beat `validUntil`; automate the sign-and-submit hop      | Slack enough for human-paced flows  |
| **If you miss**    | Clean rejection up front, or an escrow refund - stale fills can't happen | Identical guarantees, rarely tested |
| **Natural fit**    | Machine-speed pipelines chasing basis points                             | Nearly everyone else                |
