@qtsurfer/api-client 0.15.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -103,6 +103,111 @@ export type HalLink = {
103
103
  templated?: boolean;
104
104
  };
105
105
 
106
+ /**
107
+ * Your identity and tier limits. No database call behind this one — safe to fetch on every
108
+ * page load. Live usage against these limits is a separate resource, `GET /account/usage`,
109
+ * deliberately: usage changes on every upload/execution and costs a query to compute, this
110
+ * one doesn't.
111
+ *
112
+ */
113
+ export type Account = {
114
+ /**
115
+ * Your account id — the JWT `sub` claim.
116
+ */
117
+ userId: string;
118
+ /**
119
+ * Your current subscription tier.
120
+ */
121
+ tier: string;
122
+ /**
123
+ * Maximum number of active datasets your tier allows.
124
+ */
125
+ maxDatasets: number;
126
+ /**
127
+ * Maximum size, in bytes, of a single dataset version.
128
+ */
129
+ maxDatasetBytes: number;
130
+ /**
131
+ * Maximum combined storage, in bytes, across every dataset, strategy-execution signal,
132
+ * and registered strategy on your account — one shared pool, not a separate cap per
133
+ * resource type, since they all compete for the same underlying storage. See `GET
134
+ * /account/usage`'s `storageBytesUsed` for your current usage against this number.
135
+ *
136
+ */
137
+ maxTotalStorageBytes: number;
138
+ _links: AccountLinks;
139
+ };
140
+
141
+ /**
142
+ * HAL `_links` for `GET /account`
143
+ */
144
+ export type AccountLinks = {
145
+ /**
146
+ * Link to this resource.
147
+ */
148
+ self: HalLink;
149
+ /**
150
+ * Link to your live usage, `GET /account/usage`.
151
+ */
152
+ usage: HalLink;
153
+ };
154
+
155
+ /**
156
+ * Your live usage of the shared storage pool `GET /account`'s `maxTotalStorageBytes` caps.
157
+ * Not guaranteed real-time — a just-completed upload or strategy execution may take a short
158
+ * moment to be reflected here.
159
+ *
160
+ */
161
+ export type AccountUsage = {
162
+ /**
163
+ * Active datasets counted — the same set `GET /account`'s `maxDatasets` limits.
164
+ */
165
+ datasetsUsed: number;
166
+ /**
167
+ * Combined bytes of every active dataset's current version.
168
+ */
169
+ datasetBytesUsed: number;
170
+ /**
171
+ * Recorded strategy-execution signal uploads.
172
+ */
173
+ signalsUsed: number;
174
+ /**
175
+ * Combined bytes of every recorded signal upload.
176
+ */
177
+ signalBytesUsed: number;
178
+ /**
179
+ * Registered strategies (see `GET /strategies`).
180
+ */
181
+ strategiesUsed: number;
182
+ /**
183
+ * Combined bytes of each registered strategy's source plus its latest compiled
184
+ * bytecode. Superseded (non-latest) compilations aren't counted.
185
+ *
186
+ */
187
+ strategyBytesUsed: number;
188
+ /**
189
+ * `datasetBytesUsed + signalBytesUsed + strategyBytesUsed` — the number checked
190
+ * against `GET /account`'s `maxTotalStorageBytes`.
191
+ *
192
+ */
193
+ storageBytesUsed: number;
194
+ _links: AccountUsageLinks;
195
+ };
196
+
197
+ /**
198
+ * HAL `_links` for `GET /account/usage`
199
+ */
200
+ export type AccountUsageLinks = {
201
+ /**
202
+ * Link to this resource.
203
+ */
204
+ self: HalLink;
205
+ /**
206
+ * Link to your tier limits, `GET /account`.
207
+ */
208
+ account: HalLink;
209
+ };
210
+
106
211
  /**
107
212
  * Exchange instrument with per-data-type coverage and market info
108
213
  */
