curl --request POST \
--url https://quantura.studio/api/v1/admin/sagemaker/datasets \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "SPY Canvas forecast",
"ticker": "SPY",
"csv": "date,P01,P50,P99\n2026-10-29,80,100,120\n"
}
'import requests
url = "https://quantura.studio/api/v1/admin/sagemaker/datasets"
payload = {
"name": "SPY Canvas forecast",
"ticker": "SPY",
"csv": "date,P01,P50,P99
2026-10-29,80,100,120
"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'SPY Canvas forecast',
ticker: 'SPY',
csv: 'date,P01,P50,P99\n2026-10-29,80,100,120\n'
})
};
fetch('https://quantura.studio/api/v1/admin/sagemaker/datasets', 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://quantura.studio/api/v1/admin/sagemaker/datasets",
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' => 'SPY Canvas forecast',
'ticker' => 'SPY',
'csv' => 'date,P01,P50,P99
2026-10-29,80,100,120
'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://quantura.studio/api/v1/admin/sagemaker/datasets"
payload := strings.NewReader("{\n \"name\": \"SPY Canvas forecast\",\n \"ticker\": \"SPY\",\n \"csv\": \"date,P01,P50,P99\\n2026-10-29,80,100,120\\n\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://quantura.studio/api/v1/admin/sagemaker/datasets")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"SPY Canvas forecast\",\n \"ticker\": \"SPY\",\n \"csv\": \"date,P01,P50,P99\\n2026-10-29,80,100,120\\n\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://quantura.studio/api/v1/admin/sagemaker/datasets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"SPY Canvas forecast\",\n \"ticker\": \"SPY\",\n \"csv\": \"date,P01,P50,P99\\n2026-10-29,80,100,120\\n\"\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"item": {
"id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"kind": "forecast",
"ticker": "SPY"
},
"commit": "verified-commit-sha",
"url": "/historical-data?sagemakerForecastId=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
}{
"ok": false,
"error": "api_key_missing"
}{
"ok": false,
"error": "admin_required"
}{
"ok": false,
"error": "canvas_columns_invalid"
}{
"ok": false,
"error": "canvas_github_unavailable"
}publish Admin Canvas Dataset
Requires a currently verified platform administrator, not an organization administrator or ordinary Pro subscriber. Personal API keys need the explicit sagemaker:publish scope. OAuth calls are checked against current account identity. No broker or training job is started. Creates an atomic Git commit containing source CSV and the shared catalog; the same catalog drives Quantura Search, preview, charting and original CSV download. Other users can access published data. Only upload data you are authorized to share. Saved quantile forecasts remain Download resources, never observations for another forecast.
curl --request POST \
--url https://quantura.studio/api/v1/admin/sagemaker/datasets \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "SPY Canvas forecast",
"ticker": "SPY",
"csv": "date,P01,P50,P99\n2026-10-29,80,100,120\n"
}
'import requests
url = "https://quantura.studio/api/v1/admin/sagemaker/datasets"
payload = {
"name": "SPY Canvas forecast",
"ticker": "SPY",
"csv": "date,P01,P50,P99
2026-10-29,80,100,120
"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'SPY Canvas forecast',
ticker: 'SPY',
csv: 'date,P01,P50,P99\n2026-10-29,80,100,120\n'
})
};
fetch('https://quantura.studio/api/v1/admin/sagemaker/datasets', 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://quantura.studio/api/v1/admin/sagemaker/datasets",
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' => 'SPY Canvas forecast',
'ticker' => 'SPY',
'csv' => 'date,P01,P50,P99
2026-10-29,80,100,120
'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://quantura.studio/api/v1/admin/sagemaker/datasets"
payload := strings.NewReader("{\n \"name\": \"SPY Canvas forecast\",\n \"ticker\": \"SPY\",\n \"csv\": \"date,P01,P50,P99\\n2026-10-29,80,100,120\\n\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://quantura.studio/api/v1/admin/sagemaker/datasets")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"SPY Canvas forecast\",\n \"ticker\": \"SPY\",\n \"csv\": \"date,P01,P50,P99\\n2026-10-29,80,100,120\\n\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://quantura.studio/api/v1/admin/sagemaker/datasets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"SPY Canvas forecast\",\n \"ticker\": \"SPY\",\n \"csv\": \"date,P01,P50,P99\\n2026-10-29,80,100,120\\n\"\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"item": {
"id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"kind": "forecast",
"ticker": "SPY"
},
"commit": "verified-commit-sha",
"url": "/historical-data?sagemakerForecastId=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
}{
"ok": false,
"error": "api_key_missing"
}{
"ok": false,
"error": "admin_required"
}{
"ok": false,
"error": "canvas_columns_invalid"
}{
"ok": false,
"error": "canvas_github_unavailable"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Original CSV contents, at most 3,000,000 UTF-8 bytes. Original quantile columns and source bytes are preserved.
1 - 30000001 - 1201 - 40^[A-Za-z0-9.^=_/-]{1,40}$Show child attributes
Show child attributes
240Response
Shared catalog and CSV committed together
The response is of type object.