Tape - full filterable history
Multi-venue options tape - paginated trade history. Returns options trades from Deribit + Bybit + OKX + Binance (BTC + ETH today).
curl --request GET \
--url https://api.example.com/tape \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.example.com/tape"
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://api.example.com/tape', 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.example.com/tape",
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://api.example.com/tape"
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://api.example.com/tape")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/tape")
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_body{
"success": false,
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid API key"
},
"meta": {
"version": "2.0",
"timestamp": "2026-04-29T12:00:00Z"
}
}{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "No data for BTCUSDT"
},
"meta": {
"version": "2.0",
"timestamp": "2026-04-29T12:00:00Z"
}
}{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid request parameters",
"details": {
"errors": []
}
},
"meta": {
"version": "2.0",
"timestamp": "2026-04-29T12:00:00Z"
}
}{
"success": false,
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Try again later."
},
"meta": {
"version": "2.0",
"timestamp": "2026-04-29T12:00:00Z"
}
}next_cursor back as ?before= to walk older history.
How pagination works
order=desc(default) - newest first. The returnednext_cursoris the oldest trade’s timestamp in the page. Pass it as?before=<cursor>on the next call to walk backward.order=asc- oldest first. Thenext_cursoris the newest trade’s timestamp in the page. Pass it as?after=<cursor>to walk forward.- When
has_moreisfalse, you’ve reached the end.
Z (UTC) suffix so they survive being copied straight back into a URL query string.
Derived tags
Thetags parameter accepts a CSV of:
0dte-expiry_dateequals today (UTC).whale- trades withpremium_usd≥ $250 000 by default. Override withpremium_min_usd; the larger of the two wins.atm- strike within ±2 % of the trade’sindex_price. Trades without an index price are excluded.
Coverage
See Tape overview → Venue coverage for per-venue freshness and listing notes.See also
Recent (shorthand)
Flow by strike
Aggregate stats
Live WebSocket
Venue coverage
Authorizations
Your BackQuant API key (same key as v1)
Headers
Query Parameters
Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.
BTCUSDT, ETHUSDT, SOLUSDT, HYPEUSDT CSV venue filter - any of: deribit, bybit, okx, binance, derive, thalex, delta, delta_india, bullish, paradex.
"deribit,bybit"
Exact instrument match (e.g. BTC-30JUN26-100000-C). Case-sensitive.
Filter to calls or puts.
call, put Lower bound on strike (inclusive).
x >= 0Upper bound on strike (inclusive).
x >= 0Minimum trade size in USD (premium_usd column).
x >= 0CSV of tags. 0dte → expiry_date = today (UTC). whale → premium_usd ≥ $250k (configurable via premium_min_usd). atm → strike within ±2% of the trade's index_price.
"0dte,whale"
ISO timestamp - return trades strictly BEFORE this. Walking-backward cursor.
"2026-05-29T01:00:00Z"
ISO timestamp - return trades strictly AFTER this. Walking-forward cursor.
"2026-05-29T00:00:00Z"
Sort by time descending (default, newest first) or ascending.
desc, asc Max trades per page (1-5000).
1 <= x <= 5000Response
Successful Response
curl --request GET \
--url https://api.example.com/tape \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.example.com/tape"
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://api.example.com/tape', 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.example.com/tape",
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://api.example.com/tape"
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://api.example.com/tape")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/tape")
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_body{
"success": false,
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid API key"
},
"meta": {
"version": "2.0",
"timestamp": "2026-04-29T12:00:00Z"
}
}{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "No data for BTCUSDT"
},
"meta": {
"version": "2.0",
"timestamp": "2026-04-29T12:00:00Z"
}
}{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid request parameters",
"details": {
"errors": []
}
},
"meta": {
"version": "2.0",
"timestamp": "2026-04-29T12:00:00Z"
}
}{
"success": false,
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Try again later."
},
"meta": {
"version": "2.0",
"timestamp": "2026-04-29T12:00:00Z"
}
}