curl --request GET \
--url https://api.paycrest.io/v2/marketsimport requests
url = "https://api.paycrest.io/v2/markets"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.paycrest.io/v2/markets', 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.paycrest.io/v2/markets",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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.paycrest.io/v2/markets"
req, _ := http.NewRequest("GET", url, nil)
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.paycrest.io/v2/markets")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.paycrest.io/v2/markets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"status": "success",
"message": "Operation successful",
"data": {
"asOf": "2023-11-07T05:31:56Z",
"aggregates": {
"settledVolumeUsd": {
"24h": "<string>",
"7d": "<string>",
"30d": "<string>",
"all": "<string>"
},
"settledTxns": {
"24h": 123,
"7d": 123,
"30d": 123,
"all": 123
},
"networkSuccessPercent": {
"24h": "<string>",
"7d": "<string>",
"30d": "<string>"
},
"medianDeliverySecs": {
"24h": 123,
"7d": 123,
"30d": 123
},
"activeProviders": {
"24h": 123,
"7d": 123,
"30d": 123,
"all": 123
},
"activeSenders": {
"24h": 123,
"7d": 123,
"30d": 123,
"all": 123
},
"liveLiquidityUsd": "<string>",
"corridors": 123,
"tokens": 123,
"networks": 123
},
"book": [
{
"providerId": "<string>",
"side": "sell",
"token": "<string>",
"fiat": "<string>",
"network": "<string>",
"rate": "<string>",
"rateType": "fixed",
"min": "<string>",
"max": "<string>",
"balance": "<string>",
"balanceCurrency": "<string>",
"balanceUsd": "<string>",
"settled": 123,
"successPercent": "<string>"
}
]
}
}{
"status": "error",
"message": "Error message",
"data": [
{
"field": "<string>",
"message": "<string>"
}
]
}Get Markets
Returns the live protocol orderbook (all funded, available provider quotes across corridors × tokens × networks) plus network-wide aggregate statistics.
Public endpoint — no authentication required, CORS open. Responses are cached for ~10 s. Requests are per-IP rate limited.
Optional query filters (side, fiat, token, network) apply only to data.book.
data.aggregates always remain network-wide (unfiltered).
Provider balances and success rates are intentionally public to support integrator tooling and the Paycrest Markets dashboard.
curl --request GET \
--url https://api.paycrest.io/v2/marketsimport requests
url = "https://api.paycrest.io/v2/markets"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.paycrest.io/v2/markets', 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.paycrest.io/v2/markets",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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.paycrest.io/v2/markets"
req, _ := http.NewRequest("GET", url, nil)
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.paycrest.io/v2/markets")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.paycrest.io/v2/markets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"status": "success",
"message": "Operation successful",
"data": {
"asOf": "2023-11-07T05:31:56Z",
"aggregates": {
"settledVolumeUsd": {
"24h": "<string>",
"7d": "<string>",
"30d": "<string>",
"all": "<string>"
},
"settledTxns": {
"24h": 123,
"7d": 123,
"30d": 123,
"all": 123
},
"networkSuccessPercent": {
"24h": "<string>",
"7d": "<string>",
"30d": "<string>"
},
"medianDeliverySecs": {
"24h": 123,
"7d": 123,
"30d": 123
},
"activeProviders": {
"24h": 123,
"7d": 123,
"30d": 123,
"all": 123
},
"activeSenders": {
"24h": 123,
"7d": 123,
"30d": 123,
"all": 123
},
"liveLiquidityUsd": "<string>",
"corridors": 123,
"tokens": 123,
"networks": 123
},
"book": [
{
"providerId": "<string>",
"side": "sell",
"token": "<string>",
"fiat": "<string>",
"network": "<string>",
"rate": "<string>",
"rateType": "fixed",
"min": "<string>",
"max": "<string>",
"balance": "<string>",
"balanceCurrency": "<string>",
"balanceUsd": "<string>",
"settled": 123,
"successPercent": "<string>"
}
]
}
}{
"status": "error",
"message": "Error message",
"data": [
{
"field": "<string>",
"message": "<string>"
}
]
}Query parameters
Optional filters narrowdata.book only. data.aggregates always remain network-wide (same values whether or not you filter the book).
| Param | Form | Description |
|---|---|---|
side | single | buy or sell; omit for both. Invalid values return 400 |
fiat | comma-separated | e.g. NGN,KES (case-sensitive codes as stored) |
token | comma-separated | e.g. USDC,USDT |
network | comma-separated | e.g. base,polygon |
Response shape (data)
| Field | Type | Description |
|---|---|---|
asOf | string (ISO 8601) | Timestamp when the response was generated |
aggregates | object | Network-wide aggregate statistics (see below) — not affected by query filters |
book | array | Provider quote rows forming the live orderbook (optionally filtered) |
Book row fields
Each element ofbook is a single provider quote for one side on one network:
| Field | Type | Description |
|---|---|---|
providerId | string | Provider identifier |
side | string | sell = off-ramp (crypto → fiat); buy = on-ramp (fiat → crypto) |
token | string | Token symbol, e.g. USDT, USDC |
fiat | string | Fiat currency code, e.g. NGN, KES |
network | string | Network identifier, e.g. base, ethereum |
rate | string | Provider’s effective rate (fiat per crypto for sell; crypto per fiat for buy) |
rateType | string | fixed or floating |
min | string | Minimum order amount for this corridor |
max | string | Maximum order amount for this corridor |
balance | string | Available liquidity: fiat amount for sell rows, token amount for buy rows |
balanceCurrency | string | Currency of balance — fiat code for sell, token symbol for buy |
balanceUsd | string | Balance normalised to USD |
settled | integer | Total settled orders for this provider in this corridor |
successPercent | string | null | Success rate as a percentage string (null when no settled or refunded history) |
balance is a shared pool repeated across a provider’s networks for the same fiat (sell) or token (buy). De-duplicate by providerId + fiat (sell) or providerId + token (buy) when summing total depth to avoid double-counting.is_available = true, funded (positive balance), enabled fiat/token, non-testnet network. All book rows are public regardless of a provider’s visibility setting—visibility only affects the narrower position benchmark pool on the Get Market Rate endpoint.
Aggregates fields
| Field | Type | Description |
|---|---|---|
settledVolumeUsd | windowed | USD volume of settled orders — 24h, 7d, 30d, all (strings) |
settledTxns | windowed | Count of settled transactions — 24h, 7d, 30d, all (integers) |
networkSuccessPercent | windowed | Network success rate (settled / (settled + refunded)) — 24h, 7d, 30d (strings or null) |
medianDeliverySecs | windowed | Median order delivery time in seconds — 24h, 7d, 30d (integers or null) |
activeProviders | windowed | Distinct providers with ≥1 settled order — 24h, 7d, 30d, all (integers) |
activeSenders | windowed | Distinct senders with ≥1 settled order — 24h, 7d, 30d, all (integers) |
liveLiquidityUsd | string | Total available USD-denominated liquidity across all book rows |
corridors | integer | Distinct token/fiat pairs in the current book |
tokens | integer | Distinct tokens in the current book |
networks | integer | Distinct networks in the current book |
null for a window when no terminal orders exist in that period.
Example
GET https://api.paycrest.io/v2/markets
{
"status": "success",
"message": "OK",
"data": {
"asOf": "2026-06-08T14:30:00Z",
"aggregates": {
"settledVolumeUsd": { "24h": "48200.00", "7d": "312500.00", "30d": "1420000.00", "all": "9800000.00" },
"settledTxns": { "24h": 118, "7d": 790, "30d": 3350, "all": 43000 },
"networkSuccessPercent": { "24h": "98.30", "7d": "97.60", "30d": "97.10" },
"medianDeliverySecs": { "24h": 175, "7d": 190, "30d": 205 },
"activeProviders": { "24h": 42, "7d": 49, "30d": 55, "all": 115 },
"activeSenders": { "24h": 1150, "7d": 8200, "30d": 33000, "all": 490000 },
"liveLiquidityUsd": "2350000.00",
"corridors": 11,
"tokens": 3,
"networks": 4
},
"book": [
{
"providerId": "AbCdEfGh",
"side": "sell",
"token": "USDT",
"fiat": "NGN",
"network": "base",
"rate": "1605.50",
"rateType": "floating",
"min": "500.00",
"max": "500000.00",
"balance": "12000000.00",
"balanceCurrency": "NGN",
"balanceUsd": "7462.69",
"settled": 3200,
"successPercent": "98.90"
},
{
"providerId": "IjKlMnOp",
"side": "buy",
"token": "USDC",
"fiat": "KES",
"network": "ethereum",
"rate": "130.25",
"rateType": "fixed",
"min": "100.00",
"max": "100000.00",
"balance": "9500.00",
"balanceCurrency": "USDC",
"balanceUsd": "9500.00",
"settled": 850,
"successPercent": "97.20"
}
]
}
}
Filtered example
Sell-side USDC offers on Base for NGN or KES. Aggregates in the response are still the full network-wide KPIs.GET https://api.paycrest.io/v2/markets?side=sell&fiat=NGN,KES&token=USDC&network=base
Errors
| HTTP | Cause |
|---|---|
| 400 | Invalid side (expected buy or sell) |
| 429 | Per-IP rate limit exceeded |
| 500 | Internal error |
Query Parameters
Return only buy or sell book rows. Omit for both sides.
Invalid values return 400.
buy, sell Comma-separated fiat currency codes (e.g. NGN,KES). Case-sensitive as stored.
Filters data.book only; omit for all fiats.
Comma-separated token symbols (e.g. USDC,USDT).
Filters data.book only; omit for all tokens.
Comma-separated network identifiers (e.g. base,polygon).
Filters data.book only; omit for all networks.