Solvers
The counterparty roster your quote requests fan out to - every solver and LP that cleared the workspace’s eligibility gates, with live pricing status, corridor coverage, and quoting history. An empty roster for a pair is what surfaces as a typed productUnavailable error on POST /quotes.
curl --request GET \
--url https://api.tetrafi.io/api/v1/solvers \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.tetrafi.io/api/v1/solvers"
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/solvers', 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/solvers",
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/solvers"
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/solvers")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tetrafi.io/api/v1/solvers")
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{
"solvers": [
{
"id": "lp-atlas",
"status": "active",
"kind": "lp",
"corridors": [
"optimism-base",
"base-optimism"
],
"firstSeenAt": "2026-01-12T09:30:00Z",
"lastQuoteAt": "2026-07-20T13:58:41Z",
"eligibilityNote": null
},
{
"id": "solver-corsair",
"status": "standby",
"kind": "solver",
"corridors": [
"ethereum-arc"
],
"firstSeenAt": "2026-03-02T16:05:00Z",
"lastQuoteAt": "2026-07-19T22:14:03Z",
"eligibilityNote": "inventory rebalancing - expected to resume pricing shortly"
}
]
}{
"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:
/solvers:
get:
summary: Solver Roster
operationId: getSolvers
description: >-
Lists the solvers and LPs your workspace can reach - the counterparties every
quote request fans out to. An id appears here only after the counterparty clears
the workspace's eligibility gates (onboarding, compliance, corridor coverage);
`status` then says whether it is pricing right now. An empty eligible roster for a
pair is exactly what surfaces as a typed productUnavailable answer on POST
/quotes.
servers:
- url: https://api.tetrafi.io/api/v1
parameters:
- name: status
in: query
required: false
schema:
anyOf:
- $ref: '#/components/schemas/SolverStatus'
- type: 'null'
title: Status
description: Keep only counterparties in this roster state.
description: Keep only counterparties in this roster state.
- name: corridor
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Corridor
description: >-
Keep only counterparties eligible to quote this corridor slug, e.g.
optimism-base.
description: >-
Keep only counterparties eligible to quote this corridor slug, e.g.
optimism-base.
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/SolversResponse'
example:
solvers:
- id: lp-atlas
status: active
kind: lp
corridors:
- optimism-base
- base-optimism
firstSeenAt: '2026-01-12T09:30:00Z'
lastQuoteAt: '2026-07-20T13:58:41Z'
eligibilityNote: null
- id: solver-corsair
status: standby
kind: solver
corridors:
- ethereum-arc
firstSeenAt: '2026-03-02T16:05:00Z'
lastQuoteAt: '2026-07-19T22:14:03Z'
eligibilityNote: >-
inventory rebalancing - expected to resume pricing shortly
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
components:
schemas:
SolverStatus:
type: string
enum:
- active
- standby
- offline
title: SolverStatus
description: >-
Roster state of a solver/LP. active - pricing now and included in quote fan-out;
standby - eligible but temporarily not pricing (maintenance or inventory
rebalancing); offline - unreachable or disabled, excluded from fan-out.
Eligibility itself is decided upstream of this status: only counterparties that
cleared the workspace's onboarding and compliance gates appear in the roster at
all.
HTTPValidationError:
properties:
detail:
items:
$ref: '#/components/schemas/ValidationError'
type: array
title: Detail
type: object
title: HTTPValidationError
SolverInfo:
properties:
id:
type: string
title: Id
description: >-
Stable roster identifier - the same string that appears as solverId on every
quote this counterparty returns.
status:
$ref: '#/components/schemas/SolverStatus'
description: Whether the counterparty is pricing right now.
kind:
anyOf:
- type: string
enum:
- lp
- solver
- type: 'null'
title: Kind
description: >-
What stands behind the id: lp for a market-making liquidity provider quoting
from its own inventory, solver for an execution agent that fills intents.
corridors:
anyOf:
- items:
type: string
type: array
- type: 'null'
title: Corridors
description: >-
Directional corridor slugs this counterparty quotes, e.g. optimism-base.
firstSeenAt:
anyOf:
- type: string
format: date-time
- type: 'null'
title: First Seen At
description: When the counterparty first joined the workspace roster.
lastQuoteAt:
anyOf:
- type: string
format: date-time
- type: 'null'
title: Last Quote At
description: Most recent time it returned a firm quote to this workspace.
eligibilityNote:
anyOf:
- type: string
- type: 'null'
title: Eligibility Note
description: >-
Why quoting is currently limited, when it is - e.g. inventory rebalancing or a
corridor gate. Null when the counterparty is fully eligible.
type: object
required:
- id
- status
title: SolverInfo
description: >-
One solver or LP the workspace can reach. Quote requests fan out only to listed
entries, so this roster is the complete universe of possible counterparties for
your firm quotes.
SolversResponse:
properties:
solvers:
items:
$ref: '#/components/schemas/SolverInfo'
type: array
title: Solvers
description: >-
The workspace's counterparty roster - every solver and LP that quote requests
can reach.
type: object
required:
- solvers
title: SolversResponse
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 counterparties in this roster state. Roster state of a solver/LP. active - pricing now and included in quote fan-out; standby - eligible but temporarily not pricing (maintenance or inventory rebalancing); offline - unreachable or disabled, excluded from fan-out. Eligibility itself is decided upstream of this status: only counterparties that cleared the workspace's onboarding and compliance gates appear in the roster at all.
active, standby, offline Keep only counterparties eligible to quote this corridor slug, e.g. optimism-base.
Response
Successful Response
The workspace's counterparty roster - every solver and LP that quote requests can reach.
Show child attributes
Show child attributes