Tradable Pairs
Every directional pair the workspace’s solvers and LPs quote right now, each entry naming the exact input and output assets plus a corridor slug. Coverage follows LP inventory and listings - refresh at least daily instead of pinning the list.
curl --request GET \
--url https://api.tetrafi.io/api/v1/pairs \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.tetrafi.io/api/v1/pairs"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.tetrafi.io/api/v1/pairs', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.tetrafi.io/api/v1/pairs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.tetrafi.io/api/v1/pairs"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.tetrafi.io/api/v1/pairs")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tetrafi.io/api/v1/pairs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"pairs": [
{
"input": {
"chainId": 10,
"address": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"symbol": "USDC",
"decimals": 6
},
"output": {
"chainId": 8453,
"address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"symbol": "USDC",
"decimals": 6
},
"corridor": "optimism-base"
},
{
"input": {
"chainId": 8453,
"address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"symbol": "USDC",
"decimals": 6
},
"output": {
"chainId": 10,
"address": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"symbol": "USDC",
"decimals": 6
},
"corridor": "base-optimism"
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}OpenAPI
openapi: 3.1.0
info:
title: TetraFi RFQ API
version: '1'
description: >-
Firm, escrow-backed quotes from competing solvers and LPs. Every quote is a signed
commitment priced from the counterparty's own inventory - executable exactly as
returned, with no re-pricing and no last look - and every order settles through a
delivery-or-refund escrow: the output is delivered or the input comes back, never
limbo.
servers:
- url: https://api.tetrafi.io/api/v1/rfq
description: >-
RFQ namespace base URL. The chain is no longer part of the URL - every asset in an
intent names its network via chainId. The same host serves the sandbox: authenticate
with a tfk_test_ key to quote against test corridors, tfk_live_ for production.
security:
- apiKeyAuth: []
paths:
/pairs:
get:
summary: Tradable Pairs
operationId: getPairs
description: >-
Lists every directional pair at least one solver/LP in your workspace currently
quotes, each entry naming the exact input and output asset plus its corridor slug.
Coverage moves with LP inventory and new listings - refresh at least daily rather
than pinning the list. The production roster spans ethereum (1), optimism (10),
base (8453), and arc (5042); a tfk_test_ key additionally exposes sandbox networks
such as arc-testnet (5042002) and solana-devnet (1399811151).
servers:
- url: https://api.tetrafi.io/api/v1
parameters:
- name: activeOnly
in: query
required: false
schema:
type: boolean
title: Active Only
description: >-
Keep only pairs with at least one counterparty pricing right now (status
active).
default: true
description: >-
Keep only pairs with at least one counterparty pricing right now (status
active).
- name: chainId
in: query
required: false
schema:
anyOf:
- type: integer
- type: 'null'
title: Chain Id
description: >-
Restrict to pairs whose input or output sits on this chain, e.g. 10 or
8453.
description: >-
Restrict to pairs whose input or output sits on this chain, e.g. 10 or 8453.
- name: corridor
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Corridor
description: Restrict to one directional corridor slug, e.g. optimism-base.
description: Restrict to one directional corridor slug, e.g. optimism-base.
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/PairsResponse'
example:
pairs:
- input:
chainId: 10
address: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85'
symbol: USDC
decimals: 6
output:
chainId: 8453
address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
symbol: USDC
decimals: 6
corridor: optimism-base
- input:
chainId: 8453
address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
symbol: USDC
decimals: 6
output:
chainId: 10
address: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85'
symbol: USDC
decimals: 6
corridor: base-optimism
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
components:
schemas:
HTTPValidationError:
properties:
detail:
items:
$ref: '#/components/schemas/ValidationError'
type: array
title: Detail
type: object
title: HTTPValidationError
PairsResponse:
properties:
pairs:
items:
$ref: '#/components/schemas/Pair'
type: array
title: Pairs
description: >-
Every directional pair at least one workspace-eligible solver/LP currently
quotes.
asOf:
anyOf:
- type: string
format: date-time
- type: 'null'
title: As Of
description: >-
When this roster snapshot was computed. Coverage moves with LP inventory and
listings - refresh at least daily rather than pinning it.
totalPairs:
anyOf:
- type: integer
- type: 'null'
title: Total Pairs
description: Number of pair entries returned.
type: object
required:
- pairs
title: PairsResponse
Pair:
properties:
input:
$ref: '#/components/schemas/PairAsset'
description: >-
Asset the taker supplies - the exact chainId and contract address to reference
in intent.inputs.
output:
$ref: '#/components/schemas/PairAsset'
description: Asset delivered to the receiver - reference it in intent.outputs.
corridor:
type: string
title: Corridor
description: >-
Directional route slug, e.g. optimism-base - the cross-chain analog of a
trading-pair name. The reverse direction is listed as its own pair.
type: object
required:
- input
- output
- corridor
title: Pair
description: >-
One directional tradable pair. input and output name exact assets; use their
chainId + address verbatim in quote intents.
PairAsset:
properties:
chainId:
type: integer
title: Chainid
description: Network the asset lives on, e.g. 10 for Optimism or 8453 for Base.
address:
type: string
title: Address
description: >-
Token contract address - copy it verbatim into your intent; never substitute a
wrapped or bridged variant.
symbol:
type: string
title: Symbol
description: Ticker symbol, for display only - never use it as an identifier.
decimals:
type: integer
title: Decimals
description: >-
Base-unit scale: human amount times 10^decimals, so 1 USDC (6 decimals) is
1000000.
name:
anyOf:
- type: string
- type: 'null'
title: Name
description: Full display name of the token.
type: object
required:
- chainId
- address
- symbol
- decimals
title: PairAsset
description: >-
Exact asset on one side of a tradable pair. The chainId + address pair is the
identity to reference in quote intents.
ValidationError:
properties:
loc:
items:
anyOf:
- type: string
- type: integer
type: array
title: Location
msg:
type: string
title: Message
type:
type: string
title: Error Type
type: object
required:
- loc
- msg
- type
title: ValidationError
securitySchemes:
apiKeyAuth:
type: apiKey
in: header
name: X-API-Key
description: Service-account API key (tfk_test_/tfk_live_).
Authorizations
Service-account API key (tfk_test_/tfk_live_).
Query Parameters
Keep only pairs with at least one counterparty pricing right now (status active).
Restrict to pairs whose input or output sits on this chain, e.g. 10 or 8453.
Restrict to one directional corridor slug, e.g. optimism-base.
Response
Successful Response
Every directional pair at least one workspace-eligible solver/LP currently quotes.
Show child attributes
Show child attributes
When this roster snapshot was computed. Coverage moves with LP inventory and listings - refresh at least daily rather than pinning it.
Number of pair entries returned.