curl --request GET \
--url https://api.blockworks.com/query/tabular/perpetual-markets/{id} \
--header 'X-Blockworks-API-Key: <api-key>'import requests
url = "https://api.blockworks.com/query/tabular/perpetual-markets/{id}"
headers = {"X-Blockworks-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Blockworks-API-Key': '<api-key>'}};
fetch('https://api.blockworks.com/query/tabular/perpetual-markets/{id}', 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.blockworks.com/query/tabular/perpetual-markets/{id}",
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-Blockworks-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.blockworks.com/query/tabular/perpetual-markets/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Blockworks-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.blockworks.com/query/tabular/perpetual-markets/{id}")
.header("X-Blockworks-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.blockworks.com/query/tabular/perpetual-markets/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Blockworks-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"baseAssetID": "<baseAssetID>",
"baseAssetName": "<baseAssetName>",
"baseAssetSerialID": 123,
"baseAssetSlug": "<baseAssetSlug>",
"baseAssetSymbol": "<baseAssetSymbol>",
"contractType": "<contractType>",
"exchange": "<exchange>",
"exchangeID": "<exchangeID>",
"exchangeName": "<exchangeName>",
"exchangeSerialID": 123,
"id": "<id>",
"marginType": "<marginType>",
"name": "<name>",
"quoteAssetSerialID": 123,
"quoteCurrency": "<quoteCurrency>",
"settleAssetSerialID": 123,
"settleCurrency": "<settleCurrency>",
"slug": "<slug>",
"symbol": "<symbol>",
"symbolNormalized": "<symbolNormalized>"
},
"error": null,
"metadata": {
"matchedField": "id"
}
}{
"data": null,
"error": "unknown selection field \"nope\""
}{
"data": null,
"error": "this model requires authentication"
}{
"data": null,
"error": "this model requires the \"market_data_unified\" permission"
}{
"data": null,
"error": "no row found matching \"unknown\""
}Get Perpetual Market
One row per perpetual futures contract on a centralized exchange, keyed by exchange and contract symbol: exchange, symbol, base asset, quote and settle currency, contract type and margin type. The id is the series key of the perpetual-markets timeseries model; filter by base asset to find every venue listing an asset’s perpetual.
curl --request GET \
--url https://api.blockworks.com/query/tabular/perpetual-markets/{id} \
--header 'X-Blockworks-API-Key: <api-key>'import requests
url = "https://api.blockworks.com/query/tabular/perpetual-markets/{id}"
headers = {"X-Blockworks-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Blockworks-API-Key': '<api-key>'}};
fetch('https://api.blockworks.com/query/tabular/perpetual-markets/{id}', 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.blockworks.com/query/tabular/perpetual-markets/{id}",
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-Blockworks-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.blockworks.com/query/tabular/perpetual-markets/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Blockworks-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.blockworks.com/query/tabular/perpetual-markets/{id}")
.header("X-Blockworks-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.blockworks.com/query/tabular/perpetual-markets/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Blockworks-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"baseAssetID": "<baseAssetID>",
"baseAssetName": "<baseAssetName>",
"baseAssetSerialID": 123,
"baseAssetSlug": "<baseAssetSlug>",
"baseAssetSymbol": "<baseAssetSymbol>",
"contractType": "<contractType>",
"exchange": "<exchange>",
"exchangeID": "<exchangeID>",
"exchangeName": "<exchangeName>",
"exchangeSerialID": 123,
"id": "<id>",
"marginType": "<marginType>",
"name": "<name>",
"quoteAssetSerialID": 123,
"quoteCurrency": "<quoteCurrency>",
"settleAssetSerialID": 123,
"settleCurrency": "<settleCurrency>",
"slug": "<slug>",
"symbol": "<symbol>",
"symbolNormalized": "<symbolNormalized>"
},
"error": null,
"metadata": {
"matchedField": "id"
}
}{
"data": null,
"error": "unknown selection field \"nope\""
}{
"data": null,
"error": "this model requires authentication"
}{
"data": null,
"error": "this model requires the \"market_data_unified\" permission"
}{
"data": null,
"error": "no row found matching \"unknown\""
}Authorizations
API key sent in the X-Blockworks-API-Key header; x-messari-api-key is accepted for existing integrations. The catalog endpoints and models on the public access tier need no key.
Path Parameters
The Perpetual Market ID identifying the row. Falls back to the alternative identifier fields (slug, tried in that order) when no Perpetual Market ID matches; metadata.matchedField says which one matched.
Query Parameters
Comma-separated fields to return; defaults to all fields.
id, name, slug, exchange, symbol, symbolNormalized, baseAssetID, baseAssetName, baseAssetSlug, baseAssetSymbol, baseAssetSerialID, quoteAssetSerialID, settleAssetSerialID, exchangeSerialID, quoteCurrency, settleCurrency, contractType, marginType, exchangeID, exchangeName