Create export schema
Creates a custom export schema with user-defined column mappings.
Each column extracts data from system metadata (meta) or from
per-exchange JSON extraction rules (data).
# pip install ticksupply
from ticksupply import Client
client = Client(api_key="<api-key>")
schema = client.export_schemas.create(
name="my_trades",
stream_category="trade",
unfold={"bybit_linear": {"path": "data"}},
columns=[
{"output_column": "timestamp_ns",
"meta": {"value": "collection_timestamp_ns", "format": "ns"}},
{"output_column": "price",
"data": {"binance": {"json": {"path": "data.p",
"type": "decimal(18)"}}}},
],
)
print(schema)// cargo add ticksupply
// cargo add tokio --features full
use ticksupply::resources::export_schemas::{
DataType, ExchangeExtractor, MetaExtraction, MetaValue, SchemaColumn,
SchemaContent, StreamCategory, TimestampFormat, UnfoldConfig,
};
use ticksupply::Client;
#[tokio::main]
async fn main() -> ticksupply::Result<()> {
let client = Client::with_api_key("<api-key>")?;
let content = SchemaContent::builder()
.column(SchemaColumn::meta(
"timestamp_ns",
MetaExtraction::new(MetaValue::CollectionTimestampNs)
.format(TimestampFormat::Ns),
))
.column(SchemaColumn::data("price").exchange(
"binance",
ExchangeExtractor::json("data.p", DataType::Decimal(18)),
))
.unfold("bybit_linear", UnfoldConfig::new("data"))
.build();
let schema = client.export_schemas()
.create("my_trades", StreamCategory::Trade, content)
.send()
.await?;
println!("{schema:#?}");
Ok(())
}
curl --request POST \
--url https://api.ticksupply.com/v1/export-schemas \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--data @- <<EOF
{
"name": "my_trades",
"stream_category": "trade",
"unfold": {
"bybit_linear": {
"path": "data"
},
"bybit_spot": {
"path": "data"
}
},
"columns": [
{
"output_column": "timestamp_ns",
"meta": {
"value": "collection_timestamp_ns",
"format": "ns"
}
},
{
"output_column": "price",
"data": {
"binance": {
"json": {
"path": "data.p",
"type": "decimal(18)"
}
},
"bybit_linear": {
"json": {
"path": "data.p",
"type": "decimal(18)"
}
}
}
},
{
"output_column": "quantity",
"data": {
"binance": {
"json": {
"path": "data.q",
"type": "decimal(18)"
}
},
"bybit_linear": {
"json": {
"path": "data.v",
"type": "decimal(18)"
}
}
}
},
{
"output_column": "side",
"data": {
"binance": {
"json": {
"path": "data.m",
"type": "bool"
},
"transform": "CASE WHEN {v} = false THEN 'buy' ELSE 'sell' END"
},
"bybit_linear": {
"json": {
"path": "data.S",
"type": "string"
}
}
}
}
]
}
EOFconst options = {
method: 'POST',
headers: {'X-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'my_trades',
stream_category: 'trade',
unfold: {bybit_linear: {path: 'data'}, bybit_spot: {path: 'data'}},
columns: [
{
output_column: 'timestamp_ns',
meta: {value: 'collection_timestamp_ns', format: 'ns'}
},
{
output_column: 'price',
data: {
binance: {json: {path: 'data.p', type: 'decimal(18)'}},
bybit_linear: {json: {path: 'data.p', type: 'decimal(18)'}}
}
},
{
output_column: 'quantity',
data: {
binance: {json: {path: 'data.q', type: 'decimal(18)'}},
bybit_linear: {json: {path: 'data.v', type: 'decimal(18)'}}
}
},
{
output_column: 'side',
data: {
binance: {
json: {path: 'data.m', type: 'bool'},
transform: 'CASE WHEN {v} = false THEN \'buy\' ELSE \'sell\' END'
},
bybit_linear: {json: {path: 'data.S', type: 'string'}}
}
}
]
})
};
fetch('https://api.ticksupply.com/v1/export-schemas', 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.ticksupply.com/v1/export-schemas",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'my_trades',
'stream_category' => 'trade',
'unfold' => [
'bybit_linear' => [
'path' => 'data'
],
'bybit_spot' => [
'path' => 'data'
]
],
'columns' => [
[
'output_column' => 'timestamp_ns',
'meta' => [
'value' => 'collection_timestamp_ns',
'format' => 'ns'
]
],
[
'output_column' => 'price',
'data' => [
'binance' => [
'json' => [
'path' => 'data.p',
'type' => 'decimal(18)'
]
],
'bybit_linear' => [
'json' => [
'path' => 'data.p',
'type' => 'decimal(18)'
]
]
]
],
[
'output_column' => 'quantity',
'data' => [
'binance' => [
'json' => [
'path' => 'data.q',
'type' => 'decimal(18)'
]
],
'bybit_linear' => [
'json' => [
'path' => 'data.v',
'type' => 'decimal(18)'
]
]
]
],
[
'output_column' => 'side',
'data' => [
'binance' => [
'json' => [
'path' => 'data.m',
'type' => 'bool'
],
'transform' => 'CASE WHEN {v} = false THEN \'buy\' ELSE \'sell\' END'
],
'bybit_linear' => [
'json' => [
'path' => 'data.S',
'type' => 'string'
]
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.ticksupply.com/v1/export-schemas"
payload := strings.NewReader("{\n \"name\": \"my_trades\",\n \"stream_category\": \"trade\",\n \"unfold\": {\n \"bybit_linear\": {\n \"path\": \"data\"\n },\n \"bybit_spot\": {\n \"path\": \"data\"\n }\n },\n \"columns\": [\n {\n \"output_column\": \"timestamp_ns\",\n \"meta\": {\n \"value\": \"collection_timestamp_ns\",\n \"format\": \"ns\"\n }\n },\n {\n \"output_column\": \"price\",\n \"data\": {\n \"binance\": {\n \"json\": {\n \"path\": \"data.p\",\n \"type\": \"decimal(18)\"\n }\n },\n \"bybit_linear\": {\n \"json\": {\n \"path\": \"data.p\",\n \"type\": \"decimal(18)\"\n }\n }\n }\n },\n {\n \"output_column\": \"quantity\",\n \"data\": {\n \"binance\": {\n \"json\": {\n \"path\": \"data.q\",\n \"type\": \"decimal(18)\"\n }\n },\n \"bybit_linear\": {\n \"json\": {\n \"path\": \"data.v\",\n \"type\": \"decimal(18)\"\n }\n }\n }\n },\n {\n \"output_column\": \"side\",\n \"data\": {\n \"binance\": {\n \"json\": {\n \"path\": \"data.m\",\n \"type\": \"bool\"\n },\n \"transform\": \"CASE WHEN {v} = false THEN 'buy' ELSE 'sell' END\"\n },\n \"bybit_linear\": {\n \"json\": {\n \"path\": \"data.S\",\n \"type\": \"string\"\n }\n }\n }\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Api-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.ticksupply.com/v1/export-schemas")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"my_trades\",\n \"stream_category\": \"trade\",\n \"unfold\": {\n \"bybit_linear\": {\n \"path\": \"data\"\n },\n \"bybit_spot\": {\n \"path\": \"data\"\n }\n },\n \"columns\": [\n {\n \"output_column\": \"timestamp_ns\",\n \"meta\": {\n \"value\": \"collection_timestamp_ns\",\n \"format\": \"ns\"\n }\n },\n {\n \"output_column\": \"price\",\n \"data\": {\n \"binance\": {\n \"json\": {\n \"path\": \"data.p\",\n \"type\": \"decimal(18)\"\n }\n },\n \"bybit_linear\": {\n \"json\": {\n \"path\": \"data.p\",\n \"type\": \"decimal(18)\"\n }\n }\n }\n },\n {\n \"output_column\": \"quantity\",\n \"data\": {\n \"binance\": {\n \"json\": {\n \"path\": \"data.q\",\n \"type\": \"decimal(18)\"\n }\n },\n \"bybit_linear\": {\n \"json\": {\n \"path\": \"data.v\",\n \"type\": \"decimal(18)\"\n }\n }\n }\n },\n {\n \"output_column\": \"side\",\n \"data\": {\n \"binance\": {\n \"json\": {\n \"path\": \"data.m\",\n \"type\": \"bool\"\n },\n \"transform\": \"CASE WHEN {v} = false THEN 'buy' ELSE 'sell' END\"\n },\n \"bybit_linear\": {\n \"json\": {\n \"path\": \"data.S\",\n \"type\": \"string\"\n }\n }\n }\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ticksupply.com/v1/export-schemas")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"my_trades\",\n \"stream_category\": \"trade\",\n \"unfold\": {\n \"bybit_linear\": {\n \"path\": \"data\"\n },\n \"bybit_spot\": {\n \"path\": \"data\"\n }\n },\n \"columns\": [\n {\n \"output_column\": \"timestamp_ns\",\n \"meta\": {\n \"value\": \"collection_timestamp_ns\",\n \"format\": \"ns\"\n }\n },\n {\n \"output_column\": \"price\",\n \"data\": {\n \"binance\": {\n \"json\": {\n \"path\": \"data.p\",\n \"type\": \"decimal(18)\"\n }\n },\n \"bybit_linear\": {\n \"json\": {\n \"path\": \"data.p\",\n \"type\": \"decimal(18)\"\n }\n }\n }\n },\n {\n \"output_column\": \"quantity\",\n \"data\": {\n \"binance\": {\n \"json\": {\n \"path\": \"data.q\",\n \"type\": \"decimal(18)\"\n }\n },\n \"bybit_linear\": {\n \"json\": {\n \"path\": \"data.v\",\n \"type\": \"decimal(18)\"\n }\n }\n }\n },\n {\n \"output_column\": \"side\",\n \"data\": {\n \"binance\": {\n \"json\": {\n \"path\": \"data.m\",\n \"type\": \"bool\"\n },\n \"transform\": \"CASE WHEN {v} = false THEN 'buy' ELSE 'sell' END\"\n },\n \"bybit_linear\": {\n \"json\": {\n \"path\": \"data.S\",\n \"type\": \"string\"\n }\n }\n }\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "sch_0194a1b2c3d4e5f6a7b8c9d0e1f2a3b4",
"name": "normalized",
"stream_category": "trade",
"is_built_in": false,
"created_at": "2023-11-07T05:31:56Z",
"version": 1,
"has_draft": false,
"columns": [
{
"output_column": "price",
"meta": {
"value": "collection_timestamp_ns",
"format": "ns"
},
"data": {}
}
],
"unfold": {},
"derive": {}
}{
"error": {
"code": "invalid_argument",
"message": "Invalid datastream_id: must be a positive integer"
}
}{
"error": {
"code": "unauthenticated",
"message": "Invalid or missing API key"
}
}{
"error": {
"code": "request_timeout",
"message": "Request exceeded 10s deadline"
}
}{
"error": {
"code": "invalid_argument",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded. Retry after 30 seconds."
}
}{
"error": {
"code": "internal",
"message": "An internal error occurred"
}
}Authorizations
Your API key. Get one from the dashboard at https://app.ticksupply.com/api-keys
Headers
Unique key for idempotent requests. If you retry a request with the same key, you'll receive the original response without the operation being performed again.
Must be a valid UUID (any version — v4 recommended for uniqueness), up to 128 characters.
128Body
Schema name. Unique per (account, stream_category) — you can reuse the same name across different categories. Conflicts with built-in schema names for the same category are also rejected.
"my_trades"
Stream category this schema applies to. Must match the category of the datastreams it will be used with.
trade, orderbook, book_update, quote, kline, ticker, liquidation "trade"
Column definitions, in output order. Must contain at least one column. Capped at 100 columns by default; contact support to request a higher limit for your account. Exceeding the limit returns 400 invalid_argument.
1Show child attributes
Show child attributes
Per-exchange unfold rules. When an exchange packs multiple events into one JSON array, unfold expands each element into its own row. Keys are exchange codes, values specify the JSON path to the array.
Show child attributes
Show child attributes
Per-exchange derived-field rules. Each exchange maps to a list of synthetic fields computed from the raw message before column extraction. Use this when you need to merge multiple arrays into one (e.g., combine bids and asks into a single tagged array that unfold can then expand into one row per price level). Keys are exchange codes.
Show child attributes
Show child attributes
Response
Schema created
Export schema with the content of its latest published version. Returned by create and get-by-id. Exports that reference the schema by name or ID snapshot the latest published version at the time the export is created.
Export schema ID
^sch_[a-f0-9]{32}$"sch_0194a1b2c3d4e5f6a7b8c9d0e1f2a3b4"
Schema name
"normalized"
Stream category this schema applies to
trade, orderbook, book_update, quote, kline, ticker, liquidation "trade"
true for schemas provided by Ticksupply (e.g., normalized, book_5, book_20). Built-ins are read-only and cannot be deleted. false for schemas you created.
false
Creation timestamp
Published version number reflected in this response. 1 for a newly created schema.
1
Whether an unpublished draft version exists for this schema.
false
Column definitions from the latest published version, in output order.
Show child attributes
Show child attributes
Per-exchange unfold rules. When an exchange packs multiple events into one JSON array, unfold expands each element into its own row. Keys are exchange codes, values specify the JSON path to the array. Omitted when no unfold rules are configured.
Show child attributes
Show child attributes
Per-exchange derived-field rules. Each exchange maps to a list of synthetic fields computed before column extraction. Omitted when no derive rules are configured.
Show child attributes
Show child attributes
Was this page helpful?
# pip install ticksupply
from ticksupply import Client
client = Client(api_key="<api-key>")
schema = client.export_schemas.create(
name="my_trades",
stream_category="trade",
unfold={"bybit_linear": {"path": "data"}},
columns=[
{"output_column": "timestamp_ns",
"meta": {"value": "collection_timestamp_ns", "format": "ns"}},
{"output_column": "price",
"data": {"binance": {"json": {"path": "data.p",
"type": "decimal(18)"}}}},
],
)
print(schema)// cargo add ticksupply
// cargo add tokio --features full
use ticksupply::resources::export_schemas::{
DataType, ExchangeExtractor, MetaExtraction, MetaValue, SchemaColumn,
SchemaContent, StreamCategory, TimestampFormat, UnfoldConfig,
};
use ticksupply::Client;
#[tokio::main]
async fn main() -> ticksupply::Result<()> {
let client = Client::with_api_key("<api-key>")?;
let content = SchemaContent::builder()
.column(SchemaColumn::meta(
"timestamp_ns",
MetaExtraction::new(MetaValue::CollectionTimestampNs)
.format(TimestampFormat::Ns),
))
.column(SchemaColumn::data("price").exchange(
"binance",
ExchangeExtractor::json("data.p", DataType::Decimal(18)),
))
.unfold("bybit_linear", UnfoldConfig::new("data"))
.build();
let schema = client.export_schemas()
.create("my_trades", StreamCategory::Trade, content)
.send()
.await?;
println!("{schema:#?}");
Ok(())
}
curl --request POST \
--url https://api.ticksupply.com/v1/export-schemas \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--data @- <<EOF
{
"name": "my_trades",
"stream_category": "trade",
"unfold": {
"bybit_linear": {
"path": "data"
},
"bybit_spot": {
"path": "data"
}
},
"columns": [
{
"output_column": "timestamp_ns",
"meta": {
"value": "collection_timestamp_ns",
"format": "ns"
}
},
{
"output_column": "price",
"data": {
"binance": {
"json": {
"path": "data.p",
"type": "decimal(18)"
}
},
"bybit_linear": {
"json": {
"path": "data.p",
"type": "decimal(18)"
}
}
}
},
{
"output_column": "quantity",
"data": {
"binance": {
"json": {
"path": "data.q",
"type": "decimal(18)"
}
},
"bybit_linear": {
"json": {
"path": "data.v",
"type": "decimal(18)"
}
}
}
},
{
"output_column": "side",
"data": {
"binance": {
"json": {
"path": "data.m",
"type": "bool"
},
"transform": "CASE WHEN {v} = false THEN 'buy' ELSE 'sell' END"
},
"bybit_linear": {
"json": {
"path": "data.S",
"type": "string"
}
}
}
}
]
}
EOFconst options = {
method: 'POST',
headers: {'X-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'my_trades',
stream_category: 'trade',
unfold: {bybit_linear: {path: 'data'}, bybit_spot: {path: 'data'}},
columns: [
{
output_column: 'timestamp_ns',
meta: {value: 'collection_timestamp_ns', format: 'ns'}
},
{
output_column: 'price',
data: {
binance: {json: {path: 'data.p', type: 'decimal(18)'}},
bybit_linear: {json: {path: 'data.p', type: 'decimal(18)'}}
}
},
{
output_column: 'quantity',
data: {
binance: {json: {path: 'data.q', type: 'decimal(18)'}},
bybit_linear: {json: {path: 'data.v', type: 'decimal(18)'}}
}
},
{
output_column: 'side',
data: {
binance: {
json: {path: 'data.m', type: 'bool'},
transform: 'CASE WHEN {v} = false THEN \'buy\' ELSE \'sell\' END'
},
bybit_linear: {json: {path: 'data.S', type: 'string'}}
}
}
]
})
};
fetch('https://api.ticksupply.com/v1/export-schemas', 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.ticksupply.com/v1/export-schemas",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'my_trades',
'stream_category' => 'trade',
'unfold' => [
'bybit_linear' => [
'path' => 'data'
],
'bybit_spot' => [
'path' => 'data'
]
],
'columns' => [
[
'output_column' => 'timestamp_ns',
'meta' => [
'value' => 'collection_timestamp_ns',
'format' => 'ns'
]
],
[
'output_column' => 'price',
'data' => [
'binance' => [
'json' => [
'path' => 'data.p',
'type' => 'decimal(18)'
]
],
'bybit_linear' => [
'json' => [
'path' => 'data.p',
'type' => 'decimal(18)'
]
]
]
],
[
'output_column' => 'quantity',
'data' => [
'binance' => [
'json' => [
'path' => 'data.q',
'type' => 'decimal(18)'
]
],
'bybit_linear' => [
'json' => [
'path' => 'data.v',
'type' => 'decimal(18)'
]
]
]
],
[
'output_column' => 'side',
'data' => [
'binance' => [
'json' => [
'path' => 'data.m',
'type' => 'bool'
],
'transform' => 'CASE WHEN {v} = false THEN \'buy\' ELSE \'sell\' END'
],
'bybit_linear' => [
'json' => [
'path' => 'data.S',
'type' => 'string'
]
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.ticksupply.com/v1/export-schemas"
payload := strings.NewReader("{\n \"name\": \"my_trades\",\n \"stream_category\": \"trade\",\n \"unfold\": {\n \"bybit_linear\": {\n \"path\": \"data\"\n },\n \"bybit_spot\": {\n \"path\": \"data\"\n }\n },\n \"columns\": [\n {\n \"output_column\": \"timestamp_ns\",\n \"meta\": {\n \"value\": \"collection_timestamp_ns\",\n \"format\": \"ns\"\n }\n },\n {\n \"output_column\": \"price\",\n \"data\": {\n \"binance\": {\n \"json\": {\n \"path\": \"data.p\",\n \"type\": \"decimal(18)\"\n }\n },\n \"bybit_linear\": {\n \"json\": {\n \"path\": \"data.p\",\n \"type\": \"decimal(18)\"\n }\n }\n }\n },\n {\n \"output_column\": \"quantity\",\n \"data\": {\n \"binance\": {\n \"json\": {\n \"path\": \"data.q\",\n \"type\": \"decimal(18)\"\n }\n },\n \"bybit_linear\": {\n \"json\": {\n \"path\": \"data.v\",\n \"type\": \"decimal(18)\"\n }\n }\n }\n },\n {\n \"output_column\": \"side\",\n \"data\": {\n \"binance\": {\n \"json\": {\n \"path\": \"data.m\",\n \"type\": \"bool\"\n },\n \"transform\": \"CASE WHEN {v} = false THEN 'buy' ELSE 'sell' END\"\n },\n \"bybit_linear\": {\n \"json\": {\n \"path\": \"data.S\",\n \"type\": \"string\"\n }\n }\n }\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Api-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.ticksupply.com/v1/export-schemas")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"my_trades\",\n \"stream_category\": \"trade\",\n \"unfold\": {\n \"bybit_linear\": {\n \"path\": \"data\"\n },\n \"bybit_spot\": {\n \"path\": \"data\"\n }\n },\n \"columns\": [\n {\n \"output_column\": \"timestamp_ns\",\n \"meta\": {\n \"value\": \"collection_timestamp_ns\",\n \"format\": \"ns\"\n }\n },\n {\n \"output_column\": \"price\",\n \"data\": {\n \"binance\": {\n \"json\": {\n \"path\": \"data.p\",\n \"type\": \"decimal(18)\"\n }\n },\n \"bybit_linear\": {\n \"json\": {\n \"path\": \"data.p\",\n \"type\": \"decimal(18)\"\n }\n }\n }\n },\n {\n \"output_column\": \"quantity\",\n \"data\": {\n \"binance\": {\n \"json\": {\n \"path\": \"data.q\",\n \"type\": \"decimal(18)\"\n }\n },\n \"bybit_linear\": {\n \"json\": {\n \"path\": \"data.v\",\n \"type\": \"decimal(18)\"\n }\n }\n }\n },\n {\n \"output_column\": \"side\",\n \"data\": {\n \"binance\": {\n \"json\": {\n \"path\": \"data.m\",\n \"type\": \"bool\"\n },\n \"transform\": \"CASE WHEN {v} = false THEN 'buy' ELSE 'sell' END\"\n },\n \"bybit_linear\": {\n \"json\": {\n \"path\": \"data.S\",\n \"type\": \"string\"\n }\n }\n }\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ticksupply.com/v1/export-schemas")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"my_trades\",\n \"stream_category\": \"trade\",\n \"unfold\": {\n \"bybit_linear\": {\n \"path\": \"data\"\n },\n \"bybit_spot\": {\n \"path\": \"data\"\n }\n },\n \"columns\": [\n {\n \"output_column\": \"timestamp_ns\",\n \"meta\": {\n \"value\": \"collection_timestamp_ns\",\n \"format\": \"ns\"\n }\n },\n {\n \"output_column\": \"price\",\n \"data\": {\n \"binance\": {\n \"json\": {\n \"path\": \"data.p\",\n \"type\": \"decimal(18)\"\n }\n },\n \"bybit_linear\": {\n \"json\": {\n \"path\": \"data.p\",\n \"type\": \"decimal(18)\"\n }\n }\n }\n },\n {\n \"output_column\": \"quantity\",\n \"data\": {\n \"binance\": {\n \"json\": {\n \"path\": \"data.q\",\n \"type\": \"decimal(18)\"\n }\n },\n \"bybit_linear\": {\n \"json\": {\n \"path\": \"data.v\",\n \"type\": \"decimal(18)\"\n }\n }\n }\n },\n {\n \"output_column\": \"side\",\n \"data\": {\n \"binance\": {\n \"json\": {\n \"path\": \"data.m\",\n \"type\": \"bool\"\n },\n \"transform\": \"CASE WHEN {v} = false THEN 'buy' ELSE 'sell' END\"\n },\n \"bybit_linear\": {\n \"json\": {\n \"path\": \"data.S\",\n \"type\": \"string\"\n }\n }\n }\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "sch_0194a1b2c3d4e5f6a7b8c9d0e1f2a3b4",
"name": "normalized",
"stream_category": "trade",
"is_built_in": false,
"created_at": "2023-11-07T05:31:56Z",
"version": 1,
"has_draft": false,
"columns": [
{
"output_column": "price",
"meta": {
"value": "collection_timestamp_ns",
"format": "ns"
},
"data": {}
}
],
"unfold": {},
"derive": {}
}{
"error": {
"code": "invalid_argument",
"message": "Invalid datastream_id: must be a positive integer"
}
}{
"error": {
"code": "unauthenticated",
"message": "Invalid or missing API key"
}
}{
"error": {
"code": "request_timeout",
"message": "Request exceeded 10s deadline"
}
}{
"error": {
"code": "invalid_argument",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded. Retry after 30 seconds."
}
}{
"error": {
"code": "internal",
"message": "An internal error occurred"
}
}