curl --request GET \
--url https://api.blockworks.com/query/timeseries/bridge-protocols/{granularity}/{id} \
--header 'X-Blockworks-API-Key: <api-key>'import requests
url = "https://api.blockworks.com/query/timeseries/bridge-protocols/{granularity}/{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/timeseries/bridge-protocols/{granularity}/{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/timeseries/bridge-protocols/{granularity}/{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/timeseries/bridge-protocols/{granularity}/{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/timeseries/bridge-protocols/{granularity}/{id}")
.header("X-Blockworks-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.blockworks.com/query/timeseries/bridge-protocols/{granularity}/{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": {
"entity": {
"name": "<name>",
"slug": "<slug>"
},
"key": "<Bridge Protocol ID>",
"point_schema": [
{
"description": "Start of the UTC day, week or calendar month.",
"field": "time",
"name": "Time",
"time": true,
"type": "time"
},
{
"description": "Transferred principal in USD, summed over the priced transfer legs only. Null when the period has transfers but none of them has a USD price.",
"field": "bridgeVolumeUSD",
"name": "Bridge Volume (USD)",
"time": false,
"type": "float64",
"unit": "usd"
},
{
"description": "Number of funded transfer legs, priced and unpriced.",
"field": "bridgeTransferCount",
"name": "Bridge Transfer Count",
"time": false,
"type": "int64",
"unit": "count"
}
],
"points": [
[
1704067200,
123.45,
123
]
]
},
"error": null
}{
"data": null,
"error": "unrecognized timeframe \"1y\": expected ytd|qtd|mtd|dtd|htd, <n>m|h|d|w, YYYY-MM-DD, YYYY-MM, YYYY, or RFC3339"
}{
"data": null,
"error": "this model requires authentication"
}{
"data": null,
"error": "You are out of credits (balance 0). Do not retry this request. Visit https://app.blockworks.com/account/api to see balance and get more credits."
}{
"data": null,
"error": "this model requires the \"projects-dataset\" permission; see https://app.blockworks.com/account/api for the public API permissions you hold"
}{
"data": null,
"error": "model \"bridge-protocols\" does not support granularity \"1h\" (supported: \"1d\", \"1w\", \"1mo\")"
}{
"data": null,
"error": "the credit service is temporarily unavailable and this request was refused without charge; retry in a moment"
}Get Bridge Protocol timeseries
Onchain bridge volume and funded transfer legs for one bridge product. Each series is one product, keyed by its Blockworks Research bridge id; several products can share one project. Only blockchain-to-blockchain transfers count, so venue deposit rails (for example Aster) are not included. CCTP direct and unattributed transfers are one cctp product, and Circle Gateway is a separate product. Weeks start on Monday and months on the first day of the calendar month (UTC). Some periods have no data point, and a returned point can have zero transfer counts and zero volume.
curl --request GET \
--url https://api.blockworks.com/query/timeseries/bridge-protocols/{granularity}/{id} \
--header 'X-Blockworks-API-Key: <api-key>'import requests
url = "https://api.blockworks.com/query/timeseries/bridge-protocols/{granularity}/{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/timeseries/bridge-protocols/{granularity}/{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/timeseries/bridge-protocols/{granularity}/{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/timeseries/bridge-protocols/{granularity}/{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/timeseries/bridge-protocols/{granularity}/{id}")
.header("X-Blockworks-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.blockworks.com/query/timeseries/bridge-protocols/{granularity}/{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": {
"entity": {
"name": "<name>",
"slug": "<slug>"
},
"key": "<Bridge Protocol ID>",
"point_schema": [
{
"description": "Start of the UTC day, week or calendar month.",
"field": "time",
"name": "Time",
"time": true,
"type": "time"
},
{
"description": "Transferred principal in USD, summed over the priced transfer legs only. Null when the period has transfers but none of them has a USD price.",
"field": "bridgeVolumeUSD",
"name": "Bridge Volume (USD)",
"time": false,
"type": "float64",
"unit": "usd"
},
{
"description": "Number of funded transfer legs, priced and unpriced.",
"field": "bridgeTransferCount",
"name": "Bridge Transfer Count",
"time": false,
"type": "int64",
"unit": "count"
}
],
"points": [
[
1704067200,
123.45,
123
]
]
},
"error": null
}{
"data": null,
"error": "unrecognized timeframe \"1y\": expected ytd|qtd|mtd|dtd|htd, <n>m|h|d|w, YYYY-MM-DD, YYYY-MM, YYYY, or RFC3339"
}{
"data": null,
"error": "this model requires authentication"
}{
"data": null,
"error": "You are out of credits (balance 0). Do not retry this request. Visit https://app.blockworks.com/account/api to see balance and get more credits."
}{
"data": null,
"error": "this model requires the \"projects-dataset\" permission; see https://app.blockworks.com/account/api for the public API permissions you hold"
}{
"data": null,
"error": "model \"bridge-protocols\" does not support granularity \"1h\" (supported: \"1d\", \"1w\", \"1mo\")"
}{
"data": null,
"error": "the credit service is temporarily unavailable and this request was refused without charge; retry in a moment"
}Authorizations
Path Parameters
Query Parameters
Time window, one of: to-date (ytd, qtd, mtd, dtd, htd); relative, followed by m, h, d or w (30d, 12h, 4w; 1y and 1M are not accepted, use 365d, 52w, ytd or a calendar year); a calendar day (YYYY-MM-DD), month (YYYY-MM) or year (YYYY); or an RFC3339 instant, which runs from then to now. Mutually exclusive with start/end. Optional: with no window at all the query runs from the beginning of the data to now, which is only served where it fits the cap of 9000 points of the requested granularity, so a window is in practice required at fine granularities.
Comma-separated metric fields to return; defaults to every metric. A point always leads with its timestamp, and the values that follow are described by point_schema in catalog order regardless of the order requested here.
bridgeVolumeUSD, bridgeTransferCount, bridgePricedTransferCount, bridgeUnpricedTransferCount