curl --request GET \
--url https://hip4-api.totalis.trade/v1/makers/{maker_id}/quote-history \
--header 'Authorization: Bearer <token>'import requests
url = "https://hip4-api.totalis.trade/v1/makers/{maker_id}/quote-history"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://hip4-api.totalis.trade/v1/makers/{maker_id}/quote-history', 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://hip4-api.totalis.trade/v1/makers/{maker_id}/quote-history",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://hip4-api.totalis.trade/v1/makers/{maker_id}/quote-history"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://hip4-api.totalis.trade/v1/makers/{maker_id}/quote-history")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://hip4-api.totalis.trade/v1/makers/{maker_id}/quote-history")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"context": {
"as_of": "2026-09-17T12:00:00Z",
"status": "CURRENT"
},
"from": "2026-09-17T00:00:00Z",
"through": "2026-09-18T00:00:00Z",
"fill_rate": {
"submitted_count": "4",
"filled_count": "1",
"fill_rate_bps": "2500"
},
"items": [
{
"quote_id": "0xa1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1",
"rfq_id": "01998a1e-0000-7000-8000-000000000004",
"kind": "ENTRY",
"cashout_kind": null,
"status": "OPEN",
"submitted_at": "2026-09-17T11:59:50Z",
"expires_at": "2026-09-17T12:00:20Z",
"accepted_at": null,
"resolved_at": null,
"operation_id": null,
"position_id": null,
"legs": [
{
"outcome_id": "1",
"side": "YES"
},
{
"outcome_id": "2",
"side": "NO"
}
],
"stake": "100200400",
"net_stake": "100000000",
"payout": "300000000",
"maker_risk": "200000000",
"price": null
},
{
"quote_id": "0xb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2",
"rfq_id": "01998a1e-0000-7000-8000-000000000003",
"kind": "CASHOUT",
"cashout_kind": "SELL_BACK",
"status": "DECLINED",
"submitted_at": "2026-09-17T11:30:00Z",
"expires_at": "2026-09-17T11:30:45Z",
"accepted_at": "2026-09-17T11:30:05Z",
"resolved_at": null,
"operation_id": null,
"position_id": "0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
"legs": null,
"stake": null,
"net_stake": null,
"payout": null,
"maker_risk": null,
"price": "80000000"
},
{
"quote_id": "0xc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3",
"rfq_id": "01998a1e-0000-7000-8000-000000000002",
"kind": "ENTRY",
"cashout_kind": null,
"status": "FILLED",
"submitted_at": "2026-09-17T10:00:00Z",
"expires_at": "2026-09-17T10:00:30Z",
"accepted_at": "2026-09-17T10:00:04Z",
"resolved_at": "2026-09-17T10:00:07Z",
"operation_id": "0x0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e",
"position_id": "0xc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3",
"legs": [
{
"outcome_id": "1",
"side": "YES"
}
],
"stake": "100200400",
"net_stake": "100000000",
"payout": "300000000",
"maker_risk": "200000000",
"price": null
},
{
"quote_id": "0xd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4",
"rfq_id": "01998a1e-0000-7000-8000-000000000001",
"kind": "ENTRY",
"cashout_kind": null,
"status": "NOT_SELECTED",
"submitted_at": "2026-09-17T09:00:00Z",
"expires_at": "2026-09-17T09:00:30Z",
"accepted_at": null,
"resolved_at": "2026-09-17T09:00:12Z",
"operation_id": null,
"position_id": null,
"legs": [
{
"outcome_id": "3",
"side": "YES"
}
],
"stake": "50000000",
"net_stake": "49900000",
"payout": "90000000",
"maker_risk": "40100000",
"price": null
}
],
"next_cursor": null,
"has_more": false
}{
"error": {
"code": "INVALID_QUERY",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}{
"error": {
"code": "UNAUTHENTICATED",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}{
"error": {
"code": "FORBIDDEN",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}{
"error": {
"code": "NOT_FOUND",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}{
"error": {
"code": "CURSOR_EXPIRED",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "REFRESH"
}
}{
"error": {
"code": "RATE_LIMITED",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "BACKOFF"
}
}{
"error": {
"code": "AUTHORIZATION_UNAVAILABLE",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "BACKOFF"
}
}List quote history
List every quote this maker published in a period, live or not, newest first, with each quote’s current status and the period’s fill rate.
Requires a key for a maker with vault:read.
curl --request GET \
--url https://hip4-api.totalis.trade/v1/makers/{maker_id}/quote-history \
--header 'Authorization: Bearer <token>'import requests
url = "https://hip4-api.totalis.trade/v1/makers/{maker_id}/quote-history"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://hip4-api.totalis.trade/v1/makers/{maker_id}/quote-history', 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://hip4-api.totalis.trade/v1/makers/{maker_id}/quote-history",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://hip4-api.totalis.trade/v1/makers/{maker_id}/quote-history"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://hip4-api.totalis.trade/v1/makers/{maker_id}/quote-history")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://hip4-api.totalis.trade/v1/makers/{maker_id}/quote-history")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"context": {
"as_of": "2026-09-17T12:00:00Z",
"status": "CURRENT"
},
"from": "2026-09-17T00:00:00Z",
"through": "2026-09-18T00:00:00Z",
"fill_rate": {
"submitted_count": "4",
"filled_count": "1",
"fill_rate_bps": "2500"
},
"items": [
{
"quote_id": "0xa1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1",
"rfq_id": "01998a1e-0000-7000-8000-000000000004",
"kind": "ENTRY",
"cashout_kind": null,
"status": "OPEN",
"submitted_at": "2026-09-17T11:59:50Z",
"expires_at": "2026-09-17T12:00:20Z",
"accepted_at": null,
"resolved_at": null,
"operation_id": null,
"position_id": null,
"legs": [
{
"outcome_id": "1",
"side": "YES"
},
{
"outcome_id": "2",
"side": "NO"
}
],
"stake": "100200400",
"net_stake": "100000000",
"payout": "300000000",
"maker_risk": "200000000",
"price": null
},
{
"quote_id": "0xb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2",
"rfq_id": "01998a1e-0000-7000-8000-000000000003",
"kind": "CASHOUT",
"cashout_kind": "SELL_BACK",
"status": "DECLINED",
"submitted_at": "2026-09-17T11:30:00Z",
"expires_at": "2026-09-17T11:30:45Z",
"accepted_at": "2026-09-17T11:30:05Z",
"resolved_at": null,
"operation_id": null,
"position_id": "0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
"legs": null,
"stake": null,
"net_stake": null,
"payout": null,
"maker_risk": null,
"price": "80000000"
},
{
"quote_id": "0xc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3",
"rfq_id": "01998a1e-0000-7000-8000-000000000002",
"kind": "ENTRY",
"cashout_kind": null,
"status": "FILLED",
"submitted_at": "2026-09-17T10:00:00Z",
"expires_at": "2026-09-17T10:00:30Z",
"accepted_at": "2026-09-17T10:00:04Z",
"resolved_at": "2026-09-17T10:00:07Z",
"operation_id": "0x0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e",
"position_id": "0xc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3",
"legs": [
{
"outcome_id": "1",
"side": "YES"
}
],
"stake": "100200400",
"net_stake": "100000000",
"payout": "300000000",
"maker_risk": "200000000",
"price": null
},
{
"quote_id": "0xd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4",
"rfq_id": "01998a1e-0000-7000-8000-000000000001",
"kind": "ENTRY",
"cashout_kind": null,
"status": "NOT_SELECTED",
"submitted_at": "2026-09-17T09:00:00Z",
"expires_at": "2026-09-17T09:00:30Z",
"accepted_at": null,
"resolved_at": "2026-09-17T09:00:12Z",
"operation_id": null,
"position_id": null,
"legs": [
{
"outcome_id": "3",
"side": "YES"
}
],
"stake": "50000000",
"net_stake": "49900000",
"payout": "90000000",
"maker_risk": "40100000",
"price": null
}
],
"next_cursor": null,
"has_more": false
}{
"error": {
"code": "INVALID_QUERY",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}{
"error": {
"code": "UNAUTHENTICATED",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}{
"error": {
"code": "FORBIDDEN",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}{
"error": {
"code": "NOT_FOUND",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}{
"error": {
"code": "CURSOR_EXPIRED",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "REFRESH"
}
}{
"error": {
"code": "RATE_LIMITED",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "BACKOFF"
}
}{
"error": {
"code": "AUTHORIZATION_UNAVAILABLE",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "BACKOFF"
}
}Authorizations
Scoped API key (ttk_...), created in the Totalis app or by a wallet-session user through the API keys routes with a fresh wallet signature; those routes never accept a key. Each key acts for one account, yours or a maker's, and holds only scopes that account can use. Each operation lists the scopes it requires. Send no Origin.
Headers
Required for browser sessions; API keys do not require an Origin.
Path Parameters
On-chain maker ID, as a decimal string. An API key may only name the maker it is bound to; other makers return 404.
20^(0|[1-9][0-9]{0,18}|1[0-7][0-9]{18}|18[0-3][0-9]{17}|184[0-3][0-9]{16}|1844[0-5][0-9]{15}|18446[0-6][0-9]{14}|184467[0-3][0-9]{13}|1844674[0-3][0-9]{12}|184467440[0-6][0-9]{10}|1844674407[0-2][0-9]{9}|18446744073[0-6][0-9]{8}|1844674407370[0-8][0-9]{6}|18446744073709[0-4][0-9]{5}|184467440737095[0-4][0-9]{4}|18446744073709550[0-9]{3}|18446744073709551[0-5][0-9]{2}|1844674407370955160[0-9]|1844674407370955161[0-5])$Query Parameters
Inclusive RFC3339 start of the period on submitted_at.
Exclusive RFC3339 end of the period; must be after from.
Return only quotes with this status. The fill rate ignores it. Where the quote stands now. OPEN: live and acceptable. AWAITING_CONFIRMATION: the taker accepted it and the maker has not answered within its two-second deadline yet. ACCEPTED: the maker confirmed and the trade is queued or on its way to chain. FILLED: the trade committed on chain. FAILED: the trade reverted or expired unexecuted. DECLINED: the maker declined the acceptance. TIMED_OUT: the maker did not answer the acceptance in time. CANCELLED: the maker withdrew the quote. REPLACED: the maker's newer quote on the same RFQ replaced it. EXPIRED: it or its RFQ lapsed unaccepted. NOT_SELECTED: the RFQ's taker accepted another quote first. RFQ_CANCELLED: the taker cancelled or replaced the RFQ.
OPEN, AWAITING_CONFIRMATION, ACCEPTED, FILLED, FAILED, DECLINED, TIMED_OUT, CANCELLED, REPLACED, EXPIRED, NOT_SELECTED, RFQ_CANCELLED Return, and compute the fill rate over, only quotes of this kind.
ENTRY, CASHOUT Maximum items per page, 1 to 200, default 50. A page may hold fewer, even none, while has_more is true. Maximum items in one page. A page may hold fewer, even none, while has_more is true.
1 <= x <= 200Omit for the first page; then send the previous response's next_cursor unchanged. Opaque list cursor. Send a previous response's next_cursor back unchanged; never build or parse one.
1 - 2048Response
One page of the maker's quotes with one freshness status; display fields only, never signatures, and amounts are atomic USDC strings. A quote's status follows its acceptance, the maker's answer and the trade's chain outcome first, then the quote's book state, then its RFQ. A decline carries no reason, since the maker's answer records none. No shared caching.
Every quote the maker published in a period, not only live ones, with the period's fill rate.
Freshness of this read. Quotes are venue rows read now; FILLED and FAILED follow the vault projection, so as_of is its checkpoint and status is STALE while it lags.
Show child attributes
Show child attributes
Inclusive RFC3339 start of the period on submitted_at, echoed from the query.
Exclusive RFC3339 end of the period, echoed from the query.
The period's fill rate, on a list's first page (no cursor); null on later pages and when the period holds more than 50,000 quotes: ask for a shorter one.
Show child attributes
Show child attributes
Quotes on this page, newest submitted_at first. Each status is read when the page is.
Show child attributes
Show child attributes
Opaque cursor for the next page; null on the last page. Send it back unchanged as cursor with the same filters.
1 - 2048True exactly when next_cursor is non-null. A status-filtered page reads at most 1,000 quotes, so it may hold fewer items than limit, even none, while has_more is true.
Was this page helpful?