@@ -182,8 +287,17 @@ export type Exchange = {
182
287
 
183
288
  /**
184
289
  * Managed exchange data sources available for backtesting.
290
+ *
291
+ * * `ticker` — trades. Can be prepared, executed and swept.
292
+ * * `kline` — aggregated bars (candlesticks). Can be prepared, executed and swept. A run reads
293
+ * bars of the `cadence` the data was prepared at: you choose the bar width when you prepare,
294
+ * and the strategy does not fix it. See `PrepareRequest.cadence` for the accepted values.
295
+ * * `funding` — funding rates. Can be **prepared but not executed or swept yet**: a `funding`
296
+ * request to `execute` or `executeSweep` is rejected with `400` before anything is queued,
297
+ * and the message names the sources that can be run.
298
+ *
185
299
  */
186
- export type DataSourceType = "ticker";
300
+ export type DataSourceType = "ticker" | "kline" | "funding";
187
301
 
188
302
  /**
189
303
  * Two shapes, chosen by the `exchangeId` path segment. Against a managed exchange,
@@ -233,9 +347,14 @@ export type PrepareRequest = {
233
347
  * than the source, or not an exact multiple of it, returns `400`. What's accepted, and
234
348
  * what omitting it means, depends on the source:
235
349
  *
236
- * * Managed exchange — one of `1s`, `5s`, `1m`, `3m`, `5m`, `15m`, `30m`, `1h`, `2h`,
237
- * `4h`, `8h`, `12h`, `1d`, `1w`, `1q`; any other label returns `400`. Omitted = `1s`,
238
- * the publisher's native cadence.
350
+ * * Managed exchange, `ticker` or `funding` — one of `1s`, `5s`, `1m`, `3m`, `5m`, `15m`,
351
+ * `30m`, `1h`, `2h`, `4h`, `8h`, `12h`, `1d`, `1w`, `1q`; any other label returns `400`.
352
+ * Omitted = `1s`, the publisher's native cadence.
353
+ * * Managed exchange, `kline` — one of `1s`, `1m`, `5m`, `15m`, `30m`, `1h`, `4h`, `1d`;
354
+ * any other label, including `5s`, `3m` and `8h`, returns `400` and names the accepted
355
+ * ones. Omitted = `1s`. This is the width of the bars a run reads: it is chosen here,
356
+ * once, and the same strategy can be run at several cadences by preparing the range at
357
+ * each.
239
358
  * * Dataset (`exchangeId: user`) — omitted = the dataset version's own discovered
240
359
  * `cadence` (see `DatasetVersion.cadence`), served as-is. Any cadence equal to or
241
360
  * coarser than it and an exact multiple of it is accepted, including ones outside the
@@ -987,8 +1106,9 @@ export type EquityCurveResult = {
987
1106
 
988
1107
  /**
989
1108
  * Unique identifier for a compiled strategy, derived from the source itself: the same code
990
- * always yields the same id, for every caller, whatever its formatting. See
991
- * `POST /strategy` for exactly which rewrites preserve it and which do not.
1109
+ * always yields the same id, for every caller. How much formatting the id ignores depends on
1110
+ * the language — see `POST /strategy` for exactly which rewrites preserve it and which do
1111
+ * not.
992
1112
  *
993
1113
  */
994
1114
  export type StrategyId = string;
@@ -1165,9 +1285,10 @@ export type StrategyState = {
1165
1285
  * A dataset's own metadata — not its data. `currentVersionId` is what a prepare against
1166
1286
  * `exchangeId: user` reads by default; see `DatasetVersion` for what a version carries.
1167
1287
  *
1168
- * `from`/`to`/`cadence` mirror that current version's own discovered range and cadence, so
1169
- * you don't need a second call to `GET /datasets/{datasetId}/uploads/{uploadId}` just to see
1170
- * what a dataset covers. Absent until a version exists.
1288
+ * `from`/`to`/`cadence`/`timestampUnit`/`bytes`/`rows`/`gaps`/`largestGapSteps` mirror that
1289
+ * current version's own discovered range, cadence, timestamp unit and metrics, so you don't
1290
+ * need a second call to `GET /datasets/{datasetId}/uploads/{uploadId}` just to see what a
1291
+ * dataset covers.
1171
1292
  *
1172
1293
  */
1173
1294
  export type Dataset = {
@@ -1219,6 +1340,47 @@ export type Dataset = {
1219
1340
  *
1220
1341
  */
1221
1342
  cadence?: string;
1343
+ /**
1344
+ * `currentVersionId`'s own timestamp unit (see `DatasetVersion.timestampUnit`) — decode
1345
+ * the `timestamp` column of `dataUrl`'s file accordingly. Present only when `status` is
1346
+ * `ready`.
1347
+ *
1348
+ */
1349
+ timestampUnit?: "iso" | "s" | "ms" | "us";
1350
+ /**
1351
+ * * `ready` — `currentVersionId` is set; `from`/`to`/`cadence`/`bytes`/`rows`/`gaps`/
1352
+ * `largestGapSteps` describe it.
1353
+ * * `failed` — the most recent upload/import attempt failed. `currentVersionId` and the
1354
+ * fields above are absent — there is nothing to read yet. See `error`.
1355
+ * * `pending` — nothing has ever been attempted (just created, or an upload was never
1356
+ * finalized).
1357
+ *
1358
+ */
1359
+ status: "ready" | "failed" | "pending";
1360
+ /**
1361
+ * Size of `currentVersionId`'s own stored file. Present only when `status` is `ready` —
1362
+ * see `DatasetVersion.bytes` for what it measures exactly.
1363
+ *
1364
+ */
1365
+ bytes?: number;
1366
+ /**
1367
+ * `currentVersionId`'s own row count. Present only when `status` is `ready`.
1368
+ */
1369
+ rows?: number;
1370
+ /**
1371
+ * `currentVersionId`'s own gap count at its discovered cadence. Present only when `status` is `ready`.
1372
+ */
1373
+ gaps?: number;
1374
+ /**
1375
+ * `currentVersionId`'s own largest gap, in units of its discovered cadence step. Present only when `status` is `ready`.
1376
+ */
1377
+ largestGapSteps?: number;
1378
+ /**
1379
+ * A human-readable reason the most recent upload/import attempt failed. Present only
1380
+ * when `status` is `failed`.
1381
+ *
1382
+ */
1383
+ error?: string;
1222
1384
  };
1223
1385
 
1224
1386
  /**
@@ -1237,8 +1399,9 @@ export type DatasetWithLinks = Dataset & {
1237
1399
  /**
1238
1400
  * Which format `dataUrl` is actually in — check this rather than assuming it
1239
1401
  * matches how you uploaded it. `lastra` — our native columnar format — for a CSV (or
1240
- * gzip/zip of one) upload, always converted on ingest. `parquet` for a parquet
1241
- * upload, stored as-is today.
1402
+ * gzip/zip of one) upload, always converted on ingest, or for a lastra upload,
1403
+ * stored as-is (the value alone doesn't tell you which). `parquet` for a parquet
1404
+ * upload, also stored as-is today.
1242
1405
  *
1243
1406
  */
1244
1407
  dataFormat?: "lastra" | "parquet";
@@ -1359,8 +1522,9 @@ export type DatasetVersion = {
1359
1522
  /**
1360
1523
  * Which format `dataUrl` is actually in — check this rather than assuming it matches
1361
1524
  * how you uploaded it. `lastra` — our native columnar format — for a CSV (or gzip/zip
1362
- * of one) upload, always converted on ingest. `parquet` for a parquet upload, stored
1363
- * as-is today.
1525
+ * of one) upload, always converted on ingest, or for a lastra upload, stored as-is
1526
+ * (the value alone doesn't tell you which). `parquet` for a parquet upload, also
1527
+ * stored as-is today.
1364
1528
  *
1365
1529
  */
1366
1530
  dataFormat?: "lastra" | "parquet";
@@ -1579,6 +1743,255 @@ export type AuthTokenError = {
1579
1743
  message: string;
1580
1744
  };
1581
1745
 
1746
+ /**
1747
+ * One market feed a live run consumes. Exactly one entry per run today.
1748
+ */
1749
+ export type LiveSource = {
1750
+ /**
1751
+ * Venue category. `cx` (centralized exchange) is the only one live runs support today.
1752
+ */
1753
+ venueType: string;
1754
+ exchange: string;
1755
+ segment: string;
1756
+ /**
1757
+ * Both `ticker` and `kline` connect to the lightest (fastest) cadence available for the exchange — today, 1 tick/second on every supported exchange. Choosing a specific cadence is not offered yet.
1758
+ */
1759
+ type: "ticker" | "kline";
1760
+ /**
1761
+ * Instrument symbols, or `["*"]` for every instrument the exchange/segment offers (tier-gated).
1762
+ */
1763
+ instruments: Array<string>;
1764
+ };
1765
+
1766
+ export type StartLiveRequest = {
1767
+ sources: [LiveSource];
1768
+ /**
1769
+ * Strategy parameters to start with. Opaque key/value pairs — see this strategy's own `declaredProperties` (from `POST /strategy`) for the keys it accepts.
1770
+ */
1771
+ params?: {
1772
+ [key: string]: unknown;
1773
+ };
1774
+ /**
1775
+ * A `public` run appears in `GET /live/public` and its signal channel accepts subscriptions from anyone, not only you.
1776
+ */
1777
+ visibility?: "private" | "public";
1778
+ /**
1779
+ * Request that this run's signals be relayed over its WebSocket channel once it reaches the `live` stage — see the "Live execution" guide. Has no effect while the run is still in the `sandbox` stage, regardless of this value.
1780
+ */
1781
+ relay?: boolean;
1782
+ name?: string;
1783
+ description?: string;
1784
+ };
1785
+
1786
+ export type UpdateLiveRequest = {
1787
+ visibility?: "private" | "public";
1788
+ name?: string;
1789
+ description?: string;
1790
+ };
1791
+
1792
+ export type UpdateLiveParamsRequest = {
1793
+ /**
1794
+ * Must be non-empty; every key must be a property your strategy declares.
1795
+ */
1796
+ params: {
1797
+ [key: string]: unknown;
1798
+ };
1799
+ };
1800
+
1801
+ /**
1802
+ * A live run's full state, as returned by starting, reading, or stopping it through its strategy.
1803
+ */
1804
+ export type LiveRun = {
1805
+ strategyId: StrategyId;
1806
+ /**
1807
+ * This run's own id — its canonical identity for `PATCH`/`PUT .../params` and for `GET /live/public`.
1808
+ */
1809
+ runId: string;
1810
+ name?: string;
1811
+ description?: string;
1812
+ visibility: "private" | "public";
1813
+ /**
1814
+ * A new run always starts `SANDBOX` — a trial run compared against a second execution for agreement — and moves to `LIVE` once it passes.
1815
+ */
1816
+ stage: "SANDBOX" | "LIVE";
1817
+ /**
1818
+ * `STARTING` until first observed running; otherwise the runner's own reported state (e.g. `RUNNING`).
1819
+ */
1820
+ state: string;
1821
+ /**
1822
+ * What you last asked for. `state` can lag this briefly after `DELETE`.
1823
+ */
1824
+ desired: "RUNNING" | "STOPPED";
1825
+ /**
1826
+ * Present only when the run stopped because it exceeded its resource allowance.
1827
+ */
1828
+ reason?: string;
1829
+ sources: Array<LiveSource>;
1830
+ params: {
1831
+ [key: string]: unknown;
1832
+ };
1833
+ /**
1834
+ * Increments on every accepted `PUT .../params` call, including one that resends the current values.
1835
+ */
1836
+ paramsVersion: number;
1837
+ /**
1838
+ * Whether this run's signals are being relayed over the WebSocket channel described in the "Live execution" guide, right now. This is the effective value — `false` on a `sandbox` run regardless of what was requested at start; matches the requested value once `stage` reaches `live`.
1839
+ */
1840
+ relay: boolean;
1841
+ /**
1842
+ * Epoch milliseconds.
1843
+ */
1844
+ startedAtMs: number;
1845
+ /**
1846
+ * The sandbox trial's promotion verdict, once one exists. Shape is not yet stabilized as public API — treat as opaque diagnostics.
1847
+ */
1848
+ gate?: {
1849
+ [key: string]: unknown;
1850
+ };
1851
+ };
1852
+
1853
+ /**
1854
+ * A run's state as returned by `PATCH /live/{runId}` — narrower than `LiveRun` (no `strategyId`, `params`, or `desired`), since this endpoint is addressed by `runId` alone.
1855
+ */
1856
+ export type LiveRunCompact = {
1857
+ runId: string;
1858
+ name?: string;
1859
+ description?: string;
1860
+ visibility: "private" | "public";
1861
+ stage: "SANDBOX" | "LIVE";
1862
+ state: string;
1863
+ sources: Array<LiveSource>;
1864
+ };
1865
+
1866
+ /**
1867
+ * A run as it appears in `GET /live/public` — never reveals who owns it or which strategy it runs.
1868
+ */
1869
+ export type PublicLiveRun = {
1870
+ runId: string;
1871
+ name?: string;
1872
+ description?: string;
1873
+ sources: Array<LiveSource>;
1874
+ state: string;
1875
+ createdAtMs: number;
1876
+ };
1877
+
1878
+ export type PublicLiveListResponse = {
1879
+ runs: Array<PublicLiveRun>;
1880
+ _links?: PublicLiveListLinks;
1881
+ };
1882
+
1883
+ /**
1884
+ * Present only when another page exists.
1885
+ */
1886
+ export type PublicLiveListLinks = {
1887
+ next?: PublicLiveNextLink;
1888
+ };
1889
+
1890
+ export type PublicLiveNextLink = {
1891
+ href?: string;
1892
+ };
1893
+
1894
+ /**
1895
+ * One page of a run's recorded signals, oldest first.
1896
+ */
1897
+ export type LiveSignalPage = {
1898
+ signals: Array<LiveSignal>;
1899
+ /**
1900
+ * The oldest moment this run's signals can still be read from. Absent when the run has produced nothing yet. It moves forward over time as older signals are discarded, so a `sinceMs` earlier than this is served from here instead.
1901
+ */
1902
+ availableSinceMs?: number;
1903
+ _links?: PublicLiveListLinks;
1904
+ };
1905
+
1906
+ /**
1907
+ * One signal, in the same shape the real-time signal channel delivers.
1908
+ */
1909
+ export type LiveSignal = {
1910
+ /**
1911
+ * Envelope schema version.
1912
+ */
1913
+ v: number;
1914
+ /**
1915
+ * Stable id for this exact signal — dedupe on it across reconnects or overlapping reads.
1916
+ */
1917
+ signalId: string;
1918
+ runId: string;
1919
+ /**
1920
+ * The stage the run was in when this signal was produced.
1921
+ */
1922
+ stage: "sandbox" | "live";
1923
+ /**
1924
+ * The parameter set in force when this signal was produced.
1925
+ */
1926
+ paramsVersion?: number;
1927
+ type: "hint" | "info" | "marker" | "command";
1928
+ /**
1929
+ * `BUY`/`SELL` for a `hint`, the command name for a `command`, absent otherwise.
1930
+ */
1931
+ kind?: string | null;
1932
+ /**
1933
+ * Market time the signal was produced.
1934
+ */
1935
+ eventTsMs: number;
1936
+ /**
1937
+ * Time it was published — always at or after `eventTsMs`.
1938
+ */
1939
+ emittedAtMs: number;
1940
+ instrument: LiveSignalInstrument;
1941
+ order?: LiveSignalOrder;
1942
+ /**
1943
+ * The signal's own free-form payload.
1944
+ */
1945
+ data?: {
1946
+ [key: string]: unknown;
1947
+ };
1948
+ /**
1949
+ * `true` only for a signal republished to fill a gap in the record.
1950
+ */
1951
+ regenerated?: boolean;
1952
+ /**
1953
+ * Content hash, for checking that two independent deliveries of the same signal agree.
1954
+ */
1955
+ digest: string;
1956
+ };
1957
+
1958
+ export type LiveSignalInstrument = {
1959
+ exchange?: string;
1960
+ segment?: string;
1961
+ /**
1962
+ * Slashed form, e.g. `BTC/USDT`.
1963
+ */
1964
+ symbol?: string;
1965
+ };
1966
+
1967
+ /**
1968
+ * Present only for a `hint`.
1969
+ */
1970
+ export type LiveSignalOrder = {
1971
+ orderKind?: string;
1972
+ price?: string | null;
1973
+ amount?: string | null;
1974
+ stopPrice?: string | null;
1975
+ trailPct?: string | null;
1976
+ } | null;
1977
+
1978
+ export type LiveConnectionToken = {
1979
+ /**
1980
+ * Pass as the `token` field of the WebSocket `connect` command — see the "Live execution" guide.
1981
+ */
1982
+ token: string;
1983
+ expiresAtMs: number;
1984
+ };
1985
+
1986
+ export type LiveParamsUpdateResult = {
1987
+ runId: string;
1988
+ paramsVersion: number;
1989
+ /**
1990
+ * Epoch milliseconds — the earliest moment the new values are guaranteed to be in effect.
1991
+ */
1992
+ effectiveAtMs: number;
1993
+ };
1994
+
1582
1995
  export type AuthenticateData = {
1583
1996
  body?: never;
1584
1997
  path?: never;
@@ -1609,6 +2022,39 @@ export type AuthenticateResponses = {
1609
2022
  export type AuthenticateResponse =
1610
2023
  AuthenticateResponses[keyof AuthenticateResponses];
1611
2024
 
2025
+ export type GetAccountData = {
2026
+ body?: never;
2027
+ path?: never;
2028
+ query?: never;
2029
+ url: "/account";
2030
+ };
2031
+
2032
+ export type GetAccountResponses = {
2033
+ /**
2034
+ * Your account
2035
+ */
2036
+ 200: Account;
2037
+ };
2038
+
2039
+ export type GetAccountResponse = GetAccountResponses[keyof GetAccountResponses];
2040
+
2041
+ export type GetAccountUsageData = {
2042
+ body?: never;
2043
+ path?: never;
2044
+ query?: never;
2045
+ url: "/account/usage";
2046
+ };
2047
+
2048
+ export type GetAccountUsageResponses = {
2049
+ /**
2050
+ * Your current usage
2051
+ */
2052
+ 200: AccountUsage;
2053
+ };
2054
+
2055
+ export type GetAccountUsageResponse =
2056
+ GetAccountUsageResponses[keyof GetAccountUsageResponses];
2057
+
1612
2058
  export type ListExchangesData = {
1613
2059
  body?: never;
1614
2060
  path?: never;
@@ -1846,7 +2292,7 @@ export type ListStrategiesResponse =
1846
2292
 
1847
2293
  export type CompileStrategyData = {
1848
2294
  /**
1849
- * Raw strategy Java source code
2295
+ * Raw strategy source code, Java or QTScript
1850
2296
  */
1851
2297
  body: string;
1852
2298
  path?: never;
@@ -1856,7 +2302,8 @@ export type CompileStrategyData = {
1856
2302
 
1857
2303
  export type CompileStrategyErrors = {
1858
2304
  /**
1859
- * The source is not valid Java; the message carries the compiler diagnostics. Nothing is
2305
+ * The source is not valid; the message carries the diagnostics — the compiler's for Java,
2306
+ * and for QTScript `Line N, Column M:` entries against your own source. Nothing is
1860
2307
  * registered, so there is no id to look up afterwards.
1861
2308
  *
1862
2309
  */
@@ -2027,7 +2474,7 @@ export type GetStrategyCodeResponses = {
2027
2474
  200: {
2028
2475
  strategyId: StrategyId;
2029
2476
  /**
2030
- * Raw strategy Java source code, exactly as registered.
2477
+ * Raw strategy source code (Java or QTScript), exactly as registered.
2031
2478
  */
2032
2479
  code: string;
2033
2480
  };
@@ -2060,7 +2507,9 @@ export type PrepareBacktestData = {
2060
2507
  export type PrepareBacktestErrors = {
2061
2508
  /**
2062
2509
  * Invalid request or parameters. Also returned when `from` is older than the configured
2063
- * lookback window or `to` is in the future. For `exchangeId: user`, also returned when
2510
+ * lookback window or `to` is in the future, or when `type` is `kline` and `cadence` is not
2511
+ * one of the cadences kline data is available at (the message lists them). For
2512
+ * `exchangeId: user`, also returned when
2064
2513
  * the dataset's current upload has not finished ingesting, or `cadence` asks for a finer
2065
2514
  * granularity than the dataset's own discovered cadence (or one that isn't an exact
2066
2515
  * multiple of it), or the requested range exceeds your tier's range limit.
@@ -2157,7 +2606,9 @@ export type ExecuteSweepData = {
2157
2606
 
2158
2607
  export type ExecuteSweepErrors = {
2159
2608
  /**
2160
- * Invalid sweep specification or the expanded grid exceeds the server limit.
2609
+ * Invalid sweep specification, a `type` that cannot be swept yet (`funding`), or the
2610
+ * expanded grid exceeds the server limit.
2611
+ *
2161
2612
  */
2162
2613
  400: ResponseError;
2163
2614
  /**
@@ -2424,7 +2875,9 @@ export type ExecuteBacktestData = {
2424
2875
 
2425
2876
  export type ExecuteBacktestErrors = {
2426
2877
  /**
2427
- * Invalid request or parameters
2878
+ * Invalid request or parameters. Also returned for a `type` that cannot be executed yet
2879
+ * (`funding`); the message names the sources that can.
2880
+ *
2428
2881
  */
2429
2882
  400: ResponseError;
2430
2883
  /**
@@ -2738,6 +3191,12 @@ export type FinalizeDatasetUploadErrors = {
2738
3191
  * The uploaded file exceeds your tier's size limit for a dataset.
2739
3192
  */
2740
3193
  413: ResponseError;
3194
+ /**
3195
+ * Your account's total storage limit (`GET /account`'s `maxTotalStorageBytes`) is
3196
+ * reached or would be exceeded. Delete a dataset to free space, or upgrade.
3197
+ *
3198
+ */
3199
+ 429: ResponseError;
2741
3200
  };
2742
3201
 
2743
3202
  export type FinalizeDatasetUploadError =
@@ -2821,7 +3280,10 @@ export type ImportDatasetErrors = {
2821
3280
  */
2822
3281
  409: ResponseError;
2823
3282
  /**
2824
- * Your tier's dataset count limit is reached. Delete one, or upgrade.
3283
+ * Your tier's dataset count limit is reached, or your account's total storage limit
3284
+ * (`GET /account`'s `maxTotalStorageBytes`) is already reached. Delete a dataset to free
3285
+ * a slot or space, or upgrade.
3286
+ *
2825
3287
  */
2826
3288
  429: ResponseError;
2827
3289
  };
@@ -2875,6 +3337,297 @@ export type GetDatasetImportResponses = {
2875
3337
  export type GetDatasetImportResponse =
2876
3338
  GetDatasetImportResponses[keyof GetDatasetImportResponses];
2877
3339
 
3340
+ export type StopLiveData = {
3341
+ body?: never;
3342
+ path: {
3343
+ /**
3344
+ * The id returned by `POST /strategy`
3345
+ */
3346
+ strategyId: StrategyId;
3347
+ };
3348
+ query?: never;
3349
+ url: "/strategy/{strategyId}/live";
3350
+ };
3351
+
3352
+ export type StopLiveErrors = {
3353
+ /**
3354
+ * You have never started a live run for this strategy.
3355
+ */
3356
+ 404: ResponseError;
3357
+ };
3358
+
3359
+ export type StopLiveError = StopLiveErrors[keyof StopLiveErrors];
3360
+
3361
+ export type StopLiveResponses = {
3362
+ /**
3363
+ * Stop requested (or already stopped) — the run's current state
3364
+ */
3365
+ 200: LiveRun;
3366
+ };
3367
+
3368
+ export type StopLiveResponse = StopLiveResponses[keyof StopLiveResponses];
3369
+
3370
+ export type GetLiveData = {
3371
+ body?: never;
3372
+ path: {
3373
+ /**
3374
+ * The id returned by `POST /strategy`
3375
+ */
3376
+ strategyId: StrategyId;
3377
+ };
3378
+ query?: never;
3379
+ url: "/strategy/{strategyId}/live";
3380
+ };
3381
+
3382
+ export type GetLiveErrors = {
3383
+ /**
3384
+ * You have never started a live run for this strategy.
3385
+ */
3386
+ 404: ResponseError;
3387
+ };
3388
+
3389
+ export type GetLiveError = GetLiveErrors[keyof GetLiveErrors];
3390
+
3391
+ export type GetLiveResponses = {
3392
+ /**
3393
+ * The run's current state
3394
+ */
3395
+ 200: LiveRun;
3396
+ };
3397
+
3398
+ export type GetLiveResponse = GetLiveResponses[keyof GetLiveResponses];
3399
+
3400
+ export type StartLiveData = {
3401
+ body: StartLiveRequest;
3402
+ path: {
3403
+ /**
3404
+ * The id returned by `POST /strategy`
3405
+ */
3406
+ strategyId: StrategyId;
3407
+ };
3408
+ query?: never;
3409
+ url: "/strategy/{strategyId}/live";
3410
+ };
3411
+
3412
+ export type StartLiveErrors = {
3413
+ /**
3414
+ * Malformed `sources` (not exactly one entry, missing field, unsupported `type`), or an invalid `visibility`.
3415
+ */
3416
+ 400: ResponseError;
3417
+ /**
3418
+ * No such registered strategy for this user, or it has never been compiled.
3419
+ */
3420
+ 404: ResponseError;
3421
+ /**
3422
+ * A run for this strategy is already active. Stop it first.
3423
+ */
3424
+ 409: ResponseError;
3425
+ /**
3426
+ * Your plan does not include live runs, would exceed your concurrent-run or
3427
+ * instrument-count limit, or the platform is at capacity right now. Carries a
3428
+ * `Retry-After` header.
3429
+ *
3430
+ */
3431
+ 429: ResponseError;
3432
+ };
3433
+
3434
+ export type StartLiveError = StartLiveErrors[keyof StartLiveErrors];
3435
+
3436
+ export type StartLiveResponses = {
3437
+ /**
3438
+ * Started — the run's own state, in the sandbox stage
3439
+ */
3440
+ 201: LiveRun;
3441
+ };
3442
+
3443
+ export type StartLiveResponse = StartLiveResponses[keyof StartLiveResponses];
3444
+
3445
+ export type ListPublicLiveData = {
3446
+ body?: never;
3447
+ path?: never;
3448
+ query?: {
3449
+ /**
3450
+ * The `runId` from a previous page's `_links.next.href`. Omit for the first page.
3451
+ */
3452
+ cursor?: string;
3453
+ /**
3454
+ * Page size. Larger values are capped, not rejected.
3455
+ */
3456
+ limit?: number;
3457
+ };
3458
+ url: "/live/public";
3459
+ };
3460
+
3461
+ export type ListPublicLiveErrors = {
3462
+ /**
3463
+ * An invalid `cursor` or `limit`.
3464
+ */
3465
+ 400: ResponseError;
3466
+ };
3467
+
3468
+ export type ListPublicLiveError =
3469
+ ListPublicLiveErrors[keyof ListPublicLiveErrors];
3470
+
3471
+ export type ListPublicLiveResponses = {
3472
+ /**
3473
+ * A page of public runs
3474
+ */
3475
+ 200: PublicLiveListResponse;
3476
+ };
3477
+
3478
+ export type ListPublicLiveResponse =
3479
+ ListPublicLiveResponses[keyof ListPublicLiveResponses];
3480
+
3481
+ export type UpdateLiveData = {
3482
+ body?: UpdateLiveRequest;
3483
+ path: {
3484
+ /**
3485
+ * The `runId` from `POST`/`GET`/`DELETE` `.../live` or from `GET /live/public`
3486
+ */
3487
+ runId: string;
3488
+ };
3489
+ query?: never;
3490
+ url: "/live/{runId}";
3491
+ };
3492
+
3493
+ export type UpdateLiveErrors = {
3494
+ /**
3495
+ * `visibility` present but not `private`/`public`.
3496
+ */
3497
+ 400: ResponseError;
3498
+ /**
3499
+ * No such run, or you do not own it — the two look identical on purpose.
3500
+ */
3501
+ 404: ResponseError;
3502
+ };
3503
+
3504
+ export type UpdateLiveError = UpdateLiveErrors[keyof UpdateLiveErrors];
3505
+
3506
+ export type UpdateLiveResponses = {
3507
+ /**
3508
+ * Updated
3509
+ */
3510
+ 200: LiveRunCompact;
3511
+ };
3512
+
3513
+ export type UpdateLiveResponse = UpdateLiveResponses[keyof UpdateLiveResponses];
3514
+
3515
+ export type UpdateLiveParamsData = {
3516
+ body: UpdateLiveParamsRequest;
3517
+ path: {
3518
+ runId: string;
3519
+ };
3520
+ query?: never;
3521
+ url: "/live/{runId}/params";
3522
+ };
3523
+
3524
+ export type UpdateLiveParamsErrors = {
3525
+ /**
3526
+ * `params` missing, not an object, empty, or contains a key your strategy does not declare.
3527
+ */
3528
+ 400: ResponseError;
3529
+ /**
3530
+ * No such run, or you do not own it.
3531
+ */
3532
+ 404: ResponseError;
3533
+ /**
3534
+ * This run's compilation has no declared properties on record — recompile the strategy to enable runtime parameter updates.
3535
+ */
3536
+ 409: ResponseError;
3537
+ };
3538
+
3539
+ export type UpdateLiveParamsError =
3540
+ UpdateLiveParamsErrors[keyof UpdateLiveParamsErrors];
3541
+
3542
+ export type UpdateLiveParamsResponses = {
3543
+ /**
3544
+ * Accepted
3545
+ */
3546
+ 200: LiveParamsUpdateResult;
3547
+ };
3548
+
3549
+ export type UpdateLiveParamsResponse =
3550
+ UpdateLiveParamsResponses[keyof UpdateLiveParamsResponses];
3551
+
3552
+ export type GetLiveRunSignalsData = {
3553
+ body?: never;
3554
+ path: {
3555
+ /**
3556
+ * The run whose signals to read.
3557
+ */
3558
+ runId: string;
3559
+ };
3560
+ query?: {
3561
+ /**
3562
+ * Start from this moment (epoch ms). Omitted, or older than the available window, starts at `availableSinceMs`. Ignored when `cursor` is given.
3563
+ */
3564
+ sinceMs?: number;
3565
+ /**
3566
+ * Narrow to one or more instruments. Omitted, or `*`, returns every instrument the run
3567
+ * covers. Accepts a single pair (`BTC/USDT`), either half as a wildcard (`*USDT` for any
3568
+ * base against that quote, `BTC*` for that base against any quote), or a comma-separated
3569
+ * list of pairs (`BTC/USDT,ETH/EUR`). Symbols are matched exactly, case included — pass
3570
+ * them as this API reports them.
3571
+ *
3572
+ */
3573
+ instrument?: string;
3574
+ /**
3575
+ * Continue from a previous page's `_links.next`. Takes precedence over `sinceMs`.
3576
+ */
3577
+ cursor?: string;
3578
+ /**
3579
+ * Page size.
3580
+ */
3581
+ limit?: number;
3582
+ };
3583
+ url: "/live/{runId}/signals";
3584
+ };
3585
+
3586
+ export type GetLiveRunSignalsErrors = {
3587
+ /**
3588
+ * `instrument`, `sinceMs`, `limit` or `cursor` is malformed.
3589
+ */
3590
+ 400: ResponseError;
3591
+ /**
3592
+ * No such run, or not one you may read.
3593
+ */
3594
+ 404: ResponseError;
3595
+ /**
3596
+ * The cursor's position is no longer available — restart from the `availableSinceMs` named in the message.
3597
+ */
3598
+ 410: ResponseError;
3599
+ };
3600
+
3601
+ export type GetLiveRunSignalsError =
3602
+ GetLiveRunSignalsErrors[keyof GetLiveRunSignalsErrors];
3603
+
3604
+ export type GetLiveRunSignalsResponses = {
3605
+ /**
3606
+ * One page of signals
3607
+ */
3608
+ 200: LiveSignalPage;
3609
+ };
3610
+
3611
+ export type GetLiveRunSignalsResponse =
3612
+ GetLiveRunSignalsResponses[keyof GetLiveRunSignalsResponses];
3613
+
3614
+ export type MintLiveConnectionTokenData = {
3615
+ body?: never;
3616
+ path?: never;
3617
+ query?: never;
3618
+ url: "/live/token";
3619
+ };
3620
+
3621
+ export type MintLiveConnectionTokenResponses = {
3622
+ /**
3623
+ * Token minted
3624
+ */
3625
+ 200: LiveConnectionToken;
3626
+ };
3627
+
3628
+ export type MintLiveConnectionTokenResponse =
3629
+ MintLiveConnectionTokenResponses[keyof MintLiveConnectionTokenResponses];
3630
+
2878
3631
  export type ClientOptions = {
2879
3632
  baseUrl:
2880
3633
  | "https://api.qtsurfer.net/v1"