List recurring crypto window markets
curl --request GET \
--url https://api.agg.market/crypto/recurring-markets \
--header 'x-app-id: <api-key>'import requests
url = "https://api.agg.market/crypto/recurring-markets"
headers = {"x-app-id": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-app-id': '<api-key>'}};
fetch('https://api.agg.market/crypto/recurring-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.agg.market/crypto/recurring-markets",
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-app-id: <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.agg.market/crypto/recurring-markets"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-app-id", "<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.agg.market/crypto/recurring-markets")
.header("x-app-id", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.agg.market/crypto/recurring-markets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-app-id"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "<string>",
"asset": "<string>",
"quoteAsset": "USD",
"windowStart": "<string>",
"windowEnd": "<string>",
"markets": [
{
"venueEventId": "<string>",
"venueMarketId": "<string>",
"externalEventId": "<string>",
"externalMarketId": "<string>",
"question": "<string>",
"routeable": true,
"splitOrdersAllowed": true,
"outcomes": [
{
"venueMarketOutcomeId": "<string>",
"externalOutcomeId": "<string>",
"routeable": true,
"splitOrdersAllowed": true,
"label": "<string>",
"title": "<string>",
"midpoint": 123,
"bestBid": 123,
"bestAsk": 123,
"markSource": "<string>",
"lastKnownPrice": 123,
"orderbookDepth": {
"currency": "USD",
"amountUsd": 123,
"buy": {
"levels": [
{
"price": 123,
"size": 123,
"notionalUsd": 123,
"cumulativeSize": 123,
"cumulativeNotionalUsd": 123,
"fillSize": 123,
"fillNotionalUsd": 123
}
],
"totalSize": 123,
"totalNotionalUsd": 123,
"requestedNotionalUsd": 123,
"filledSize": 123,
"filledNotionalUsd": 123,
"unfilledNotionalUsd": 123,
"avgPrice": 123,
"worstPrice": 123,
"fillsComplete": true
},
"sell": {
"levels": [
{
"price": 123,
"size": 123,
"notionalUsd": 123,
"cumulativeSize": 123,
"cumulativeNotionalUsd": 123,
"fillSize": 123,
"fillNotionalUsd": 123
}
],
"totalSize": 123,
"totalNotionalUsd": 123,
"requestedNotionalUsd": 123,
"filledSize": 123,
"filledNotionalUsd": 123,
"unfilledNotionalUsd": 123,
"avgPrice": 123,
"worstPrice": 123,
"fillsComplete": true
}
}
}
],
"metrics": {
"volume": 123,
"volume24h": 123,
"openInterest": 123,
"liquidity": 123,
"spread": 123
},
"resolution": {
"sourceName": "<string>",
"sourceUrl": "<string>",
"sourceDomain": "<string>",
"rawCriteria": "<unknown>"
},
"referencePrice": {
"asset": "<string>",
"quoteAsset": "USD",
"raw": "<string>",
"decimals": 123,
"normalized": 123,
"timestamp": "<string>",
"provider": "<string>",
"providerMarketId": "<string>",
"fetchedAt": "<string>",
"ageMs": 1,
"refreshing": true,
"stale": true
}
}
],
"comparisons": {
"referencePrice": {
"count": 123,
"min": {
"venueMarketId": "<string>",
"value": 123,
"label": "<string>",
"provider": "<string>",
"providerMarketId": "<string>",
"timestamp": "<string>"
},
"max": {
"venueMarketId": "<string>",
"value": 123,
"label": "<string>",
"provider": "<string>",
"providerMarketId": "<string>",
"timestamp": "<string>"
},
"spread": 123,
"spreadBps": 123,
"byVenue": [
{
"venueMarketId": "<string>",
"value": 123,
"label": "<string>",
"provider": "<string>",
"providerMarketId": "<string>",
"timestamp": "<string>"
}
]
},
"outcomePrices": {
"up": {
"count": 123,
"min": {
"venueMarketId": "<string>",
"value": 123,
"label": "<string>",
"provider": "<string>",
"providerMarketId": "<string>",
"timestamp": "<string>"
},
"max": {
"venueMarketId": "<string>",
"value": 123,
"label": "<string>",
"provider": "<string>",
"providerMarketId": "<string>",
"timestamp": "<string>"
},
"spread": 123,
"spreadBps": 123,
"byVenue": [
{
"venueMarketId": "<string>",
"value": 123,
"label": "<string>",
"provider": "<string>",
"providerMarketId": "<string>",
"timestamp": "<string>"
}
]
},
"down": {
"count": 123,
"min": {
"venueMarketId": "<string>",
"value": 123,
"label": "<string>",
"provider": "<string>",
"providerMarketId": "<string>",
"timestamp": "<string>"
},
"max": {
"venueMarketId": "<string>",
"value": 123,
"label": "<string>",
"provider": "<string>",
"providerMarketId": "<string>",
"timestamp": "<string>"
},
"spread": 123,
"spreadBps": 123,
"byVenue": [
{
"venueMarketId": "<string>",
"value": 123,
"label": "<string>",
"provider": "<string>",
"providerMarketId": "<string>",
"timestamp": "<string>"
}
]
}
}
}
}
],
"nextCursor": "<string>",
"hasMore": true
}{
"message": "<string>"
}{
"message": "<string>"
}{
"code": "orderbook_service_unavailable",
"message": "<string>",
"retryable": true
}Discovery
List recurring crypto window markets
Returns deterministic crypto window markets grouped by asset, window duration, and derived window start across supported venues. Scope is limited to 5 minute, 15 minute, 1 hour, and 1 day recurring crypto markets.
GET
/
crypto
/
recurring-markets
List recurring crypto window markets
curl --request GET \
--url https://api.agg.market/crypto/recurring-markets \
--header 'x-app-id: <api-key>'import requests
url = "https://api.agg.market/crypto/recurring-markets"
headers = {"x-app-id": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-app-id': '<api-key>'}};
fetch('https://api.agg.market/crypto/recurring-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.agg.market/crypto/recurring-markets",
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-app-id: <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.agg.market/crypto/recurring-markets"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-app-id", "<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.agg.market/crypto/recurring-markets")
.header("x-app-id", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.agg.market/crypto/recurring-markets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-app-id"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "<string>",
"asset": "<string>",
"quoteAsset": "USD",
"windowStart": "<string>",
"windowEnd": "<string>",
"markets": [
{
"venueEventId": "<string>",
"venueMarketId": "<string>",
"externalEventId": "<string>",
"externalMarketId": "<string>",
"question": "<string>",
"routeable": true,
"splitOrdersAllowed": true,
"outcomes": [
{
"venueMarketOutcomeId": "<string>",
"externalOutcomeId": "<string>",
"routeable": true,
"splitOrdersAllowed": true,
"label": "<string>",
"title": "<string>",
"midpoint": 123,
"bestBid": 123,
"bestAsk": 123,
"markSource": "<string>",
"lastKnownPrice": 123,
"orderbookDepth": {
"currency": "USD",
"amountUsd": 123,
"buy": {
"levels": [
{
"price": 123,
"size": 123,
"notionalUsd": 123,
"cumulativeSize": 123,
"cumulativeNotionalUsd": 123,
"fillSize": 123,
"fillNotionalUsd": 123
}
],
"totalSize": 123,
"totalNotionalUsd": 123,
"requestedNotionalUsd": 123,
"filledSize": 123,
"filledNotionalUsd": 123,
"unfilledNotionalUsd": 123,
"avgPrice": 123,
"worstPrice": 123,
"fillsComplete": true
},
"sell": {
"levels": [
{
"price": 123,
"size": 123,
"notionalUsd": 123,
"cumulativeSize": 123,
"cumulativeNotionalUsd": 123,
"fillSize": 123,
"fillNotionalUsd": 123
}
],
"totalSize": 123,
"totalNotionalUsd": 123,
"requestedNotionalUsd": 123,
"filledSize": 123,
"filledNotionalUsd": 123,
"unfilledNotionalUsd": 123,
"avgPrice": 123,
"worstPrice": 123,
"fillsComplete": true
}
}
}
],
"metrics": {
"volume": 123,
"volume24h": 123,
"openInterest": 123,
"liquidity": 123,
"spread": 123
},
"resolution": {
"sourceName": "<string>",
"sourceUrl": "<string>",
"sourceDomain": "<string>",
"rawCriteria": "<unknown>"
},
"referencePrice": {
"asset": "<string>",
"quoteAsset": "USD",
"raw": "<string>",
"decimals": 123,
"normalized": 123,
"timestamp": "<string>",
"provider": "<string>",
"providerMarketId": "<string>",
"fetchedAt": "<string>",
"ageMs": 1,
"refreshing": true,
"stale": true
}
}
],
"comparisons": {
"referencePrice": {
"count": 123,
"min": {
"venueMarketId": "<string>",
"value": 123,
"label": "<string>",
"provider": "<string>",
"providerMarketId": "<string>",
"timestamp": "<string>"
},
"max": {
"venueMarketId": "<string>",
"value": 123,
"label": "<string>",
"provider": "<string>",
"providerMarketId": "<string>",
"timestamp": "<string>"
},
"spread": 123,
"spreadBps": 123,
"byVenue": [
{
"venueMarketId": "<string>",
"value": 123,
"label": "<string>",
"provider": "<string>",
"providerMarketId": "<string>",
"timestamp": "<string>"
}
]
},
"outcomePrices": {
"up": {
"count": 123,
"min": {
"venueMarketId": "<string>",
"value": 123,
"label": "<string>",
"provider": "<string>",
"providerMarketId": "<string>",
"timestamp": "<string>"
},
"max": {
"venueMarketId": "<string>",
"value": 123,
"label": "<string>",
"provider": "<string>",
"providerMarketId": "<string>",
"timestamp": "<string>"
},
"spread": 123,
"spreadBps": 123,
"byVenue": [
{
"venueMarketId": "<string>",
"value": 123,
"label": "<string>",
"provider": "<string>",
"providerMarketId": "<string>",
"timestamp": "<string>"
}
]
},
"down": {
"count": 123,
"min": {
"venueMarketId": "<string>",
"value": 123,
"label": "<string>",
"provider": "<string>",
"providerMarketId": "<string>",
"timestamp": "<string>"
},
"max": {
"venueMarketId": "<string>",
"value": 123,
"label": "<string>",
"provider": "<string>",
"providerMarketId": "<string>",
"timestamp": "<string>"
},
"spread": 123,
"spreadBps": 123,
"byVenue": [
{
"venueMarketId": "<string>",
"value": 123,
"label": "<string>",
"provider": "<string>",
"providerMarketId": "<string>",
"timestamp": "<string>"
}
]
}
}
}
}
],
"nextCursor": "<string>",
"hasMore": true
}{
"message": "<string>"
}{
"message": "<string>"
}{
"code": "orderbook_service_unavailable",
"message": "<string>",
"retryable": true
}Authorizations
Your application ID. Required for all app-tier and user-tier routes.
Query Parameters
Recurring crypto duration. Accepts canonical ISO-8601 durations (PT5M, PT15M, PT1H, P1D) or friendly aliases such as 5m, 15m, 1h, and 1d.
Recurring crypto duration. Accepts canonical ISO-8601 durations (PT5M, PT15M, PT1H, P1D) or friendly aliases such as 5m, 15m, 1h, and 1d.
Available options:
current Available options:
kalshi, polymarket, limitless, opinion, predict, probable, myriad, hyperliquid Available options:
open, closed, resolved, unopened, paused Required range:
1 <= x <= 100Available options:
true, false Available options:
true, false Available options:
true, false Available options:
true, false Required range:
1 <= x <= 15Required range:
x > 0⌘I