Create a dataset and get a URL to upload it to
Creates a dataset AND its first upload session in one call — a presigned URL your client
PUTs the file to directly, no API credentials involved in that PUT. Call
POST /datasets/{datasetId}/uploads/{uploadId}/finalize once the upload completes to kick
off ingest.
Losing this response loses nothing: calling this dataset's
POST /datasets/{datasetId}/uploads returns the very same upload session again rather than
opening a new one, as long as nothing has been finalized against it yet.
v1 is ticker data only — type is not a request field, it is always "ticker" in the
response. instrument must be a plain spot pair (BASE/QUOTE, exactly one /); derivative
forms (e.g. BTC/USDT:USDT) are rejected.
Upload format. A CSV with a header row, a parquet file with the same columns by
name, or a lastra file — our own native columnar format, the same one a dataset's
dataUrl hands back by default, so a downloaded dataset can be handed to another user to
upload with no conversion in between. For CSV/parquet, required: timestamp (ISO-8601, or
numeric epoch seconds/millis/micros — detected from the first row, then enforced for every
later row), close. Optional: open, high, low, volume, quoteVolume, bid,
bidSize, ask, askSize. A lastra upload carries its own fixed column set instead and
only needs a timestamp series and a close series present. Cadence and timestamp unit are
discovered from the data, not declared, for all three.
A CSV upload is converted to our native columnar format (lastra) for storage. A parquet
or lastra upload is stored as-is today. Either way, always check dataFormat on
GET /datasets/{datasetId} and GET /datasets/{datasetId}/uploads/{uploadId} for which
one dataUrl actually is, rather than assuming from how you uploaded it (a converted CSV
and an uploaded lastra file both report dataFormat: "lastra").
The bytes PUT to upload.url may be that file directly, gzipped (.gz), or zipped
(.zip, exactly one file inside — a dataset is one file regardless of how it travels).
Format is detected from the decompressed content itself: there is no filename or
Content-Type anywhere in this flow for a client to declare it with, so nothing needs to
be sent besides the bytes.
Create a dataset and get a URL to upload it to Creates a dataset AND its first upload session in one call — a presigned URL your client PUTs the file to directly, no API credentials involved in that PUT. Call
POST /datasets/{datasetId}/uploads/{uploadId}/finalizeonce the upload completes to kick off ingest.Losing this response loses nothing: calling this dataset's
POST /datasets/{datasetId}/uploadsreturns the very same upload session again rather than opening a new one, as long as nothing has been finalized against it yet.v1 is ticker data only —
typeis not a request field, it is always"ticker"in the response.instrumentmust be a plain spot pair (BASE/QUOTE, exactly one/); derivative forms (e.g.BTC/USDT:USDT) are rejected.Upload format. A CSV with a header row, a parquet file with the same columns by name, or a lastra file — our own native columnar format, the same one a dataset's
dataUrlhands back by default, so a downloaded dataset can be handed to another user to upload with no conversion in between. For CSV/parquet, required:timestamp(ISO-8601, or numeric epoch seconds/millis/micros — detected from the first row, then enforced for every later row),close. Optional:open,high,low,volume,quoteVolume,bid,bidSize,ask,askSize. A lastra upload carries its own fixed column set instead and only needs a timestamp series and a close series present. Cadence and timestamp unit are discovered from the data, not declared, for all three.A CSV upload is converted to our native columnar format (
lastra) for storage. A parquet or lastra upload is stored as-is today. Either way, always checkdataFormatonGET /datasets/{datasetId}andGET /datasets/{datasetId}/uploads/{uploadId}for which onedataUrlactually is, rather than assuming from how you uploaded it (a converted CSV and an uploaded lastra file both reportdataFormat: "lastra").The bytes PUT to
upload.urlmay be that file directly, gzipped (.gz), or zipped (.zip, exactly one file inside — a dataset is one file regardless of how it travels). Format is detected from the decompressed content itself: there is no filename orContent-Typeanywhere in this flow for a client to declare it with, so nothing needs to be sent besides the bytes.