curl --request GET \
--url https://propamm.kipseli.win/v2/price \
--header 'X-API-KEY: <api-key>'import requests
url = "https://propamm.kipseli.win/v2/price"
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://propamm.kipseli.win/v2/price', 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://propamm.kipseli.win/v2/price",
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://propamm.kipseli.win/v2/price"
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://propamm.kipseli.win/v2/price")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://propamm.kipseli.win/v2/price")
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_bodyGet Orderbook
Returns the latest cached on-chain orderbook for all configured token pairs.
The cache refreshes on every new block via eth_subscribe, so the data always
reflects the most recent chain state.
Each pair has a baseToken (the traded token, e.g. WETH) and a quoteToken — the
chain’s quote stablecoin: USDC on Base (8453), USDT on BNB Chain (56), USDG on
Robinhood Chain (4663).
Prices are expressed as quote token per base token (decimal strings).
Amounts are human-readable base token quantities (decimal strings).
Levels are marginal — each level is an independent price point, not cumulative depth.
bids are sorted descending (best bid first); asks are sorted ascending (best ask first).
Use the chainId query parameter to select the chain. Omitting it (or passing 0)
targets the default chain, Base (8453). chainId, blockNumber, and blockTime
in the response all belong to the selected chain.
curl --request GET \
--url https://propamm.kipseli.win/v2/price \
--header 'X-API-KEY: <api-key>'import requests
url = "https://propamm.kipseli.win/v2/price"
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://propamm.kipseli.win/v2/price', 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://propamm.kipseli.win/v2/price",
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://propamm.kipseli.win/v2/price"
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://propamm.kipseli.win/v2/price")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://propamm.kipseli.win/v2/price")
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_bodyeth_subscribe, so the response always reflects the most recent chain state.
Use this endpoint to get current market prices before executing a swap, or to display market depth to users.
Selecting a Chain
Pass the target chain with thechainId query parameter:
# Base (8453)
curl "https://propamm.kipseli.win/v2/price?chainId=8453" \
-H "X-API-KEY: $KIPSELI_API_KEY"
# BNB Chain (56)
curl "https://propamm.kipseli.win/v2/price?chainId=56" \
-H "X-API-KEY: $KIPSELI_API_KEY"
# chainId omitted — falls back to Base (8453)
curl "https://propamm.kipseli.win/v2/price" \
-H "X-API-KEY: $KIPSELI_API_KEY"
quoteToken:
| Chain | chainId | Quote token |
|---|---|---|
| BNB Chain | 56 | USDT — 0x55d398326f99059fF775485246999027B3197955 |
| Base | 8453 | USDC — 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 |
| Robinhood Chain | 4663 | USDG — 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 |
quoteToken. Read it on-chain with getQuoteToken() on the chain’s QuoteLens helper if you need to confirm it at runtime.
chainId is omitted (or 0), the request targets Base (8453). The response echoes the resolved chain in chainId, and blockNumber / blockTime refer to that chain.| Status | Code | When |
|---|---|---|
| 400 | UNSUPPORTED_CHAIN | Well-formed chainId the service does not serve |
| 422 | VALIDATION_ERROR | chainId is not a base-10 unsigned integer |
| 503 | SERVICE_UNAVAILABLE | Supported chain with no live orderbook yet (bootstrapping, or RPC is down) |
Understanding the Orderbook
- bids — prices at which PropAMM will buy the base token (you sell base, receive the quote token). Sorted descending.
- asks — prices at which PropAMM will sell the base token (you buy base, pay the quote token). Sorted ascending.
- price is always quote token per base token — USDC on Base, USDT on BNB Chain, USDG on Robinhood Chain.
- Each level is marginal — independent price points, not cumulative depth.
- Prices and amounts are decimal strings to preserve EVM-scale precision.
price and amount are human-readable decimal strings and unaffected, but any wei-denominated value you compute from them (e.g. minAmountOut in Request Swap Verification) must be scaled with the right decimals for that chain.503 SERVICE_UNAVAILABLE. A 200 with an empty pairs array means the chain is live but currently tracks no pairs.
Alternative: On-chain Quote
For a precise quote for a specific input amount, use the on-chainquote() function with an EIP-712 signature. See the Integration Guide.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
chainId | integer | No | Chain to return the orderbook for. Omitted or 0 targets 8453 (Base). |
Response Fields
Top-level
| Field | Type | Description |
|---|---|---|
chainId | integer | Chain this orderbook belongs to (the resolved chainId) |
blockNumber | integer | Block at which the orderbook was last refreshed |
blockTime | integer | Unix timestamp (seconds) of that block |
pairs | array | One entry per pair configured on that chain |
pairs[].PairOrderbook
| Field | Type | Description |
|---|---|---|
baseToken | string | EVM address of the traded token (e.g. WETH) |
quoteToken | string | EVM address of the chain’s quote token (USDC / USDT / USDG) |
bids | array | Buy-side levels, sorted by descending price |
asks | array | Sell-side levels, sorted by ascending price |
bids[].OrderbookLevel / asks[].OrderbookLevel
| Field | Type | Description |
|---|---|---|
price | string | Quote token per base token, decimal string (e.g. "3200.50") |
amount | string | Base token quantity, decimal string (e.g. "1.5") |
Authorizations
API key issued by the Kipseli team. Required on every request.
Authorization: Bearer <key> is accepted as an alternative.
Query Parameters
Chain to return the orderbook for, as a base-10 unsigned integer.
Supported values: 56 (BNB Chain), 8453 (Base), 4663 (Robinhood Chain).
Omit it (or pass 0) for the default chain, Base (8453).
A chain the service does not serve returns 400 UNSUPPORTED_CHAIN; a malformed
value returns 422 VALIDATION_ERROR; a supported chain whose orderbook is not
live yet returns 503 SERVICE_UNAVAILABLE.
x >= 08453
Response
Current orderbook snapshot for the selected chain
The chain this orderbook belongs to — the requested chainId, or the default
chain when the request omitted it. blockNumber, blockTime, and every token
address below are scoped to it.
8453
The on-chain block number at which the orderbook was last refreshed. Updates on every new block. Zero if the cache has not been populated yet.
29500000
Unix timestamp (seconds) of the block identified by blockNumber.
Zero if the cache has not been populated yet.
1741737600
Orderbook for each pair configured on this chain, each quoted in the chain's
quote token. Empty when the chain is live but currently tracks no pairs — a
chain whose orderbook has not bootstrapped returns 503 instead.
Show child attributes
Show child attributes